2025-03-08 12:48:18 +01:00

76 lines
2.4 KiB
TypeScript

import { z } from "zod";
import {
createTRPCRouter,
protectedProcedure,
publicProcedure,
} from "@/server/api/trpc";
import { categories } from "@/server/db/schema";
import { count, eq } from "drizzle-orm";
import { hasPermission, Role } from "@/lib/validation/permissions";
import { categorySchema } from "@/lib/validation/zod/category";
import { generateSlug } from "@/lib/utils";
export const categoryRouter = createTRPCRouter({
get: publicProcedure
.input(z.object({ slug: z.string() }))
.query(async ({ ctx, input }) => {
return await ctx.db.query.categories.findFirst({
where: eq(categories.slug, input.slug),
});
}),
getAll: publicProcedure.query(async ({ ctx }) => {
return await ctx.db.query.categories.findMany();
}),
getCount: publicProcedure.query(async ({ ctx }) => {
return (await ctx.db.select({ count: count() }).from(categories))[0]?.count;
}),
create: protectedProcedure
.input(z.object({ category: categorySchema }))
.mutation(async ({ ctx, input }) => {
const isEditor = hasPermission(ctx.session.user.role, Role.EDITOR);
if (!isEditor) {
throw new Error("You are not allowed to create categories");
}
const slug = generateSlug(input.category.name);
return await ctx.db
.insert(categories)
.values({ ...input.category, slug })
.returning({
slug: categories.slug,
});
}),
update: protectedProcedure
.input(z.object({ category: categorySchema, categoryId: z.string() }))
.mutation(async ({ ctx, input }) => {
const isEditor = hasPermission(ctx.session.user.role, Role.EDITOR);
if (!isEditor) {
throw new Error("You are not allowed to update categories");
}
return await ctx.db
.update(categories)
.set(input.category)
.where(eq(categories.id, input.categoryId))
.returning({
id: categories.id,
});
}),
delete: protectedProcedure
.input(z.object({ categoryId: z.string() }))
.mutation(async ({ ctx, input }) => {
const isEditor = hasPermission(ctx.session.user.role, Role.EDITOR);
if (!isEditor) {
throw new Error("You are not allowed to delete articles");
}
return await ctx.db
.delete(categories)
.where(eq(categories.id, input.categoryId))
.returning({
id: categories.id,
});
}),
});