feat(plan): add hard-delete for categories (blocked when in use)
DELETE /plan/categories/:id now hard-deletes the row, guarded: refuses when any live entry/override uses the key (suggests hide instead) and keeps >=1 active category. Modal gains a per-row Smazat with inline confirm. Hiding stays via PATCH is_active. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -5,6 +5,7 @@ import {
|
||||
createPlanCategory,
|
||||
updatePlanCategory,
|
||||
deactivatePlanCategory,
|
||||
deletePlanCategory,
|
||||
isCategoryKeyActive,
|
||||
slugifyCategory,
|
||||
} from "../services/planCategory.service";
|
||||
@@ -83,4 +84,46 @@ describe("plan category service", () => {
|
||||
await deactivatePlanCategory(res.data.id);
|
||||
expect(await isCategoryKeyActive("test_deact_zz")).toBe(false);
|
||||
});
|
||||
|
||||
it("hard-deletes an unused category", async () => {
|
||||
const res = await createPlanCategory({
|
||||
label: "Test Del ZZ",
|
||||
color: "#dddddd",
|
||||
});
|
||||
if ("error" in res) throw new Error(res.error);
|
||||
const del = await deletePlanCategory(res.data.id);
|
||||
expect("data" in del).toBe(true);
|
||||
const stillThere = await prisma.plan_categories.findUnique({
|
||||
where: { id: res.data.id },
|
||||
});
|
||||
expect(stillThere).toBeNull();
|
||||
});
|
||||
|
||||
it("refuses to hard-delete a category in use", async () => {
|
||||
const res = await createPlanCategory({
|
||||
label: "Test InUse ZZ",
|
||||
color: "#eeeeee",
|
||||
});
|
||||
if ("error" in res) throw new Error(res.error);
|
||||
created.push(res.data.id);
|
||||
const user = await prisma.users.findFirst({ select: { id: true } });
|
||||
if (!user) throw new Error("no user in test DB");
|
||||
const entry = await prisma.work_plan_entries.create({
|
||||
data: {
|
||||
user_id: user.id,
|
||||
date_from: new Date("2026-06-10T00:00:00.000Z"),
|
||||
date_to: new Date("2026-06-10T00:00:00.000Z"),
|
||||
category: res.data.key,
|
||||
note: "test in-use",
|
||||
created_by: user.id,
|
||||
},
|
||||
});
|
||||
try {
|
||||
const del = await deletePlanCategory(res.data.id);
|
||||
expect("error" in del).toBe(true);
|
||||
if ("error" in del) expect(del.status).toBe(409);
|
||||
} finally {
|
||||
await prisma.work_plan_entries.delete({ where: { id: entry.id } });
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user