minmon/packages/api/src/routers/services.ts

82 lines
2 KiB
TypeScript

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 };
}),
});