1
0
Fork 0
polaris-task-force/src/collections/users/Evaluations.ts
Z8MB1E 15145f613a feat(evaluations): add evaluations collection and migration
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-08-27 18:36:04 -04:00

88 lines
2.4 KiB
TypeScript

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.",
},
},
],
};