import { DomainConflictError } from '../../../common/errors/domain-conflict.error';
type BriefingInput = Record<string, unknown>;
function assertObject(input: unknown, code: string): asserts input is BriefingInput {
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 assertDate(value: unknown, code: string): void {
assertText(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);
}
export function assertBriefingDraftInput(input: unknown): asserts input is BriefingInput {
const code = 'briefing.input_invalid';
assertObject(input, code);
assertText(input.organizationId, 200, code);
assertText(input.locationId, 200, code);
assertDate(input.businessDate, code);
assertText(input.title, 300, code);
assertText(input.body, 20_000, code);
assertText(input.sourceLocale, 32, code);
assertOptionalText(input.createdBy, 200, code);
}
export function assertBriefingPublishInput(organizationId: unknown, briefingId: unknown): void {
const code = 'briefing.input_invalid';
assertText(organizationId, 200, code);
assertText(briefingId, 200, code);
}
export function assertBriefingAcknowledgeInput(input: unknown): asserts input is BriefingInput {
const code = 'briefing.input_invalid';
assertObject(input, code);
assertText(input.organizationId, 200, code);
assertText(input.briefingId, 200, code);
assertText(input.employeeId, 200, code);
assertText(input.localeShown, 32, code);
}
