import type PocketBase from "pocketbase"; /** Targeted, repeatable schema addition for task areas. Existing card rows are untouched. */ export async function ensureWorkAreaSchema(pb: PocketBase): Promise { 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; }