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

30 lines
2.1 KiB
TypeScript

import {Result} from "@repo/rdx-utils";
import type {FolderMapping} from "../domain/folder-mapping.aggregate";
import {FolderMappingError,type FolderMappingInput} from "../domain/folder-mapping-values";
import {FolderMappingValues} from "../domain/value-objects/folder-mapping-values";
import type {FolderContext} from "./folder-mapping.repository";
import {folderAvailable,folderReferences} from "./folder-mapping-policy";
export function mapFolderInput(input:FolderMappingInput,context:FolderContext,previous?:FolderMapping){
const mapped=FolderMappingValues.create(input);if(!mapped.isSuccess){return mapped;}
const values=mapped.data;
if(!folderReferences(values,context)){return Result.fail(new FolderMappingError("FOLDER_SCOPE_MISMATCH"));}
if(previous && !previous.values.sameTarget(values)){return Result.fail(new FolderMappingError("FOLDER_TARGET_IMMUTABLE"));}
const changed= !previous || previous.values.state!==values.state || !previous.values.path.equals(values.path) ||
previous.values.toPrimitive().driveLetter!==values.toPrimitive().driveLetter;
if(["pending","configured"].includes(values.state) && changed && !folderAvailable(values,context)){
return Result.fail(new FolderMappingError("FOLDER_UNAVAILABLE"));
}
const references=folderReferences(values,context);
if(!values.closed && context.mappings.some(item=>{
if(item.id.equals(previous?.id) || item.values.closed || !item.values.profileId.equals(values.profileId)){return false;}
const other=folderReferences(item.values,context);
return item.values.needId.equals(values.needId) || other?.need.resourceId===references?.need.resourceId;
})){return Result.fail(new FolderMappingError("FOLDER_MAPPING_EXISTS"));}
const letter=values.driveLetter.getOrUndefined();
if(!values.closed && letter && context.mappings.some(item=>!item.id.equals(previous?.id) && !item.values.closed &&
item.values.profileId.equals(values.profileId) && item.values.driveLetter.getOrUndefined()?.equals(letter))){
return Result.fail(new FolderMappingError("DRIVE_LETTER_IN_USE"));
}
return mapped;
}