Browse Source

feat: add video media module with controller, service, and DTOs; update prisma schema

Dave 2 tháng trước cách đây
mục cha
commit
9eff42b222

+ 1 - 5
apps/box-mgnt-api/src/mgnt-backend/feature/ads/ads.service.ts

@@ -1,11 +1,7 @@
 import { Injectable } from '@nestjs/common';
 import { PrismaClientKnownRequestError } from '@prisma/client/runtime/library';
 import { MongoPrismaService } from '@box/db/prisma/mongo-prisma.service';
-import {
-  CreateAdsDto,
-  ListAdsDto,
-  UpdateAdsDto,
-} from './ads.dto';
+import { CreateAdsDto, ListAdsDto, UpdateAdsDto } from './ads.dto';
 import { CommonStatus } from '../common/status.enum';
 
 @Injectable()

+ 3 - 0
apps/box-mgnt-api/src/mgnt-backend/feature/feature.module.ts

@@ -1,3 +1,4 @@
+// apps/box-mgnt-api/src/mgnt-backend/feature/feature.module.ts
 import { Module } from '@nestjs/common';
 // import { OssModule } from './oss/oss.module';
 import { S3Module } from './s3/s3.module';
@@ -8,6 +9,7 @@ import { AdsModule } from './ads/ads.module';
 import { CategoryModule } from './category/category.module';
 import { ChannelModule } from './channel/channel.module';
 import { TagModule } from './tag/tag.module';
+import { VideoMediaModule } from './video-media/video-media.module';
 
 @Module({
   imports: [
@@ -20,6 +22,7 @@ import { TagModule } from './tag/tag.module';
     TagModule,
     MgntHttpServiceModule,
     SyncVideomediaModule,
+    VideoMediaModule,
   ],
 })
 export class FeatureModule {}

+ 44 - 0
apps/box-mgnt-api/src/mgnt-backend/feature/video-media/video-media.controller.ts

@@ -0,0 +1,44 @@
+import {
+  Controller,
+  Get,
+  Post,
+  Body,
+  Patch,
+  Param,
+  Delete,
+} from '@nestjs/common';
+import { VideoMediaService } from './video-media.service';
+import { CreateVideoMediaDto, UpdateVideoMediaDto } from './video-media.dto';
+
+@Controller('video-media')
+export class VideoMediaController {
+  constructor(private readonly videoMediasService: VideoMediaService) {}
+
+  @Post()
+  create(@Body() createVideoMediaDto: CreateVideoMediaDto) {
+    return this.videoMediasService.create(createVideoMediaDto);
+  }
+
+  @Get()
+  findAll() {
+    return this.videoMediasService.findAll();
+  }
+
+  @Get(':id')
+  findOne(@Param('id') id: string) {
+    return this.videoMediasService.findOne(+id);
+  }
+
+  @Patch(':id')
+  update(
+    @Param('id') id: string,
+    @Body() updateVideoMediaDto: UpdateVideoMediaDto,
+  ) {
+    return this.videoMediasService.update(+id, updateVideoMediaDto);
+  }
+
+  @Delete(':id')
+  remove(@Param('id') id: string) {
+    return this.videoMediasService.remove(+id);
+  }
+}

+ 14 - 0
apps/box-mgnt-api/src/mgnt-backend/feature/video-media/video-media.dto.ts

@@ -0,0 +1,14 @@
+import { ApiPropertyOptional, PartialType } from '@nestjs/swagger';
+import { IsOptional, IsString, MaxLength } from 'class-validator';
+
+export class CreateVideoMediaDto {}
+
+export class UpdateVideoMediaDto extends PartialType(CreateVideoMediaDto) {}
+
+export class ListVideoMediaDto extends PartialType(CreateVideoMediaDto) {
+  @ApiPropertyOptional({ description: '模糊搜索', maxLength: 100 })
+  @IsOptional()
+  @IsString()
+  @MaxLength(100)
+  search?: string;
+}

+ 12 - 0
apps/box-mgnt-api/src/mgnt-backend/feature/video-media/video-media.module.ts

@@ -0,0 +1,12 @@
+import { Module } from '@nestjs/common';
+import { VideoMediaService } from './video-media.service';
+import { VideoMediaController } from './video-media.controller';
+import { PrismaModule } from '@box/db/prisma/prisma.module';
+
+@Module({
+  imports: [PrismaModule],
+  controllers: [VideoMediaController],
+  providers: [VideoMediaService],
+  exports: [VideoMediaService],
+})
+export class VideoMediaModule {}

+ 29 - 0
apps/box-mgnt-api/src/mgnt-backend/feature/video-media/video-media.service.ts

