1
0
Fork 0
polaris-task-force/src/collections/intelligence/MissionAttendances.ts
Z8MB1E 653caa8064 feat(rbac): migrate collection access controls to RBAC permissions
Replace legacy isDeveloper/isAdmin/hasRoles checks with
hasPermission/requirePermission across all collections. Add roleDocs
relationship to Users, enlistmentDate to Profiles, and field-level
intel_excerpt permission gate on Profiles. Auto-generated payload-types
updated to reflect the new Roles collection and roleDocs field.
2026-08-19 19:47:51 -04:00

64 lines
1.9 KiB
TypeScript

import { CollectionConfig } from "payload";
import { requirePermission, hasPermission } from "@/utils/access-control/hasPermission";
export const MissionAttendances: CollectionConfig = {
slug: "mission-attendances",
admin: {
group: "Intelligence",
defaultColumns: ["mission", "user", "response"],
},
access: {
read: async ({ req }) => !!req.user,
create: async ({ req, data }) => {
if (!req.user || !data) return false;
return await hasPermission(req.payload, req.user, "mission-attendances:create");
},
update: async ({ req, data, id }) => {
if (!req.user || typeof id !== "number") return false;
if (await hasPermission(req.payload, req.user, "mission-attendances:update")) return true;
const ownerId = typeof data?.user === "object" ? data.user?.id : data?.user;
if (ownerId === req.user.id) return true;
const doc = (await req.payload
.findByID({
collection: "mission-attendances",
id,
depth: 0,
overrideAccess: true,
})
.catch(() => null)) as unknown as { user?: number | { id: number } } | null;
if (!doc) return false;
const docOwner = typeof doc.user === "object" ? doc.user?.id : doc.user;
return docOwner === req.user.id;
},
delete: async ({ req }) => {
return await hasPermission(req.payload, req.user, "mission-attendances:delete");
},
},
fields: [
{
name: "mission",
type: "relationship",
relationTo: "missions",
required: true,
index: true,
},
{
name: "user",
type: "relationship",
relationTo: "users",
required: true,
},
{
name: "response",
type: "select",
required: true,
options: [
{ label: "Yes", value: "yes" },
{ label: "No", value: "no" },
{ label: "Tentative", value: "tentative" },
],
},
],
};