import { DomainConflictError } from '../../../common/errors/domain-conflict.error';
type EmployeeInput = Record<string, unknown>;
function assertObject(input: unknown, code: string): asserts input is EmployeeInput {
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) assertText(value, max, code);
}
function assertScope(organizationId: unknown, employeeId: unknown, code: string): void {
assertText(organizationId, 200, code);
assertText(employeeId, 200, code);
}
export function assertEmployeeCreateInput(input: unknown): asserts input is EmployeeInput {
const code = 'employee.input_invalid';
assertObject(input, code);
assertText(input.organizationId, 200, code);
assertText(input.firstName, 200, code);
assertText(input.lastName, 200, code);
assertOptionalText(input.displayName, 250, code);
assertOptionalText(input.employeeNumber, 100, code);
assertOptionalText(input.preferredLocale, 32, code);
}
export function assertEmployeeUpdateInput(
organizationId: unknown,
employeeId: unknown,
patch: unknown,
): asserts patch is EmployeeInput {
const code = 'employee.input_invalid';
assertScope(organizationId, employeeId, code);
assertObject(patch, code);
assertOptionalText(patch.firstName, 200, code);
assertOptionalText(patch.lastName, 200, code);
assertOptionalText(patch.displayName, 250, code);
assertOptionalText(patch.employeeNumber, 100, code);
assertOptionalText(patch.preferredLocale, 32, code);
}
export function assertEmployeeReferenceInput(
organizationId: unknown,
employeeId: unknown,
actorUserId?: unknown,
): void {
const code = 'employee.input_invalid';
assertScope(organizationId, employeeId, code);
assertOptionalText(actorUserId, 200, code);
}
