import { db } from "@minmon/db"; import { domain, service } from "@minmon/db"; import { count, desc, eq } from "drizzle-orm"; import { protectedProcedure, router } from "../index"; import { byIdSchema, serviceCreateSchema, serviceListSchema, serviceUpdateSchema, } from "./schemas"; import { createEntityId, requireServer, requireService, stripUndefined, } from "./utils"; export const servicesRouter = router({ list: protectedProcedure.input(serviceListSchema).query(async ({ input }) => { if (!input?.serverId) { return db.select().from(service).orderBy(desc(service.updatedAt)); } await requireServer(input.serverId); return db .select() .from(service) .where(eq(service.serverId, input.serverId)) .orderBy(desc(service.updatedAt)); }), byId: protectedProcedure.input(byIdSchema).query(async ({ input }) => { const item = await requireService(input.id); const [domainCount] = await db.select({ count: count() }).from(domain).where(eq(domain.serviceId, input.id)); return { ...item, summary: { domains: domainCount?.count ?? 0, }, }; }), create: protectedProcedure.input(serviceCreateSchema).mutation(async ({ input }) => { await requireServer(input.serverId); const [created] = await db .insert(service) .values({ id: createEntityId(), ...input, }) .returning(); return created; }), update: protectedProcedure.input(serviceUpdateSchema).mutation(async ({ input }) => { const { id, serverId, ...changes } = input; await requireService(id); if (serverId) { await requireServer(serverId); } const [updated] = await db .update(service) .set(stripUndefined({ serverId, ...changes })) .where(eq(service.id, id)) .returning(); return updated; }), delete: protectedProcedure.input(byIdSchema).mutation(async ({ input }) => { await requireService(input.id); await db.delete(service).where(eq(service.id, input.id)); return { id: input.id }; }), });