import { Body, Controller, Get, Patch, Post, Query, Req, UseGuards } from '@nestjs/common';
import { AuthGuard, type AuthenticatedRequest } from '../../../common/auth/auth.guard';
import { OrganizationContextGuard, type TenantScopedRequest } from '../../../common/auth/organization-context.guard';
import { PermissionGuard } from '../../../common/auth/permission.guard';
import { RequirePermissions } from '../../../common/auth/permissions.decorator';
import { TelemetrySettingsService } from '../application/telemetry-settings.service';
import { ZodValidationPipe } from '../../../common/validation/zod-validation.pipe';
import { telemetrySettingsSchema, telemetrySupportBundlePreviewSchema } from '../../../common/validation/critical-write.schemas';
import { TelemetryDispatchPolicyService } from '../application/telemetry-dispatch-policy.service';
import type { z } from 'zod';
type TelemetrySettingsBody = z.infer<typeof telemetrySettingsSchema>;
type TelemetrySupportBundlePreviewBody = z.infer<typeof telemetrySupportBundlePreviewSchema>;
@Controller('/admin/observability/telemetry')
@UseGuards(AuthGuard, OrganizationContextGuard, PermissionGuard)
@RequirePermissions('telemetry.settings.manage')
export class TelemetrySettingsController {
constructor(private readonly settings: TelemetrySettingsService, private readonly dispatch: TelemetryDispatchPolicyService) {}
@Get()
get(@Req() req: TenantScopedRequest) {
return this.settings.get(req.organizationId!);
}
@Get('/metadata')
metadata() {
return this.settings.describe();
}
@Get('/audit')
audit(@Req() req: TenantScopedRequest, @Query('limit') limit?: string) {
const parsedLimit = limit === undefined ? 25 : Number(limit);
return this.settings.listAudit(req.organizationId!, parsedLimit);
}
@Patch()
update(@Req() req: TenantScopedRequest & AuthenticatedRequest, @Body(new ZodValidationPipe(telemetrySettingsSchema)) body: TelemetrySettingsBody) {
return this.settings.update({organizationId: req.organizationId!, actorUserId: req.auth!.userId, settings: body});
}
@Post('/support-bundle/preview')
async previewSupportBundle(@Req() req: TenantScopedRequest, @Body(new ZodValidationPipe(telemetrySupportBundlePreviewSchema)) body: TelemetrySupportBundlePreviewBody) {
return this.dispatch.previewManualSupportBundle(await this.settings.get(req.organizationId!), body.entries, body.confirmed);
}
}
