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

79 lines
2.5 KiB
TypeScript
Raw Normal View History

import { projectAccess } from "../domain/access/access-projection";
2026-10-09 08:38:19 +00:00
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";
2026-10-10 10:01:58 +00:00
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;
2026-10-10 10:01:58 +00:00
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;
2026-10-10 10:01:58 +00:00
if (resource?.kind !== "resource") {
return undefined;
}
2026-10-10 10:01:58 +00:00
return { profile, need, resource };
}
2026-10-10 10:01:58 +00:00
function activeReference(context: FolderContext, id: string | null) {
return (
id === null ||
context.items.some((item) => {
const data = item.values.data;
2026-10-10 10:01:58 +00:00
return item.id.toPrimitive() === id && "active" in data && data.active;
})
);
2026-10-05 10:02:04 +00:00
}
2026-10-10 10:01:58 +00:00
export function folderAvailable(values: FolderMappingValues, context: FolderContext) {
const references = folderReferences(values, context);
2026-10-10 10:01:58 +00:00
if (!references) {
return false;
}
const { profile, need, resource } = references;
const current =
resource.reference === null ? undefined : SharedFolderPath.create(resource.reference);
2026-10-10 10:01:58 +00:00
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
}
export function folderCoverage(context: FolderContext) {
const current = context.items.filter((item) => {
const values = item.values.data;
2026-10-10 10:01:58 +00:00
return !("startDate" in values) || values.startDate <= context.today;
2026-10-05 10:02:04 +00:00
});
2026-10-10 10:01:58 +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
}