import { DomainConflictError } from '../../../common/errors/domain-conflict.error';
type KnowledgeInput = Record<string, unknown>;
function assertObject(input: unknown, code: string): asserts input is KnowledgeInput {
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);
}
export function assertKnowledgeDraftInput(input: unknown): asserts input is KnowledgeInput {
const code = 'knowledge.input_invalid';
assertObject(input, code);
assertText(input.organizationId, 200, code);
assertText(input.slug, 160, code);
if (!/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(input.slug)) throw new DomainConflictError(code);
assertText(input.title, 300, code);
assertText(input.bodyMarkdown, 200_000, code);
if (input.articleType !== undefined && input.articleType !== null &&
!['sop', 'policy', 'howto', 'reference', 'safety', 'other'].includes(String(input.articleType))) {
throw new DomainConflictError(code);
}
if (input.sourceLocale !== undefined && input.sourceLocale !== null &&
!['de-DE', 'en-GB'].includes(String(input.sourceLocale))) {
throw new DomainConflictError(code);
}
assertOptionalText(input.createdBy, 200, code);
}
export function assertKnowledgePublishInput(organizationId: unknown, versionId: unknown): void {
const code = 'knowledge.input_invalid';
assertText(organizationId, 200, code);
assertText(versionId, 200, code);
}
export function assertKnowledgeAcknowledgeInput(input: unknown): asserts input is KnowledgeInput {
const code = 'knowledge.input_invalid';
assertObject(input, code);
assertText(input.organizationId, 200, code);
assertText(input.articleVersionId, 200, code);
assertText(input.employeeId, 200, code);
if (input.localeShown !== 'de-DE' && input.localeShown !== 'en-GB') throw new DomainConflictError(code);
}
