import type { AccessDefinition } from "../domain/access/access-definition"; import type { ProcessReviewSources } from "./process-review.builder"; type Item = { id: string; values: AccessDefinition }; type Relationship = ProcessReviewSources["relationships"][number]; function memberships( link: Extract, login: string, items: readonly Item[] ): Relationship[] { return items.flatMap((item) => { const m = item.values; if (m.kind !== "membership" || m.accountId !== link.accountId) { return []; } const group = items.find((i) => i.id === m.groupId)?.values; if (group?.kind !== "group") { throw new Error("Grupo de revisión inconsistente."); } const ends = [link.endDate, m.endDate].filter((date): date is string => Boolean(date)).sort(); return [ { id: item.id, kind: "membership", personId: link.personId, label: `${login} · ${group.name}`, endDate: ends[0] ?? null, configuration: m.configuration, }, ]; }); } export function accessReviewRelationships(items: readonly Item[]): Relationship[] { return items.flatMap((item) => { const v = item.values; if (v.kind === "account_person") { const account = items.find((i) => i.id === v.accountId)?.values; if (account?.kind !== "account") { throw new Error("Cuenta de revisión inconsistente."); } return [ { id: item.id, kind: "account", personId: v.personId, label: account.login, endDate: v.endDate, configuration: v.configuration, }, ...memberships(v, account.login, items), ]; } if (v.kind === "need") { const resource = items.find((i) => i.id === v.resourceId)?.values; if (resource?.kind !== "resource") { throw new Error("Recurso de revisión inconsistente."); } return [ { id: item.id, kind: "need", personId: v.personId, label: resource.name, endDate: v.endDate, configuration: null, }, ]; } return []; }); }