From 5fa8c5e0a90ac858520f62dabe3391c2c426775a Mon Sep 17 00:00:00 2001 From: zhxiao1124 Date: Wed, 1 Jul 2026 16:04:49 +0800 Subject: [PATCH] feat(dramas,media): add video resolution fields and fix quote style MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 为剧集剧集添加width和height字段,支持存储视频分辨率信息 2. 统一将media.controller.ts中的单引号改为双引号,保持代码风格一致 --- src/modules/dramas/dramas.service.ts | 2 ++ src/modules/dramas/dto/create-episode.dto.ts | 12 +++++++ src/modules/dramas/entities/episode.entity.ts | 6 ++++ .../interfaces/drama-records.interface.ts | 2 ++ src/modules/media/media.controller.ts | 36 +++++++++---------- 5 files changed, 40 insertions(+), 18 deletions(-) diff --git a/src/modules/dramas/dramas.service.ts b/src/modules/dramas/dramas.service.ts index b8044e8..ebe1fe9 100644 --- a/src/modules/dramas/dramas.service.ts +++ b/src/modules/dramas/dramas.service.ts @@ -94,6 +94,8 @@ export class DramasService { videoUrl: dto.videoUrl, trialDurationSeconds: dto.trialDurationSeconds, durationSeconds: dto.durationSeconds, + width: dto.width, + height: dto.height, isPaid: freeType === 'paid', freeType, unlockPrice: price, diff --git a/src/modules/dramas/dto/create-episode.dto.ts b/src/modules/dramas/dto/create-episode.dto.ts index f5857c8..a58ac27 100644 --- a/src/modules/dramas/dto/create-episode.dto.ts +++ b/src/modules/dramas/dto/create-episode.dto.ts @@ -82,6 +82,18 @@ export class CreateEpisodeDto { @Min(1) durationSeconds: number; + @ApiPropertyOptional() + @IsOptional() + @IsInt() + @Min(1) + width?: number; + + @ApiPropertyOptional() + @IsOptional() + @IsInt() + @Min(1) + height?: number; + @ApiPropertyOptional() @IsOptional() @IsBoolean() diff --git a/src/modules/dramas/entities/episode.entity.ts b/src/modules/dramas/entities/episode.entity.ts index 89ca551..27ef2aa 100644 --- a/src/modules/dramas/entities/episode.entity.ts +++ b/src/modules/dramas/entities/episode.entity.ts @@ -38,6 +38,12 @@ export class Episode { @Column({ type: 'int' }) durationSeconds: number; + @Column({ type: 'int', nullable: true }) + width?: number; + + @Column({ type: 'int', nullable: true }) + height?: number; + @Column({ type: 'boolean', default: false }) isPaid: boolean; diff --git a/src/modules/dramas/interfaces/drama-records.interface.ts b/src/modules/dramas/interfaces/drama-records.interface.ts index 8614e03..284e7ad 100644 --- a/src/modules/dramas/interfaces/drama-records.interface.ts +++ b/src/modules/dramas/interfaces/drama-records.interface.ts @@ -37,6 +37,8 @@ export interface EpisodeRecord { videoUrl?: string; trialDurationSeconds?: number; durationSeconds: number; + width?: number; + height?: number; isPaid: boolean; freeType: 'free' | 'paid'; unlockPrice?: number; diff --git a/src/modules/media/media.controller.ts b/src/modules/media/media.controller.ts index 85afc74..72722fb 100644 --- a/src/modules/media/media.controller.ts +++ b/src/modules/media/media.controller.ts @@ -1,36 +1,36 @@ -import { Body, Controller, Get, 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 { CreateCoverDto } from './dto/create-cover.dto'; -import { CreateUploadJobDto } from './dto/create-upload-job.dto'; -import { MediaService } from './media.service'; +import { Body, Controller, Get, 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 { CreateCoverDto } from "./dto/create-cover.dto"; +import { CreateUploadJobDto } from "./dto/create-upload-job.dto"; +import { MediaService } from "./media.service"; -@ApiTags('Media') -@Controller('/api/admin/v1/media') +@ApiTags("Media") +@Controller("/api/admin/v1/media") @ApiBearerAuth() @UseGuards(AdminJwtAuthGuard, PermissionsGuard) export class MediaController { constructor(private readonly mediaService: MediaService) {} - @Post('/covers') - @RequirePermissions('media:create') + @Post("/covers") + @RequirePermissions("media:create") createCover(@Body() dto: CreateCoverDto) { return this.mediaService.createCover(dto); } - @Post('/upload-jobs') - @RequirePermissions('media:create') + @Post("/upload-jobs") + @RequirePermissions("media:create") createUploadJob(@Body() dto: CreateUploadJobDto) { return this.mediaService.createUploadJob(dto); } - @Get('/upload-jobs') - @RequirePermissions('media:read') + @Get("/upload-jobs") + @RequirePermissions("media:read") listUploadJobs( - @Query('page') page?: string, - @Query('pageSize') pageSize?: string, + @Query("page") page?: string, + @Query("pageSize") pageSize?: string, ) { return this.mediaService.listUploadJobs({ page: Number(page) || 1,