Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
88 lines
2.4 KiB
TypeScript
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.",
|
|
},
|
|
},
|
|
],
|
|
};
|