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.
64 lines
1.9 KiB
TypeScript
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" },
|
|
],
|
|
},
|
|
],
|
|
};
|