import { DomainConflictError } from '../../../common/errors/domain-conflict.error';
type FileInput = Record<string, any>;
function object(input: unknown, code: string): asserts input is FileInput {
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 && (typeof value !== 'string' || value.length > max)) throw new DomainConflictError(code);
}
function scope(input: unknown, code: string, locationRequired = false): asserts input is FileInput {
object(input, code);
text(input.organizationId, 200, code);
if (locationRequired) text(input.locationId, 200, code);
else optionalText(input.locationId, 200, code);
}
export function assertFileUploadSessionInput(input: unknown): asserts input is FileInput {
const code = 'files.input_invalid';
scope(input, code);
optionalText(input.userId, 200, code);
optionalText(input.ownerEntityType, 100, code);
optionalText(input.ownerEntityId, 200, code);
if (!['recipe_media','training_media','task_evidence','incident_evidence','safety_evidence','employee_document','supplier_document','invoice_document','import_source','export_result','other'].includes(String(input.purpose))) throw new DomainConflictError(code);
text(input.fileName, 255, code);
text(input.mimeType, 255, code);
if (!Number.isSafeInteger(input.sizeBytes) || input.sizeBytes < 0 || input.sizeBytes > 500 * 1024 * 1024) throw new DomainConflictError(code);
if (input.checksumSha256 !== undefined && input.checksumSha256 !== null && (typeof input.checksumSha256 !== 'string' || !/^[a-f0-9]{64}$/i.test(input.checksumSha256))) throw new DomainConflictError(code);
}
export function assertFileCompleteInput(input: unknown): asserts input is FileInput {
const code = 'files.input_invalid';
scope(input, code);
text(input.uploadSessionId, 200, code);
}
export function assertFileAccessInput(input: unknown): asserts input is FileInput {
const code = 'files.input_invalid';
scope(input, code);
text(input.fileAssetId, 200, code);
text(input.userId, 200, code);
}
export function assertFileVerifyInput(input: unknown): asserts input is FileInput {
const code = 'files.input_invalid';
scope(input, code, true);
text(input.fileAssetId, 200, code);
}
export function assertFileStorageInput(input: unknown): asserts input is FileInput {
object(input, 'files.input_invalid');
text(input.key, 500, 'files.input_invalid');
text(input.contentType, 255, 'files.input_invalid');
optionalText(input.fileName, 255, 'files.input_invalid');
if (input.expiresSeconds !== undefined && (!Number.isSafeInteger(input.expiresSeconds) || input.expiresSeconds < 1 || input.expiresSeconds > 3600)) throw new DomainConflictError('files.input_invalid');
}
