115 lines
4.5 KiB
TypeScript
115 lines
4.5 KiB
TypeScript
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<void> {
|
|
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<void> {
|
|
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<void> {
|
|
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<void> {
|
|
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<void> {
|
|
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<void> {
|
|
const result = await this.mediaService.updateAvatar(driverId, input);
|
|
res.status(HttpStatus.OK).json(result);
|
|
}
|
|
}
|