82 lines
2 KiB
TypeScript
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 };
|
|
}),
|
|
});
|