2026-10-08 11:48:10 +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;
|
|
|
|
|
})
|
|
|
|
|
);
|
2026-10-05 10:02:04 +00:00
|
|
|
}
|
2026-10-08 11:48:10 +00:00
|
|
|
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))
|
|
|
|
|
);
|
2026-10-05 10:02:04 +00:00
|
|
|
}
|
|
|
|
|
|
2026-10-08 11:48:10 +00:00
|
|
|
export function folderCoverage(context: FolderContext) {
|
|
|
|
|
const current = context.items.filter((item) => {
|
|
|
|
|
const values = item.values.data;
|
|
|
|
|
return !("startDate" in values) || values.startDate <= context.today;
|
2026-10-05 10:02:04 +00:00
|
|
|
});
|
2026-10-08 11:48:10 +00:00
|
|
|
return new Map(
|
|
|
|
|
projectAccess(current, context.people, context.today).coverage.map((item) => [
|
|
|
|
|
item.needId,
|
|
|
|
|
item.covered,
|
|
|
|
|
])
|
|
|
|
|
);
|
2026-10-05 10:02:04 +00:00
|
|
|
}
|