import { Body, Controller, Get, Param, Patch, Post, Query, UseGuards } from '@nestjs/common'; import { ApiBearerAuth, ApiTags } from '@nestjs/swagger'; import { RequirePermissions } from '../admin/decorators/require-permissions.decorator'; import { AdminJwtAuthGuard } from '../admin/guards/admin-jwt-auth.guard'; import { PermissionsGuard } from '../admin/guards/permissions.guard'; import { CreateDramaDto } from './dto/create-drama.dto'; import { CreateEpisodeDto } from './dto/create-episode.dto'; import { DramasService } from './dramas.service'; import { PublishStatus } from './drama-status.enum'; @ApiTags('Dramas') @Controller() export class DramasController { constructor(private readonly dramasService: DramasService) {} @Post('/api/admin/v1/dramas') @ApiBearerAuth() @UseGuards(AdminJwtAuthGuard, PermissionsGuard) @RequirePermissions('drama:create') createDrama(@Body() dto: CreateDramaDto) { return this.dramasService.createDrama(dto); } @Get('/api/admin/v1/dramas') @ApiBearerAuth() @UseGuards(AdminJwtAuthGuard, PermissionsGuard) @RequirePermissions('drama:read') listAdminDramas(@Query('page') page?: string, @Query('pageSize') pageSize?: string) { return this.dramasService.listAdminDramas({ page: Number(page) || 1, pageSize: Number(pageSize) || 20, }); } @Post('/api/admin/v1/episodes') @ApiBearerAuth() @UseGuards(AdminJwtAuthGuard, PermissionsGuard) @RequirePermissions('episode:create') createEpisode(@Body() dto: CreateEpisodeDto) { return this.dramasService.createEpisode(dto); } @Post('/api/admin/v1/dramas/:id/submit-review') @ApiBearerAuth() @UseGuards(AdminJwtAuthGuard, PermissionsGuard) @RequirePermissions('drama:update') submitReview(@Param('id') id: string) { return this.dramasService.submitReview(Number(id)); } @Patch('/api/admin/v1/episodes/:id/publish-status') @ApiBearerAuth() @UseGuards(AdminJwtAuthGuard, PermissionsGuard) @RequirePermissions('episode:update') updatePublishStatus( @Param('id') id: string, @Body() dto: { publishStatus: PublishStatus }, ) { return this.dramasService.updateEpisodePublishStatus( Number(id), dto.publishStatus, ); } @Get('/api/app/v1/dramas') listPublishedDramas( @Query('page') page?: string, @Query('pageSize') pageSize?: string, ) { return this.dramasService.listPublishedDramas({ page: Number(page) || 1, pageSize: Number(pageSize) || 20, }); } @Get('/api/app/v1/dramas/:id/episodes') listPublishedEpisodes( @Param('id') id: string, @Query('page') page?: string, @Query('pageSize') pageSize?: string, ) { return this.dramasService.listPublishedEpisodes(Number(id), { page: Number(page) || 1, pageSize: Number(pageSize) || 20, }); } }