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

52 lines
1.9 KiB
TypeScript
Raw Normal View History

import { Result } from "@repo/rdx-utils";
import type { ApplicationConfiguration } from "../domain/application-configuration.aggregate";
2026-10-08 14:43:34 +00:00
import type { ApplicationConfigurationInput } from "../domain/application-configuration-values";
import { ApplicationConfigurationError } from "../domain/application-configuration-values";
2026-10-09 08:38:19 +00:00
import { ApplicationConfigurationValues } from "../domain/value-objects/application-configuration-values.vo";
import type { ApplicationContext } from "./application-configuration.repository";
import { applicationAvailable, applicationReferences } from "./application-configuration-policy";
2026-10-10 10:01:58 +00:00
export function mapApplicationInput(
input: ApplicationConfigurationInput,
context: ApplicationContext,
previous?: ApplicationConfiguration
) {
const parsed = ApplicationConfigurationValues.create(input);
2026-10-10 10:01:58 +00:00
if (!parsed.isSuccess) {
return parsed;
}
const values = parsed.data;
2026-10-10 10:01:58 +00:00
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();
2026-10-10 10:01:58 +00:00
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)
);
2026-10-10 10:01:58 +00:00
if (!values.closed && others.some((item) => item.values.sameTarget(values))) {
return Result.fail(new ApplicationConfigurationError("APPLICATION_ALREADY_OPEN"));
}
2026-10-10 10:01:58 +00:00
return parsed;
}