ulthar-framework/packages/fabric/domain/models/reference-field.ts

49 lines
1.3 KiB
TypeScript

import { Result, TaggedError } from "@fabric/core";
import type { ReferenceField } from "./fields.ts";
import type { ModelSchema } from "./model-schema.ts";
export function getTargetKey(field: ReferenceField): string {
return field.targetKey || "id";
}
export function validateReferenceField(
schema: ModelSchema,
field: ReferenceField,
): Result<void, InvalidReferenceFieldError> {
if (!schema[field.targetModel]) {
return Result.failWith(
new InvalidReferenceFieldError(
`The target model '${field.targetModel}' is not in the schema.`,
),
);
}
if (field.targetKey && !schema[field.targetModel]!.fields[field.targetKey]) {
return Result.failWith(
new InvalidReferenceFieldError(
`The target key '${field.targetKey}' is not in the target model '${field.targetModel}'.`,
),
);
}
if (
field.targetKey &&
!schema[field.targetModel]!.fields[field.targetKey]!.isUnique
) {
return Result.failWith(
new InvalidReferenceFieldError(
`The target key '${field.targetModel}'.'${field.targetKey}' is not unique.`,
),
);
}
return Result.ok();
}
export class InvalidReferenceFieldError
extends TaggedError<"InvalidReferenceField"> {
constructor(readonly reason: string) {
super("InvalidReferenceField");
}
}