76 lines
2.4 KiB
TypeScript
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,
|
|
});
|
|
}),
|
|
});
|