import { DomainConflictError } from '../../../common/errors/domain-conflict.error';
type FloorInput = Record<string, any>;
function object(input: unknown, code: string): asserts input is FloorInput {
if (!input || typeof input !== 'object' || Array.isArray(input)) {
throw new DomainConflictError(code);
}
}
function text(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 optionalText(value: unknown, max: number, code: string): void {
if (value !== undefined && value !== null) text(value, max, code);
}
function safeInteger(value: unknown, min: number, max: number, code: string): void {
if (!Number.isSafeInteger(value) || Number(value) < min || Number(value) > max) {
throw new DomainConflictError(code);
}
}
function scope(input: unknown, code: string): asserts input is FloorInput {
object(input, code);
text(input.organizationId, 200, code);
text(input.locationId, 200, code);
}
function id(value: unknown, code: string): void {
text(value, 200, code);
}
function actor(input: FloorInput, code: string): void {
optionalText(input.actorUserId, 200, code);
}
export function assertCreateAreaInput(input: unknown): asserts input is FloorInput {
const code = 'floor.input_invalid';
scope(input, code);
text(input.name, 250, code);
if (input.sortOrder !== undefined && input.sortOrder !== null) {
safeInteger(input.sortOrder, 0, 10000, code);
}
actor(input, code);
}
export function assertCreateTableInput(input: unknown): asserts input is FloorInput {
const code = 'floor.input_invalid';
scope(input, code);
id(input.areaId, code);
text(input.tableNumber, 100, code);
optionalText(input.displayName, 250, code);
if (input.minCapacity !== undefined && input.minCapacity !== null) {
safeInteger(input.minCapacity, 1, 1000, code);
}
safeInteger(input.maxCapacity, 1, 1000, code);
if (input.minCapacity !== undefined && input.minCapacity !== null && input.minCapacity > input.maxCapacity) {
throw new DomainConflictError(code);
}
actor(input, code);
}
export function assertLinkTablesInput(input: unknown): asserts input is FloorInput {
const code = 'floor.input_invalid';
scope(input, code);
if (!Array.isArray(input.tableIds) || input.tableIds.length < 2 || input.tableIds.length > 50) {
throw new DomainConflictError(code);
}
const ids = new Set<string>();
for (const tableId of input.tableIds) {
id(tableId, code);
if (ids.has(tableId)) throw new DomainConflictError(code);
ids.add(tableId);
}
actor(input, code);
}
