30 lines
2.1 KiB
TypeScript
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;
|
||
|
|
}
|