41 lines
2 KiB
TypeScript
41 lines
2 KiB
TypeScript
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;
|
|
}
|