Files
spq-v2/pb_migrations/1740000000006_technician_self_assignment.js
2026-07-12 10:01:39 -04:00

69 lines
3.1 KiB
JavaScript

/// <reference path="../pb_data/types.d.ts" />
//
// M15 — Widen repairOrders rules for technician viewing and
// technicianAssignments createRule for technician self-assignment.
//
// repairOrders:
// Previously: userId = @request.auth.id (M4 rule)
// Now: userId = @request.auth.id || (userId = @request.auth.shopUserId && @request.auth.role = 'technician')
// This lets technicians list/view their shop's active repair orders.
//
// technicianAssignments:
// Previously: shopUserId = @request.auth.id (M11 rule)
// Now: shopUserId = @request.auth.id || (shopUserId = @request.auth.shopUserId && @request.auth.role = 'technician')
// This lets technicians create assignment records for self-claimed jobs.
migrate(
(db) => {
// ── repairOrders: widen listRule and viewRule ──────────────────────────
const roCol = db.findCollectionByNameOrId('repairOrders');
if (roCol) {
const techRule = "(userId = @request.auth.shopUserId && @request.auth.role = 'technician')";
const current = roCol.listRule;
// Only apply if the widened rule isn't already set (idempotent)
if (current !== 'userId = @request.auth.id' && current?.includes('technician')) {
console.log('[M15] repairOrders already widened — no change');
} else {
roCol.listRule = `userId = @request.auth.id || ${techRule}`;
roCol.viewRule = `userId = @request.auth.id || ${techRule}`;
db.save(roCol);
console.log('[M15] widened repairOrders listRule/viewRule for technician access');
}
} else {
console.warn('[M15] repairOrders collection not found — skipping');
}
// ── technicianAssignments: widen createRule ─────────────────────────────
const taCol = db.findCollectionByNameOrId('technicianAssignments');
if (taCol) {
const techCreateRule = "(shopUserId = @request.auth.shopUserId && @request.auth.role = 'technician')";
const current = taCol.createRule;
if (current !== 'shopUserId = @request.auth.id' && current?.includes('technician')) {
console.log('[M15] technicianAssignments createRule already widened — no change');
} else {
taCol.createRule = `shopUserId = @request.auth.id || ${techCreateRule}`;
db.save(taCol);
console.log('[M15] widened technicianAssignments createRule for technician self-assignment');
}
} else {
console.warn('[M15] technicianAssignments collection not found — skipping');
}
},
(db) => {
// Rollback: restore M4 rules for repairOrders
const roCol = db.findCollectionByNameOrId('repairOrders');
if (roCol) {
roCol.listRule = 'userId = @request.auth.id';
roCol.viewRule = 'userId = @request.auth.id';
db.save(roCol);
}
// Rollback: restore M11 rule for technicianAssignments
const taCol = db.findCollectionByNameOrId('technicianAssignments');
if (taCol) {
taCol.createRule = 'shopUserId = @request.auth.id';
db.save(taCol);
}
}
);