53 lines
1.2 KiB
TypeScript
53 lines
1.2 KiB
TypeScript
import { z } from "zod";
|
|
import { generateUID } from "~/utils/generateUID";
|
|
|
|
import { createTRPCRouter, protectedProcedure } from "~/server/api/trpc";
|
|
|
|
export const labelRouter = createTRPCRouter({
|
|
create: protectedProcedure
|
|
.input(
|
|
z.object({
|
|
name: z.string().min(1).max(36),
|
|
cardPublicId: z.string().min(12),
|
|
colourCode: z.string().length(7),
|
|
}),
|
|
)
|
|
.mutation(async ({ ctx, input }) => {
|
|
const userId = ctx.user?.id;
|
|
|
|
if (!userId) return;
|
|
|
|
const card = await ctx.db
|
|
.from("card")
|
|
.select(`id, list (boardId)`)
|
|
.eq("publicId", input.cardPublicId)
|
|
.is("deletedAt", null)
|
|
.limit(1)
|
|
.single();
|
|
|
|
if (!card.data?.list) return;
|
|
|
|
const newLabel = await ctx.db
|
|
.from("label")
|
|
.insert({
|
|
publicId: generateUID(),
|
|
name: input.name,
|
|
colourCode: input.colourCode,
|
|
createdBy: userId,
|
|
boardId: card.data.list.boardId,
|
|
})
|
|
.select(`id`)
|
|
.limit(1)
|
|
.single();
|
|
|
|
if (!newLabel.data) return;
|
|
|
|
await ctx.db.from("_card_labels").insert({
|
|
cardId: card.data.id,
|
|
labelId: newLabel.data.id,
|
|
});
|
|
|
|
return newLabel.data;
|
|
}),
|
|
});
|