kanban-dev-webapp/scripts/work-area-schema.ts

42 lines
2 KiB
TypeScript
Raw Permalink Normal View History

import type PocketBase from "pocketbase";
/** Targeted, repeatable schema addition for task areas. Existing card rows are untouched. */
export async function ensureWorkAreaSchema(pb: PocketBase): Promise<string[]> {
const changed: string[] = [];
const projects = await pb.collections.getOne("projects");
let areas = await pb.collections.getOne("work_areas").catch(() => null);
if (!areas) {
areas = await pb.collections.create({
name: "work_areas",
type: "base",
listRule: '@request.auth.id != "" && (@request.auth.role = "owner" || project.client = @request.auth.client)',
viewRule: '@request.auth.id != "" && (@request.auth.role = "owner" || project.client = @request.auth.client)',
createRule: '@request.auth.role = "owner"',
updateRule: '@request.auth.role = "owner"',
deleteRule: '@request.auth.role = "owner"',
fields: [
{ name: "project", type: "relation", required: true, collectionId: projects.id, maxSelect: 1, cascadeDelete: true },
{ name: "name", type: "text", required: true, max: 80, presentable: true },
{ name: "color", type: "text", required: true, max: 20 },
{ name: "created", type: "autodate", onCreate: true, onUpdate: false },
{ name: "updated", type: "autodate", onCreate: true, onUpdate: true },
],
indexes: ["CREATE UNIQUE INDEX idx_work_areas_project_name ON work_areas (project, lower(name))"],
});
changed.push("work_areas collection");
}
if (!areas) throw new Error("Could not create work_areas");
const cards = await pb.collections.getOne("cards");
if (!cards.fields.some((field: { name: string }) => field.name === "work_area")) {
await pb.collections.update(cards.id, {
fields: [...(cards.fields as unknown[]), {
name: "work_area", type: "relation", required: false,
collectionId: areas.id, maxSelect: 1, cascadeDelete: false,
}],
});
changed.push("cards.work_area field");
}
return changed;
}