import { Body, Controller, Delete, Get, Param, Patch, Post, Query, Req, Res, UseGuards } from '@nestjs/common'; import type { Request } from 'express'; import type { Response } from 'express'; import { AuthenticatedUser } from '../auth/auth.types'; import { ContactsService } from './contacts.service'; import { CreateContactDto } from '../dto/create-contact.dto'; import { UpdateContactDto } from '../dto/update-contact.dto'; import { AuthGuard } from '../common/auth.guard'; @UseGuards(AuthGuard) @Controller('contacts') export class ContactsController { constructor(private readonly contactsService: ContactsService) {} @Get() findAll( @Query('page') page?: string, @Query('limit') limit?: string, @Query('search') search?: string, @Query('status') status?: string, @Query('tag') tag?: string, ) { return this.contactsService.findAll({ page: Number(page || '1'), limit: Number(limit || '10'), search, status, tag, }); } @Get('export') async exportContacts( @Req() request: Request & { user: AuthenticatedUser }, @Res() response: Response, @Query('search') search?: string, @Query('status') status?: string, @Query('tag') tag?: string, ) { const result = await this.contactsService.exportContacts( { page: 1, limit: 100000, search, status, tag, }, request.user, request.ip, ); response.setHeader('Content-Type', result.contentType); response.setHeader('Content-Disposition', `attachment; filename="${result.fileName}"`); response.send(result.buffer); } @Get(':id') findOne(@Param('id') id: string) { return this.contactsService.findOne(id); } @Post() create( @Req() request: Request & { user: AuthenticatedUser }, @Body() dto: CreateContactDto, ) { return this.contactsService.create(dto, request.user, request.ip); } @Patch(':id') update( @Req() request: Request & { user: AuthenticatedUser }, @Param('id') id: string, @Body() dto: UpdateContactDto, ) { return this.contactsService.update(id, dto, request.user, request.ip); } @Delete(':id') remove( @Req() request: Request & { user: AuthenticatedUser }, @Param('id') id: string, ) { return this.contactsService.remove(id, request.user, request.ip); } }