import { DomainConflictError } from '../../../common/errors/domain-conflict.error';
import type { TelemetrySettings } from './telemetry-settings.service';
type TelemetryInputRecord = Record<string, unknown>;
function isRecord(value: unknown): value is TelemetryInputRecord {
return Boolean(value) && typeof value === 'object' && !Array.isArray(value);
}
function assertText(value: unknown, code: string, max = 200): asserts value is string {
if (typeof value !== 'string' || value.trim().length === 0 || value.length > max) {
throw new DomainConflictError(code);
}
}
export function assertTelemetryOrganizationId(organizationId: unknown): asserts organizationId is string {
assertText(organizationId, 'telemetry.input_invalid');
}
export function normalizeTelemetryAuditLimit(requestedLimit: unknown): number {
if (!Number.isSafeInteger(requestedLimit)) {
throw new DomainConflictError('telemetry.input_invalid');
}
return Math.min(Math.max(Number(requestedLimit), 1), 50);
}
export function assertTelemetrySettingsUpdateInput(
input: unknown,
): asserts input is {organizationId: string; actorUserId: string; settings: TelemetrySettings} {
if (!isRecord(input)) throw new DomainConflictError('telemetry.input_invalid');
assertText(input.organizationId, 'telemetry.input_invalid');
assertText(input.actorUserId, 'telemetry.input_invalid');
if (!isRecord(input.settings)) throw new DomainConflictError('telemetry.input_invalid');
for (const key of [
'automaticTechnicalDiagnostics',
'crashReporting',
'performanceTelemetry',
'productWorkflowAnalytics',
'extendedPilotDiagnostics',
'manualSupportBundleUploads',
'pilotMode',
] as const) {
if (typeof input.settings[key] !== 'boolean') {
throw new DomainConflictError('telemetry.input_invalid');
}
}
}
export function isValidTelemetrySettings(value: unknown): value is TelemetrySettings {
if (!isRecord(value)) return false;
return [
'automaticTechnicalDiagnostics',
'crashReporting',
'performanceTelemetry',
'productWorkflowAnalytics',
'extendedPilotDiagnostics',
'manualSupportBundleUploads',
'pilotMode',
].every((key) => typeof value[key] === 'boolean');
}
