import { projectAccess } from "../domain/access/access-projection"; import type { FolderMappingValues } from "../domain/value-objects/folder-mapping-values.vo"; import { SharedFolderPath } from "../domain/value-objects/shared-folder-path.vo"; import type { FolderContext } from "./folder-mapping.repository"; export function folderReferences(values: FolderMappingValues, context: FolderContext) { const profile = context.profiles.find((item) => item.id.equals(values.profileId)); const need = context.items.find((item) => item.id.equals(values.needId))?.values.data; if ( !profile || need?.kind !== "need" || profile.values.personId.toPrimitive() !== need.personId ) { return undefined; } const resource = context.items.find((item) => item.id.toPrimitive() === need.resourceId)?.values .data; if (resource?.kind !== "resource") { return undefined; } return { profile, need, resource }; } function activeReference(context: FolderContext, id: string | null) { return ( id === null || context.items.some((item) => { const data = item.values.data; return item.id.toPrimitive() === id && "active" in data && data.active; }) ); } export function folderAvailable(values: FolderMappingValues, context: FolderContext) { const references = folderReferences(values, context); if (!references) { return false; } const { profile, need, resource } = references; const current = resource.reference === null ? undefined : SharedFolderPath.create(resource.reference); return ( profile.values.active && resource.active && need.startDate <= context.today && (need.endDate === null || context.today < need.endDate) && context.people.some((item) => item.id.equals(profile.values.personId) && item.active) && context.assets.some((item) => item.id.equals(profile.values.assetId) && item.available) && current?.isSuccess === true && values.path.equals(current.data) && activeReference(context, resource.resourceTypeId) && activeReference(context, resource.systemId) && activeReference(context, resource.environmentId) && need.permissionIds.every((id) => activeReference(context, id)) ); } export function folderCoverage(context: FolderContext) { const current = context.items.filter((item) => { const values = item.values.data; return !("startDate" in values) || values.startDate <= context.today; }); return new Map( projectAccess(current, context.people, context.today).coverage.map((item) => [ item.needId, item.covered, ]) ); }