34 lines
2.2 KiB
TypeScript
34 lines
2.2 KiB
TypeScript
|
|
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]));
|
||
|
|
}
|