Przeglądaj źródła

feat: refactor ads module handling and add endpoint for listing ads modules

Dave 2 miesięcy temu
rodzic
commit
78340cace2

+ 15 - 6
apps/box-mgnt-api/src/mgnt-backend/feature/ads/ads.controller.ts

@@ -8,12 +8,7 @@ import {
   Post,
   Put,
 } from '@nestjs/common';
-import {
-  ApiBody,
-  ApiOperation,
-  ApiResponse,
-  ApiTags,
-} from '@nestjs/swagger';
+import { ApiBody, ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger';
 import { CreateAdsDto, ListAdsDto, UpdateAdsDto, AdsDto } from './ads.dto';
 import { AdsService } from './ads.service';
 import { MongoIdParamDto } from '../common/mongo-id.dto';
@@ -74,4 +69,18 @@ export class AdsController {
   remove(@Param() { id }: MongoIdParamDto) {
     return this.service.remove(id);
   }
+
+  @Get('modules/list')
+  @ApiOperation({ summary: 'Get list of ads modules' })
+  @ApiResponse({
+    status: 200,
+    description: 'List of ads modules',
+    schema: {
+      type: 'array',
+      items: { type: 'object' },
+    },
+  })
+  listAdsModules() {
+    return this.service.listAdsModules();
+  }
 }

+ 3 - 3
apps/box-mgnt-api/src/mgnt-backend/feature/ads/ads.dto.ts

@@ -128,7 +128,7 @@ export class CreateAdsDto {
   @IsString()
   @Length(1, 50)
   @Transform(({ value }) => (typeof value === 'string' ? value.trim() : value))
-  adsModule: string;
+  adsModuleId: string;
 
   @ApiProperty({ description: '广告商', maxLength: 20 })
   @IsString()
@@ -212,12 +212,12 @@ export class ListAdsDto extends PageListDto {
   @Transform(({ value }) => (typeof value === 'string' ? value.trim() : value))
   advertiser?: string;
 
-  @ApiPropertyOptional({ description: '广告模块过滤', maxLength: 50 })
+  @ApiPropertyOptional({ description: '广告模块ID', maxLength: 50 })
   @IsOptional()
   @IsString()
   @MaxLength(50)
   @Transform(({ value }) => (typeof value === 'string' ? value.trim() : value))
-  adsModule?: string;
+  adsModuleId?: string;
 
   @ApiPropertyOptional({ description: '渠道ID (ObjectId)' })
   @IsOptional()

+ 12 - 4
apps/box-mgnt-api/src/mgnt-backend/feature/ads/ads.service.ts

@@ -64,7 +64,7 @@ export class AdsService {
     return this.mongoPrismaService.ads.create({
       data: {
         channelId: dto.channelId,
-        adsModule: dto.adsModule,
+        adsModuleId: dto.adsModuleId,
         advertiser: dto.advertiser,
         title: dto.title,
         adsContent: this.trimOptional(dto.adsContent) ?? null,
@@ -89,7 +89,7 @@ export class AdsService {
     // Build data object carefully to avoid unintended field changes
     const data: any = {
       channelId: dto.channelId,
-      adsModule: dto.adsModule,
+      adsModuleId: dto.adsModuleId,
       advertiser: dto.advertiser,
       title: dto.title,
       adsContent: this.trimOptional(dto.adsContent) ?? null,
@@ -141,8 +141,8 @@ export class AdsService {
     if (dto.advertiser) {
       where.advertiser = { contains: dto.advertiser, mode: 'insensitive' };
     }
-    if (dto.adsModule) {
-      where.adsModule = { contains: dto.adsModule, mode: 'insensitive' };
+    if (dto.adsModuleId) {
+      where.adsModuleId = dto.adsModuleId;
     }
     if (dto.channelId) {
       where.channelId = dto.channelId;
@@ -185,4 +185,12 @@ export class AdsService {
       throw e;
     }
   }
+
+  // get list of ads modules
+  async listAdsModules() {
+    const adsModules = await this.mongoPrismaService.adsModule.findMany({
+      orderBy: { seq: 'asc' },
+    });
+    return adsModules;
+  }
 }

+ 13 - 13
mongo-db-seeds.md

@@ -3,19 +3,19 @@ adsModule
 ```bash
 db.adsModule.drop()
 db.adsModule.insertMany([
-{ adsModule: "启动页(10:21)" },
-{ adsModule: "轮播(2:1)" },
-{ adsModule: "弹窗-图标(1:1)" },
-{ adsModule: "弹窗-图片(2:3)" },
-{ adsModule: "弹窗-官方(2:3)" },
-{ adsModule: "瀑布流-图标(1:1)" },
-{ adsModule: "瀑布流-文字" },
-{ adsModule: "布流-视频(8:5)" },
-{ adsModule: "悬浮-底部(1:1)" },
-{ adsModule: "悬浮-边缘(1:1)" },
-{ adsModule: "banner(4:1)" },
-{ adsModule: "片头(8:5)" },
-{ adsModule: "暂停(2:1)" }
+{ adsModule: "启动页", moduleDesc: "启动页(10:21)", seq: 1 },
+{ adsModule: "轮播", moduleDesc: "轮播(2:1)", seq: 2 },
+{ adsModule: "弹窗-图标", moduleDesc: "弹窗-图标(1:1)", seq: 3 },
+{ adsModule: "弹窗-图片", moduleDesc: "弹窗-图片(2:3)", seq: 4 },
+{ adsModule: "弹窗-官方", moduleDesc: "弹窗-官方(2:3)", seq: 5 },
+{ adsModule: "瀑布流-图标", moduleDesc: "瀑布流-图标(1:1)", seq: 6 },
+{ adsModule: "瀑布流-文字", moduleDesc: "瀑布流-文字", seq: 7 },
+{ adsModule: "瀑布流-视频", moduleDesc: "瀑布流-视频(8:5)", seq: 8 },
+{ adsModule: "悬浮-底部", moduleDesc: "悬浮-底部(1:1)", seq: 9 },
+{ adsModule: "悬浮-边缘", moduleDesc: "悬浮-边缘(1:1)", seq:10 },
+{ adsModule: "banner", moduleDesc: "banner(4:1)", seq: 11 },
+{ adsModule: "片头", moduleDesc: "片头(8:5)", seq: 12 },
+{ adsModule: "暂停", moduleDesc: "暂停(2:1)", seq: 13 }
 ])
 
 

+ 3 - 0
prisma/mongo/schema/ads-module.prisma

@@ -1,6 +1,9 @@
 model AdsModule {
   id          String    @id @default(auto()) @map("_id") @db.ObjectId
   adsModule   String    /// 广告模块
+  moduleDesc  String?   /// 模块简介
+  seq         Int       @default(0)
+  ads         Ads[]
 
   @@map("adsModule")
 }

+ 2 - 1
prisma/mongo/schema/ads.prisma

@@ -1,7 +1,7 @@
 model Ads {
   id           String     @id @map("_id") @default(auto()) @db.ObjectId
   channelId    String     @db.ObjectId        // 渠道 ID
-  adsModule    String                        // 广告模块 (banner/startup/轮播等)
+  adsModuleId  String                        // 广告模块 Id (banner/startup/轮播等)
   advertiser   String                        // 广告商 (业务上限制 max 20 字符)
   title        String                        // 标题 (业务上限制 max 20 字符)
   adsContent   String?                       // 广告文案 (业务上限制 max 500 字符)
@@ -19,6 +19,7 @@ model Ads {
 
   // Relations
   channel      Channel    @relation(fields: [channelId], references: [id])
+  adsModule    AdsModule  @relation(fields: [adsModuleId], references: [id])
 
   @@map("ads")  // collection name
 }