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; }