import { BadRequestException, Body, Controller, Delete, Get, Param, Patch, Post, Query, Res, StreamableFile, UploadedFile, UseGuards, UseInterceptors, } from '@nestjs/common'; import { FileInterceptor } from '@nestjs/platform-express'; import { memoryStorage } from 'multer'; import type { Response } from 'express'; import { JwtAuthGuard } from '../auth/jwt-auth.guard'; import { CurrentUser } from '../auth/current-user.decorator'; import type { Actor } from '../common/record-scope'; import { ActivitiesService } from './activities.service'; import { ActivitiesExcelService } from './activities-excel.service'; import { CreateActivityDto, ImportActivityRowsDto, ListActivitiesQueryDto, UpdateActivityDto, } from './dto'; import { brand } from '@mento/shared'; const excelUpload = FileInterceptor('file', { storage: memoryStorage(), limits: { fileSize: 15_000_000 }, }); @Controller('activities') @UseGuards(JwtAuthGuard) export class ActivitiesController { constructor( private readonly activitiesService: ActivitiesService, private readonly excelService: ActivitiesExcelService, ) {} @Get('summary') summary(@CurrentUser() user: Actor) { return this.activitiesService.summary(user.organizationId, user); } @Get() list( @CurrentUser() user: Actor, @Query() query: ListActivitiesQueryDto, ) { return this.activitiesService.list( user.organizationId, user, query.filter ?? 'today', query.q, query.page ?? 1, query.limit ?? 50, { personId: query.personId, companyId: query.companyId, dealId: query.dealId, }, { from: query.from, to: query.to, }, query.desk, { type: query.type, status: query.status, assigneeId: query.assigneeId, }, ); } @Get('export') async export( @CurrentUser() user: Actor, @Res({ passthrough: true }) res: Response, ) { const buffer = await this.excelService.export(user); res.set({ 'Content-Type': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'Content-Disposition': `attachment; filename="${brand.filePrefix}-activities.xlsx"`, }); return new StreamableFile(buffer); } @Post('import/preview') @UseInterceptors(excelUpload) importPreview(@UploadedFile() file?: Express.Multer.File) { if (!file?.buffer?.length) { throw new BadRequestException('فایل ارسال نشده'); } return this.excelService.preview(file); } @Post('import/prepare') @UseInterceptors(excelUpload) importPrepare( @CurrentUser() user: Actor, @UploadedFile() file?: Express.Multer.File, @Body('mapping') mapping?: string, ) { if (!file?.buffer?.length) { throw new BadRequestException('فایل ارسال نشده'); } return this.excelService.prepare(user, file, mapping); } @Get('import/prepare/:sessionId') importPrepareStatus( @CurrentUser() user: Actor, @Param('sessionId') sessionId: string, ) { return this.excelService.prepareStatus(user, sessionId); } @Post('import/rows') importRows( @CurrentUser() user: Actor, @Body() dto: ImportActivityRowsDto, ) { return this.excelService.importRows(user, dto); } @Post('import') @UseInterceptors(excelUpload) import( @CurrentUser() user: Actor, @UploadedFile() file?: Express.Multer.File, @Body('mapping') mapping?: string, @Body('sessionId') sessionId?: string, @Body('offset') offset?: string, @Body('limit') limit?: string, ) { if (!file?.buffer?.length && !sessionId) { throw new BadRequestException('فایل ارسال نشده'); } return this.excelService.import(user, file, mapping, { sessionId, offset, limit, }); } @Get(':id') get(@CurrentUser() user: Actor, @Param('id') id: string) { return this.activitiesService.get(user.organizationId, id, user); } @Post() create(@CurrentUser() user: Actor, @Body() dto: CreateActivityDto) { return this.activitiesService.create( user.organizationId, user.userId, dto, user, ); } @Patch(':id') update( @CurrentUser() user: Actor, @Param('id') id: string, @Body() dto: UpdateActivityDto, ) { return this.activitiesService.update(user.organizationId, id, user, dto); } @Patch(':id/complete') complete(@CurrentUser() user: Actor, @Param('id') id: string) { return this.activitiesService.complete(user.organizationId, id, user); } @Delete(':id') async remove(@CurrentUser() user: Actor, @Param('id') id: string) { await this.activitiesService.remove(user.organizationId, id, user); return { ok: true }; } }