@@ -0,0 +1,29 @@
+// apps/box-mgnt-api/src/mgnt-backend/feature/video-media/video-media.service.ts
+import { Injectable } from '@nestjs/common';
+import { MongoPrismaService } from '@box/db/prisma/mongo-prisma.service';
+import { CreateVideoMediaDto, UpdateVideoMediaDto } from './video-media.dto';
+
+@Injectable()
+export class VideoMediaService {
+  constructor(private readonly prisma: MongoPrismaService) {}
+
+  create(createVideoMediaDto: CreateVideoMediaDto) {
+    return 'This action adds a new videoMedia';
+  }
+
+  findAll() {
+    return `This action returns all videoMedias`;
+  }
+
+  findOne(id: number) {
+    return `This action returns a #${id} videoMedia`;
+  }
+
+  update(id: number, updateVideoMediaDto: UpdateVideoMediaDto) {
+    return `This action updates a #${id} videoMedia`;
+  }
+
+  remove(id: number) {
+    return `This action removes a #${id} videoMedia`;
+  }
+}

+ 13 - 98
box-mgnt-note.md

@@ -1,110 +1,25 @@
 # dave note for any changes here
 
 ```bash
-pnpm install
-
-tree -L 4 -I 'node_modules|.git'
-
-
-echo "20" > .nvmrc
-nvm install
-nvm use
-rm -rf node_modules
-rm -rf dist
-rm -rf ~/.pnpm-store
-pnpm install
-npm rebuild bcrypt
-find node_modules -name bcrypt_lib.node
-
-pnpm run prisma:generate:mysql
-pnpm run prisma:generate:mongo
-pnpm run prisma:generate
-
-pnpm build:mgnt
-
-pnpm dev:mgnt
-
-
-sudo systemctl start mysql
-sudo systemctl start mongod
-
+# Generate a new module
+nest g module mgnt-backend/feature/video-medias --project box-mgnt-api
 ```
 
-## 重置 mysql 数据库并添加测试数据x
-
-pnpm run prisma:seed:mysql
-pnpm run prisma:migrate:mysql
-
-## perform MySql DB update migration
-
 ```bash
-
-pnpm run prisma:generate:mysql
-pnpm run prisma:migrate:mysql
+# Or generate a complete resource (module + controller + service + DTOs)
+nest g resource mgnt-backend/feature/video-medias --project box-mgnt-api
 
 ```
 
-## generate secret
-
-```bash
-node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
-
-
-git remote add origin git@47.238.201.61:fct/box-nestjs-monorepo.git
-
-```
-
-```code
-+-----------+-------------------------------------------------------------------------------------------------------------------------------------+
-| Database | Create Database |
-+-----------+-------------------------------------------------------------------------------------------------------------------------------------+
-| box*admin | CREATE DATABASE `box_admin` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4*0900_ai_ci*/ /_!80016 DEFAULT ENCRYPTION='N'_/ |
-+-----------+-------------------------------------------------------------------------------------------------------------------------------------+
-```
-
 ```code
-mongosh mongodb://admin:ZXcv%21%21996@localhost:27017/box?authSource=admin
-
-curl -X POST <http://47.76.151.238:3200/external-sync/fullsync/tea-copy> \
- -H "Content-Type: application/json" \
- -d '{"size": 20}'
-```
-
-```code
-Future<Uint8List> decryptImage(Map<String, dynamic> params) async {
-Uint8List imgBytes = params['imgBytes'];
-String path = params['path'];
-if (imgBytes.isEmpty) {
-return imgBytes;
-}
-var encryptedHead = Uint8List.fromList([0x88, 0xA8, 0x30, 0xCB, 0x10, 0x76]);
-var needEncrypt = false;
-if (imgBytes.length >= encryptedHead.length) {
-bool allMatch = true;
-for (int i = 0; i < encryptedHead.length; i++) {
-if (encryptedHead[i] != imgBytes[i]) {
-allMatch = false;
-break;
-}
-}
-if (allMatch) {
-needEncrypt = true;
-}
-}
-
-if (needEncrypt) {
-List<int> fileNameList = utf8.encode(path);
-
-    /// 裁剪头部添加的字节数量
-    for (var i = 0; i < encryptedHead.length; i++) {
-      List<int> mutableList = imgBytes.toList();
-      mutableList.remove(encryptedHead[i]);
-      imgBytes = Uint8List.fromList(mutableList);
-    }
-    // 裁剪尾部添加的字节数量
-    imgBytes.sublist(0, imgBytes.length - fileNameList.length);
+video-medias/
+├── dto/
+│   ├── create-video-media.dto.ts
+│   └── update-video-media.dto.ts
+├── entities/
+│   └── video-media.entity.ts
+├── video-medias.controller.ts
+├── video-medias.service.ts
+└── video-medias.module.ts
 
-}
-return imgBytes;
-}
 ```

+ 9 - 0
prisma/mongo/schema/video-media.prisma

@@ -74,5 +74,14 @@ model VideoMedia {
   deleteDisk    Boolean   @default(false)
   infoTsName    String    @default("")
 
+  // all above fields are from provider, keep original, avoid updating,
+  // use below fields for local video media controls
+  categoryId    String?    @db.ObjectId     // 分类 ID
+  listStatus    Int       @default(0)       // 上/下架状态 0: 下架; 1: 上架
+  editedAt      BigInt    @default(0)       // 更新时间
+
+  // Relations
+  category      Category  @relation(fields: [categoryId], references: [id])
+
   @@map("videoMedia")
 }