metis-desk/modules/companies/src/api/application/folder-mapping-policy.ts

34 lines
2.2 KiB
TypeScript
Raw Normal View History

2026-10-05 10:02:04 +00:00
import {projectAccess} from "../domain/access/access-projection";
import type {FolderMappingValues} from "../domain/value-objects/folder-mapping-values";
import {SharedFolderPath} from "../domain/value-objects/shared-folder-path";
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]));
}