import { Body, Controller, Get, Param, Patch, Query, Req, Res, UseGuards, } from '@nestjs/common'; import type { Response } from 'express'; import { ApiBearerAuth, ApiOperation, ApiTags } from '@nestjs/swagger'; import { LabOrgGuard } from '../../common/guards/lab-org.guard'; import { JwtAuthGuard } from '../auth/guards/jwt-auth.guard'; import { CasesService } from './cases.service'; import { ListLabCasesDto, UpdateLabCaseTaskDto } from './dto/cases.dto'; @ApiTags('cases') @ApiBearerAuth('JWT-auth') @UseGuards(JwtAuthGuard, LabOrgGuard) @Controller('cases') export class CasesController { constructor(private readonly casesService: CasesService) {} @Get() @ApiOperation({ summary: 'List lab cases received by this organization' }) list(@Query() query: ListLabCasesDto, @Req() req) { const organizationId = this.casesService.getOrganizationIdFromUser(req.user); return this.casesService.list(organizationId, req.user.id, query); } @Get('filter-options') @ApiOperation({ summary: 'Clinics and treatment types for inbox filters' }) listFilterOptions(@Req() req) { const organizationId = this.casesService.getOrganizationIdFromUser(req.user); return this.casesService.listFilterOptions(organizationId, req.user.id); } @Get(':id') @ApiOperation({ summary: 'Get one lab case with tasks grouped by tooth' }) getOne(@Param('id') id: string, @Req() req) { const organizationId = this.casesService.getOrganizationIdFromUser(req.user); return this.casesService.getOne(id, organizationId, req.user.id, req.user.language); } @Get(':id/attachments/:attachmentId/file') @ApiOperation({ summary: 'Download an attachment shared with this lab case' }) async downloadAttachment( @Param('id') id: string, @Param('attachmentId') attachmentId: string, @Req() req, @Res() res: Response, ) { const organizationId = this.casesService.getOrganizationIdFromUser(req.user); const file = await this.casesService.streamCaseAttachment( id, attachmentId, organizationId, req.user.id, ); res.setHeader('Content-Type', file.mimeType); res.setHeader('Content-Disposition', `inline; filename="${file.fileName}"`); file.stream.pipe(res); } @Patch(':id/tasks/:taskId') @ApiOperation({ summary: 'Toggle task important flag' }) updateTask( @Param('id') id: string, @Param('taskId') taskId: string, @Body() dto: UpdateLabCaseTaskDto, @Req() req, ) { const organizationId = this.casesService.getOrganizationIdFromUser(req.user); return this.casesService.updateTask(id, taskId, dto, organizationId, req.user.id, req.user.language); } }