feat: 添加数据分析模块、媒体上传功能与剧集管理完善

本次提交新增了完整的数据分析模块,包括数据同步、指标统计接口;实现了基于BytePlus的直传媒体上传流程,包含上传任务创建、完成、审核同步等功能;同时完善了剧集管理功能,新增了剧集配置、更新接口,扩展了审核状态枚举,补充了剧集与剧集指标的关联逻辑,还添加了播放器对外接口与相关测试用例。
This commit is contained in:
2026-07-01 16:36:06 +08:00
parent 5fa8c5e0a9
commit 026665b2cc
28 changed files with 1437 additions and 20 deletions

View File

@@ -1,10 +1,22 @@
import { Body, Controller, Get, Param, Patch, Post, Query, UseGuards } from '@nestjs/common';
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 { ConfigureEpisodesDto } from './dto/configure-episodes.dto';
import { CreateDramaDto } from './dto/create-drama.dto';
import { CreateEpisodeDto } from './dto/create-episode.dto';
import { UpdateDramaDto } from './dto/update-drama.dto';
import { UpdateEpisodeDto } from './dto/update-episode.dto';
import { DramasService } from './dramas.service';
import { PublishStatus } from './drama-status.enum';
@@ -32,6 +44,48 @@ export class DramasController {
});
}
@Get('/api/admin/v1/dramas/:id')
@ApiBearerAuth()
@UseGuards(AdminJwtAuthGuard, PermissionsGuard)
@RequirePermissions('drama:read')
getDrama(@Param('id') id: string) {
return this.dramasService.getDramaOrThrow(Number(id));
}
@Patch('/api/admin/v1/dramas/:id')
@ApiBearerAuth()
@UseGuards(AdminJwtAuthGuard, PermissionsGuard)
@RequirePermissions('drama:update')
updateDrama(@Param('id') id: string, @Body() dto: UpdateDramaDto) {
return this.dramasService.updateDrama(Number(id), dto);
}
@Post('/api/admin/v1/dramas/:id/episodes/batch')
@ApiBearerAuth()
@UseGuards(AdminJwtAuthGuard, PermissionsGuard)
@RequirePermissions('episode:create')
configureEpisodes(
@Param('id') id: string,
@Body() dto: ConfigureEpisodesDto,
) {
return this.dramasService.configureEpisodes(Number(id), dto);
}
@Get('/api/admin/v1/dramas/:id/episodes')
@ApiBearerAuth()
@UseGuards(AdminJwtAuthGuard, PermissionsGuard)
@RequirePermissions('episode:update')
listAdminEpisodes(
@Param('id') id: string,
@Query('page') page?: string,
@Query('pageSize') pageSize?: string,
) {
return this.dramasService.listAdminEpisodes(Number(id), {
page: Number(page) || 1,
pageSize: Number(pageSize) || 20,
});
}
@Post('/api/admin/v1/episodes')
@ApiBearerAuth()
@UseGuards(AdminJwtAuthGuard, PermissionsGuard)
@@ -40,6 +94,14 @@ export class DramasController {
return this.dramasService.createEpisode(dto);
}
@Patch('/api/admin/v1/episodes/:id')
@ApiBearerAuth()
@UseGuards(AdminJwtAuthGuard, PermissionsGuard)
@RequirePermissions('episode:update')
updateEpisode(@Param('id') id: string, @Body() dto: UpdateEpisodeDto) {
return this.dramasService.updateEpisode(Number(id), dto);
}
@Post('/api/admin/v1/dramas/:id/submit-review')
@ApiBearerAuth()
@UseGuards(AdminJwtAuthGuard, PermissionsGuard)
@@ -84,4 +146,9 @@ export class DramasController {
pageSize: Number(pageSize) || 20,
});
}
@Get('/api/app/v1/dramas/:id')
getPublishedDrama(@Param('id') id: string) {
return this.dramasService.getPublishedDramaOrThrow(Number(id));
}
}