Add extras and options CRUD, add sidebar, add kanban board, udpate packages

This commit is contained in:
2026-01-29 16:18:57 +01:00
parent f9c14ed9fb
commit 507e1b9ee4
28 changed files with 2455 additions and 42 deletions

View File

@ -0,0 +1,27 @@
"use server";
import { revalidatePath } from "next/cache";
import { z } from "zod";
import { COMMISSION_STATUSES } from "@/lib/commissions/kanban";
import { prisma } from "@/lib/prisma"; // adjust to your prisma import
// import { requireAdmin } from "@/lib/auth/requireAdmin"; // recommended if you have it
const schema = z.object({
id: z.string().min(1),
status: z.enum(COMMISSION_STATUSES),
});
export async function updateCommissionRequestStatus(input: z.infer<typeof schema>) {
// await requireAdmin(); // enforce auth/role check here
const { id, status } = schema.parse(input);
await prisma.commissionRequest.update({
where: { id },
data: { status },
});
// revalidate the board page so a refresh always reflects server truth
revalidatePath("/commissions/board");
}

View File

@ -0,0 +1,30 @@
"use server";
import { prisma } from "@/lib/prisma";
import { commissionExtraSchema } from "@/schemas/commissionType";
import { revalidatePath } from "next/cache";
const LIST_PATH = "/commissions/extras";
export async function createCommissionExtra(input: unknown) {
const data = commissionExtraSchema.parse(input);
const created = await prisma.commissionExtra.create({ data });
revalidatePath(LIST_PATH);
return created;
}
export async function updateCommissionExtra(id: string, input: unknown) {
const data = commissionExtraSchema.parse(input);
const updated = await prisma.commissionExtra.update({ where: { id }, data });
revalidatePath(LIST_PATH);
return updated;
}
export async function deleteCommissionExtra(id: string) {
// Optional safety:
// const used = await prisma.commissionTypeExtra.count({ where: { extraId: id } });
// if (used > 0) throw new Error("Extra is linked to types.");
console.log("TBD");
// await prisma.commissionExtra.delete({ where: { id } });
// revalidatePath(LIST_PATH);
}

View File

@ -0,0 +1,45 @@
"use server";
import { prisma } from "@/lib/prisma";
import { commissionOptionSchema } from "@/schemas/commissionType";
import { revalidatePath } from "next/cache";
const LIST_PATH = "/commissions/options";
function toInt(v: string) {
const n = Number.parseInt(v, 10);
return Number.isFinite(n) ? n : 0;
}
export async function createCommissionOption(input: unknown) {
const data = commissionOptionSchema.parse(input);
const created = await prisma.commissionOption.create({
data: {
name: data.name,
description: data.description?.trim() ? data.description : null,
sortIndex: toInt(data.sortIndex),
},
});
revalidatePath(LIST_PATH);
return created;
}
export async function updateCommissionOption(id: string, input: unknown) {
const data = commissionOptionSchema.parse(input);
const updated = await prisma.commissionOption.update({
where: { id },
data: {
name: data.name,
description: data.description?.trim() ? data.description : null,
sortIndex: toInt(data.sortIndex),
},
});
revalidatePath(LIST_PATH);
return updated;
}
export async function deleteCommissionOption(id: string) {
console.log("TBD");
// await prisma.commissionOption.delete({ where: { id } });
// revalidatePath(LIST_PATH);
}