import { Body, Controller, Delete, Get, Patch, Post, Put, Req } from '@nestjs/common'; import type { Request } from 'express'; import { AdminAuthService } from './admin-auth.service'; import { Public } from './decorators/admin-auth.decorators'; import { AdminLoginDto, ChangeAdminPasswordDto } from './dto'; @Controller('auth/admin') export class AdminAuthController { constructor(private readonly adminAuthService: AdminAuthService) {} @Get('me') me(@Req() request: { admin?: { id: string } }) { return this.adminAuthService.me(request.admin!.id); } @Put('avatar') async updateAvatar(@Req() request: Request & { admin?: { id: string } }) { const mimeType = String(request.headers['content-type'] ?? '').split(';')[0].trim().toLowerCase(); const imageData = await readRequestBody(request); return this.adminAuthService.updateAvatar(request.admin!.id, imageData, mimeType); } @Delete('avatar') deleteAvatar(@Req() request: { admin?: { id: string } }) { return this.adminAuthService.deleteAvatar(request.admin!.id); } @Patch('password') changePassword( @Req() request: { admin?: { id: string } }, @Body() body: ChangeAdminPasswordDto, ) { return this.adminAuthService.changePassword(request.admin!.id, body); } @Public() @Post('login') login( @Body() body: AdminLoginDto, @Req() request: { ip?: string; headers: Record }, ) { const userAgent = request.headers['user-agent']; return this.adminAuthService.login(body, { ipAddress: request.ip, userAgent: Array.isArray(userAgent) ? userAgent.join(', ') : userAgent, }); } } function readRequestBody(request: Request) { return new Promise((resolve, reject) => { const chunks: Buffer[] = []; request.on('data', (chunk: Buffer | string) => { chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)); }); request.on('end', () => resolve(Buffer.concat(chunks))); request.on('error', reject); }); }