import { Result } from "@repo/rdx-utils"; import type { ApplicationConfiguration } from "../domain/application-configuration.aggregate"; import type { ApplicationConfigurationInput } from "../domain/application-configuration-values"; import { ApplicationConfigurationError } from "../domain/application-configuration-values"; import { ApplicationConfigurationValues } from "../domain/value-objects/application-configuration-values.vo"; import type { ApplicationContext } from "./application-configuration.repository"; import { applicationAvailable, applicationReferences } from "./application-configuration-policy"; export function mapApplicationInput( input: ApplicationConfigurationInput, context: ApplicationContext, previous?: ApplicationConfiguration ) { const parsed = ApplicationConfigurationValues.create(input); if (!parsed.isSuccess) { return parsed; } const values = parsed.data; if (previous && !previous.values.sameTarget(values)) { return Result.fail(new ApplicationConfigurationError("APPLICATION_TARGET_IMMUTABLE")); } if (!applicationReferences(values, context)) { return Result.fail(new ApplicationConfigurationError("APPLICATION_REFERENCE_NOT_FOUND")); } const reconfiguring = !previous || previous.values.state !== values.state || previous.values.delivery !== values.delivery || previous.values.version.getOrUndefined() !== values.version.getOrUndefined(); if ( ["pending", "configured"].includes(values.state) && reconfiguring && !applicationAvailable(values, context) ) { return Result.fail(new ApplicationConfigurationError("APPLICATION_REFERENCE_UNAVAILABLE")); } const others = context.configurations.filter( (item) => !(item.id.equals(previous?.id) || item.values.closed) ); if (!values.closed && others.some((item) => item.values.sameTarget(values))) { return Result.fail(new ApplicationConfigurationError("APPLICATION_ALREADY_OPEN")); } return parsed; }