Openstatus www.openstatus.dev
at main 77 lines 2.1 kB view raw
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});