| 1 | /* |
| 2 | * @Author: nevin |
| 3 | * @Date: 2024-06-17 19:19:20 |
| 4 | * @LastEditTime: 2024-12-23 12:45:22 |
| 5 | * @LastEditors: nevin |
| 6 | * @Description: 草稿组 |
| 7 | */ |
| 8 | import { |
| 9 | Body, |
| 10 | Controller, |
| 11 | Delete, |
| 12 | Get, |
| 13 | Param, |
| 14 | Post, |
| 15 | Query, |
| 16 | } from '@nestjs/common' |
| 17 | import { ApiTags } from '@nestjs/swagger' |
| 18 | import { GetToken, TokenInfo } from '@yikart/aitoearn-auth' |
| 19 | import { ApiDoc, AppException, ParseObjectIdPipe, ResponseCode, TableDto } from '@yikart/common' |
| 20 | import { CreateMaterialGroupDto, MaterialGroupFilterDto, MaterialGroupFilterSchema, UpdateMaterialGroupDto } from './material-group.dto' |
| 21 | |
| 22 | import { MaterialGroupService } from './material-group.service' |
| 23 | import { MaterialGroupVo } from './material-group.vo' |
| 24 | |
| 25 | @ApiTags('Me/MaterialGroup') |
| 26 | @Controller('material/group') |
| 27 | export class MaterialGroupController { |
| 28 | constructor( |
| 29 | private readonly materialGroupService: MaterialGroupService, |
| 30 | ) { } |
| 31 | |
| 32 | @ApiDoc({ |
| 33 | summary: '创建草稿分组', |
| 34 | description: '使用提供的元数据创建新的草稿分组。', |
| 35 | body: CreateMaterialGroupDto.schema, |
| 36 | }) |
| 37 | @Post() |
| 38 | async createGroup( |
| 39 | @GetToken() token: TokenInfo, |
| 40 | @Body() body: CreateMaterialGroupDto, |
| 41 | ) { |
| 42 | return this.materialGroupService.createGroup({ |
| 43 | ...body, |
| 44 | userId: token.id, |
| 45 | }) |
| 46 | } |
| 47 | |
| 48 | @ApiDoc({ |
| 49 | summary: '删除草稿分组', |
| 50 | description: '根据ID删除草稿分组。', |
| 51 | }) |
| 52 | @Delete(':id') |
| 53 | async delGroup( |
| 54 | @GetToken() token: TokenInfo, |
| 55 | @Param('id', ParseObjectIdPipe) id: string, |
| 56 | ) { |
| 57 | const materialGroup = await this.materialGroupService.getGroupInfo(id) |
| 58 | if (!materialGroup || materialGroup.userId !== token.id) { |
| 59 | throw new AppException(ResponseCode.MaterialGroupNotFound) |
| 60 | } |
| 61 | if (materialGroup.isDefault) { |
| 62 | throw new AppException(ResponseCode.MaterialGroupDefaultNotAllowed) |
| 63 | } |
| 64 | return this.materialGroupService.delGroup(id) |
| 65 | } |
| 66 | |
| 67 | @ApiDoc({ |
| 68 | summary: '更新草稿分组信息', |
| 69 | description: '更新草稿分组的详情。', |
| 70 | body: UpdateMaterialGroupDto.schema, |
| 71 | }) |
| 72 | @Post('info/:id') |
| 73 | async updateGroupInfo( |
| 74 | @GetToken() token: TokenInfo, |
| 75 | @Param('id', ParseObjectIdPipe) id: string, |
| 76 | @Body() body: UpdateMaterialGroupDto, |
| 77 | ) { |
| 78 | const materialGroup = await this.materialGroupService.getGroupInfo(id) |
| 79 | if (!materialGroup || materialGroup.userId !== token.id) { |
| 80 | throw new AppException(ResponseCode.MaterialGroupNotFound) |
| 81 | } |
| 82 | return this.materialGroupService.updateGroupInfo(id, body) |
| 83 | } |
| 84 | |
| 85 | @ApiDoc({ |
| 86 | summary: '获取草稿分组详情', |
| 87 | description: '根据ID获取草稿分组详情。', |
| 88 | }) |
| 89 | @Get('info/:id') |
| 90 | async getGroupInfo(@Param('id', ParseObjectIdPipe) id: string) { |
| 91 | return this.materialGroupService.getGroupInfo(id) |
| 92 | } |
| 93 | |
| 94 | @ApiDoc({ |
| 95 | summary: '获取草稿分组列表', |
| 96 | description: '分页获取草稿分组列表。', |
| 97 | query: MaterialGroupFilterSchema, |
| 98 | response: [MaterialGroupVo], |
| 99 | }) |
| 100 | @Get('list/:pageNo/:pageSize') |
| 101 | async getGroupList( |
| 102 | @GetToken() token: TokenInfo, |
| 103 | @Param() param: TableDto, |
| 104 | @Query() query: MaterialGroupFilterDto, |
| 105 | ) { |
| 106 | await this.materialGroupService.ensureDefaultGroup(token.id) |
| 107 | |
| 108 | const { list, total } = await this.materialGroupService.getGroupList(param, { |
| 109 | userId: token.id, |
| 110 | ...query, |
| 111 | }) |
| 112 | |
| 113 | return { |
| 114 | list: list.map(item => MaterialGroupVo.create(item)), |
| 115 | total, |
| 116 | } |
| 117 | } |
| 118 | } |
| 119 |