import { CollectionConfig } from "payload"; import { requirePermission } from "@/utils/access-control/hasPermission"; import { PERFORMANCE_LEVELS } from "@/lib/evaluations/levels"; /** * Leadership evaluations. * * One row per (rater, ratee, mission, kind) — the uniqueness is enforced by the * service layer (`upsertEvaluation` in `src/lib/evaluations`), not by a DB * constraint. * * Privacy model: raw documents are only readable/writable by users holding the * `evaluations:*` permissions (admin/developer via role docs). Normal users never * receive raw rows over REST — the profile UI consumes pre-aggregated, rater-free * output produced by server actions that call the service with explicit RBAC gating. * `rater` and `comment` are private fields and must never be surfaced to normal * users by any read path. */ export const Evaluations: CollectionConfig = { slug: "evaluations", admin: { group: "Users", defaultColumns: ["ratee", "rater", "mission", "kind", "level"], }, access: { read: requirePermission("evaluations:read"), create: requirePermission("evaluations:create"), update: requirePermission("evaluations:update"), delete: requirePermission("evaluations:delete"), }, fields: [ { name: "rater", type: "relationship", relationTo: "users", required: true, admin: { description: "Who submitted this evaluation. Private — only visible to users with evaluations:read.", }, }, { name: "ratee", type: "relationship", relationTo: "users", required: true, }, { name: "mission", type: "relationship", relationTo: "missions", required: true, }, { name: "kind", type: "select", options: [ { label: "Leader (direct)", value: "leader-direct", }, { label: "Leader (indirect)", value: "leader-indirect", }, { label: "Subordinate", value: "subordinate", }, ], required: true, }, { name: "level", type: "select", options: PERFORMANCE_LEVELS.map((l) => ({ label: l.label, value: l.id })), required: true, }, { name: "comment", type: "textarea", admin: { description: "Private free-text note. Never shown to normal users; managers only.", }, }, ], };