Openstatus
www.openstatus.dev
1import { and, eq } from "@openstatus/db";
2import { page, pageSubscriber } from "@openstatus/db/src/schema";
3import { TRPCError } from "@trpc/server";
4import { z } from "zod";
5
6import { createTRPCRouter, protectedProcedure } from "../trpc";
7
8export const pageSubscriberRouter = createTRPCRouter({
9 list: protectedProcedure
10 .input(
11 z.object({
12 pageId: z.number(),
13 order: z.enum(["asc", "desc"]).optional(),
14 }),
15 )
16 .query(async (opts) => {
17 const data = await opts.ctx.db.transaction(async (tx) => {
18 const _page = await tx.query.page.findFirst({
19 where: and(
20 eq(page.workspaceId, opts.ctx.workspace.id),
21 eq(page.id, opts.input.pageId),
22 ),
23 });
24
25 if (!_page) {
26 throw new TRPCError({
27 code: "NOT_FOUND",
28 message: "Page not found",
29 });
30 }
31
32 return await tx.query.pageSubscriber.findMany({
33 where: eq(pageSubscriber.pageId, _page.id),
34 });
35 });
36
37 return data;
38 }),
39
40 delete: protectedProcedure
41 .input(z.object({ id: z.number(), pageId: z.number() }))
42 .mutation(async (opts) => {
43 await opts.ctx.db.transaction(async (tx) => {
44 const _page = await tx.query.page.findFirst({
45 where: and(
46 eq(page.workspaceId, opts.ctx.workspace.id),
47 eq(page.id, opts.input.pageId),
48 ),
49 });
50
51 if (!_page) {
52 throw new TRPCError({
53 code: "NOT_FOUND",
54 message: "Page not found",
55 });
56 }
57
58 const subscriber = await tx.query.pageSubscriber.findFirst({
59 where: and(
60 eq(pageSubscriber.id, opts.input.id),
61 eq(pageSubscriber.pageId, opts.input.pageId),
62 ),
63 });
64
65 if (!subscriber) {
66 throw new TRPCError({
67 code: "NOT_FOUND",
68 message: "Subscriber not found",
69 });
70 }
71
72 return await tx
73 .delete(pageSubscriber)
74 .where(eq(pageSubscriber.id, opts.input.id));
75 });
76 }),
77});