import { Body,Controller,Param,Post,Req,UseGuards } from '@nestjs/common';
import { AuthGuard } from '../../../common/auth/auth.guard';
import { OrganizationContextGuard } from '../../../common/auth/organization-context.guard';
import { LocationContextGuard,type LocationScopedRequest } from '../../../common/auth/location-context.guard';
import { PermissionGuard } from '../../../common/auth/permission.guard';
import { RequirePermissions } from '../../../common/auth/permissions.decorator';
import { ZodValidationPipe } from '../../../common/validation/zod-validation.pipe';
import { briefingAcknowledgeSchema,briefingDraftSchema } from '../../../common/validation/critical-write.schemas';
import { BusinessDateService } from '../../../common/time/business-date.service';
import { BriefingsService } from '../application/briefings.service';
import type { z } from 'zod';
type BriefingDraftBody = z.infer<typeof briefingDraftSchema>;
type BriefingAcknowledgeBody = z.infer<typeof briefingAcknowledgeSchema>;
@Controller('/briefings')
@UseGuards(AuthGuard,OrganizationContextGuard,LocationContextGuard,PermissionGuard)
export class BriefingsController {
constructor(
private readonly briefings:BriefingsService,
private readonly businessDates:BusinessDateService,
) {}
@Post('/draft')
@RequirePermissions('briefings.manage')
async draft(
@Req() req:LocationScopedRequest,
@Body(new ZodValidationPipe(briefingDraftSchema)) body:BriefingDraftBody,
) {
const businessDate=await this.businessDates.forLocation({
organizationId:req.organizationId!,locationId:req.locationId!,
});
return this.briefings.upsertDraft({
organizationId:req.organizationId!,locationId:req.locationId!,businessDate,
title:body.title,body:body.body,
sourceLocale:body.sourceLocale??req.auth?.locale??'de-DE',
createdBy:req.auth?.userId,
});
}
@Post('/:briefingId/publish')
@RequirePermissions('briefings.publish')
publish(@Req() req:LocationScopedRequest,@Param('briefingId') briefingId:string) {
return this.briefings.publish(req.organizationId!,briefingId);
}
@Post('/:briefingId/acknowledge')
@RequirePermissions('briefings.acknowledge')
acknowledge(
@Req() req:LocationScopedRequest,@Param('briefingId') briefingId:string,
@Body(new ZodValidationPipe(briefingAcknowledgeSchema)) body:BriefingAcknowledgeBody,
) {
return this.briefings.acknowledge({
organizationId:req.organizationId!,briefingId,
employeeId:body.employeeId,localeShown:body.localeShown,
});
}
}
