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

79 lines
2 KiB
TypeScript

import { db } from "@minmon/db";
import { note, server } from "@minmon/db";
import { desc, eq } from "drizzle-orm";
import { protectedProcedure, router } from "../index";
import { byIdSchema, noteCreateSchema, noteListSchema, noteUpdateSchema } from "./schemas";
import {
createEntityId,
requireNote,
requireServer,
stripUndefined,
} from "./utils";
export const notesRouter = router({
list: protectedProcedure.input(noteListSchema).query(async ({ input }) => {
if (!input?.serverId) {
return db.select().from(note).orderBy(desc(note.updatedAt));
}
await requireServer(input.serverId);
return db
.select()
.from(note)
.where(eq(note.serverId, input.serverId))
.orderBy(desc(note.updatedAt));
}),
byId: protectedProcedure.input(byIdSchema).query(async ({ input }) => {
return requireNote(input.id);
}),
create: protectedProcedure.input(noteCreateSchema).mutation(async ({ input }) => {
await requireServer(input.serverId);
const [created] = await db
.insert(note)
.values({
id: createEntityId(),
...input,
})
.returning();
return created;
}),
update: protectedProcedure.input(noteUpdateSchema).mutation(async ({ input }) => {
const { id, serverId, ...changes } = input;
await requireNote(id);
if (serverId) {
await requireServer(serverId);
}
const [updated] = await db
.update(note)
.set(stripUndefined({ serverId, ...changes }))
.where(eq(note.id, id))
.returning();
return updated;
}),
delete: protectedProcedure.input(byIdSchema).mutation(async ({ input }) => {
await requireNote(input.id);
await db.delete(note).where(eq(note.id, input.id));
return { id: input.id };
}),
serverOptions: protectedProcedure.query(async () => {
return db
.select({
id: server.id,
name: server.name,
})
.from(server)
.orderBy(desc(server.updatedAt));
}),
});