import { Controller, Post, Get, Delete, Put, Body, HttpStatus, Res, Param, UseInterceptors, UploadedFile } from '@nestjs/common'; import { ApiTags, ApiResponse, ApiOperation, ApiParam, ApiConsumes } from '@nestjs/swagger'; import { Response } from 'express'; import { FileInterceptor } from '@nestjs/platform-express'; import { MediaService } from './MediaService'; import { RequestAvatarGenerationInputDTO } from './dtos/RequestAvatarGenerationInputDTO'; import { RequestAvatarGenerationOutputDTO } from './dtos/RequestAvatarGenerationOutputDTO'; import { UploadMediaInputDTO } from './dtos/UploadMediaInputDTO'; import { UploadMediaOutputDTO } from './dtos/UploadMediaOutputDTO'; import { GetMediaOutputDTO } from './dtos/GetMediaOutputDTO'; import { DeleteMediaOutputDTO } from './dtos/DeleteMediaOutputDTO'; import { GetAvatarOutputDTO } from './dtos/GetAvatarOutputDTO'; import { UpdateAvatarInputDTO } from './dtos/UpdateAvatarInputDTO'; import { UpdateAvatarOutputDTO } from './dtos/UpdateAvatarOutputDTO'; type RequestAvatarGenerationInput = RequestAvatarGenerationInputDTO; type UploadMediaInput = UploadMediaInputDTO; type UpdateAvatarInput = UpdateAvatarInputDTO; @ApiTags('media') @Controller('media') export class MediaController { constructor(private readonly mediaService: MediaService) {} @Post('avatar/generate') @ApiOperation({ summary: 'Request avatar generation' }) @ApiResponse({ status: 201, description: 'Avatar generation request submitted', type: RequestAvatarGenerationOutputDTO }) async requestAvatarGeneration( @Body() input: RequestAvatarGenerationInput, @Res() res: Response, ): Promise { const result = await this.mediaService.requestAvatarGeneration(input); if (result.success) { res.status(HttpStatus.CREATED).json(result); } else { res.status(HttpStatus.BAD_REQUEST).json(result); } } @Post('upload') @UseInterceptors(FileInterceptor('file')) @ApiOperation({ summary: 'Upload media file' }) @ApiConsumes('multipart/form-data') @ApiResponse({ status: 201, description: 'Media uploaded successfully', type: UploadMediaOutputDTO }) async uploadMedia( @UploadedFile() file: Express.Multer.File, @Body() input: UploadMediaInput, @Res() res: Response, ): Promise { const result = await this.mediaService.uploadMedia({ ...input, file }); if (result.success) { res.status(HttpStatus.CREATED).json(result); } else { res.status(HttpStatus.BAD_REQUEST).json(result); } } @Get(':mediaId') @ApiOperation({ summary: 'Get media by ID' }) @ApiParam({ name: 'mediaId', description: 'Media ID' }) @ApiResponse({ status: 200, description: 'Media details', type: GetMediaOutputDTO }) async getMedia( @Param('mediaId') mediaId: string, @Res() res: Response, ): Promise { const result = await this.mediaService.getMedia(mediaId); if (result) { res.status(HttpStatus.OK).json(result); } else { res.status(HttpStatus.NOT_FOUND).json({ error: 'Media not found' }); } } @Delete(':mediaId') @ApiOperation({ summary: 'Delete media by ID' }) @ApiParam({ name: 'mediaId', description: 'Media ID' }) @ApiResponse({ status: 200, description: 'Media deleted', type: DeleteMediaOutputDTO }) async deleteMedia( @Param('mediaId') mediaId: string, @Res() res: Response, ): Promise { const result = await this.mediaService.deleteMedia(mediaId); res.status(HttpStatus.OK).json(result); } @Get('avatar/:driverId') @ApiOperation({ summary: 'Get avatar for driver' }) @ApiParam({ name: 'driverId', description: 'Driver ID' }) @ApiResponse({ status: 200, description: 'Avatar details', type: GetAvatarOutputDTO }) async getAvatar( @Param('driverId') driverId: string, @Res() res: Response, ): Promise { const result = await this.mediaService.getAvatar(driverId); if (result) { res.status(HttpStatus.OK).json(result); } else { res.status(HttpStatus.NOT_FOUND).json({ error: 'Avatar not found' }); } } @Put('avatar/:driverId') @ApiOperation({ summary: 'Update avatar for driver' }) @ApiParam({ name: 'driverId', description: 'Driver ID' }) @ApiResponse({ status: 200, description: 'Avatar updated', type: UpdateAvatarOutputDTO }) async updateAvatar( @Param('driverId') driverId: string, @Body() input: UpdateAvatarInput, @Res() res: Response, ): Promise { const result = await this.mediaService.updateAvatar(driverId, input); res.status(HttpStatus.OK).json(result); } }