import { DomainConflictError } from '../../../common/errors/domain-conflict.error';
type GuestInput = Record<string, unknown>;
function assertObject(input: unknown, code: string): asserts input is GuestInput {
if (!input || typeof input !== 'object' || Array.isArray(input)) throw new DomainConflictError(code);
}
function assertText(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);
}
function assertOptionalText(value: unknown, max: number, code: string): void {
if (value !== undefined && value !== null && (typeof value !== 'string' || value.length > max)) {
throw new DomainConflictError(code);
}
}
export function assertGuestCreateInput(input: unknown): asserts input is GuestInput {
const code = 'guest.input_invalid';
assertObject(input, code);
assertText(input.organizationId, 200, code);
const names = [input.firstName, input.lastName, input.displayName];
if (!names.some(value => typeof value === 'string' && value.trim().length > 0)) {
throw new DomainConflictError(code);
}
for (const value of names) assertOptionalText(value, 250, code);
assertOptionalText(input.email, 320, code);
if (input.email !== undefined && input.email !== null &&
!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(String(input.email))) {
throw new DomainConflictError(code);
}
assertOptionalText(input.phone, 100, code);
assertOptionalText(input.preferredLocale, 32, code);
assertOptionalText(input.notes, 4000, code);
}
export function assertGuestDietaryInput(input: unknown): asserts input is GuestInput {
const code = 'guest.input_invalid';
assertObject(input, code);
assertText(input.organizationId, 200, code);
assertText(input.guestId, 200, code);
assertText(input.note, 1000, code);
assertOptionalText(input.userId, 200, code);
}
