import { DomainConflictError } from '../../../common/errors/domain-conflict.error';
export type ExternalIntegrationInputRecord = Record<string, unknown>;
export function assertExternalIntegrationInputObject(input: unknown, code: string): asserts input is ExternalIntegrationInputRecord {
if (!input || typeof input !== 'object' || Array.isArray(input)) throw new DomainConflictError(code);
}
export function assertExternalIntegrationScope(
input: unknown,
code: string,
options: { locationRequired?: boolean } = {},
): asserts input is ExternalIntegrationInputRecord {
assertExternalIntegrationInputObject(input, code);
assertExternalIntegrationText(input.organizationId, 200, code);
if (options.locationRequired === false) {
if (input.locationId !== undefined && input.locationId !== null) assertExternalIntegrationText(input.locationId, 200, code);
} else {
assertExternalIntegrationText(input.locationId, 200, code);
}
}
export function assertExternalIntegrationText(value: unknown, max: number, code: string): asserts value is string {
if (typeof value !== 'string' || value.trim().length === 0 || value.length > max) {
throw new DomainConflictError(code);
}
}
export function assertOptionalExternalIntegrationText(value: unknown, max: number, code: string): void {
if (value !== undefined && value !== null) assertExternalIntegrationText(value, max, code);
}
export function assertExternalIntegrationRecord(value: unknown, code: string): asserts value is Record<string, unknown> {
if (!value || typeof value !== 'object' || Array.isArray(value)) throw new DomainConflictError(code);
}
export function assertExternalStringRecord(value: unknown, code: string): asserts value is Record<string, string> {
assertExternalIntegrationRecord(value, code);
for (const [key, entry] of Object.entries(value)) {
if (!key.trim() || key.length > 120 || typeof entry !== 'string' || entry.length > 200) {
throw new DomainConflictError(code);
}
}
}
export function assertExternalIntegrationEnum(value: unknown, allowed: readonly string[], code: string): void {
if (typeof value !== 'string' || !allowed.includes(value)) throw new DomainConflictError(code);
}
export function assertExternalIntegrationBoolean(value: unknown, code: string): void {
if (typeof value !== 'boolean') throw new DomainConflictError(code);
}
export function assertExternalIntegrationMoney(value: unknown, code: string): void {
if (typeof value === 'string') {
if (!/^\d+$/.test(value) || value.length > 18) throw new DomainConflictError(code);
return;
}
if (!Number.isSafeInteger(value) || Number(value) < 0) throw new DomainConflictError(code);
}
export function assertExternalIntegrationDate(value: unknown, code: string): asserts value is string {
assertExternalIntegrationText(value, 10, code);
if (!/^\d{4}-\d{2}-\d{2}$/.test(value)) throw new DomainConflictError(code);
const parsed = new Date(`${value}T00:00:00.000Z`);
if (Number.isNaN(parsed.getTime()) || parsed.toISOString().slice(0, 10) !== value) {
throw new DomainConflictError(code);
}
}
