Selaa lähdekoodia

feat: 完成文章筛选接口

IlhamTahir 1 vuosi sitten
vanhempi
commit
dd1cc2e3d7

+ 12 - 0
src/article/controller/category.controller.ts

@@ -65,6 +65,18 @@ export class CategoryController {
     );
   }
 
+  @ApiBearerAuth()
+  @Get('/list')
+  @ApiOkResponse({
+    schema: {
+      type: 'array',
+      items: { $ref: getSchemaPath(CategoryVo) },
+    },
+  })
+  async list() {
+    return CategoryMapper.toVos(await this.categoryService.list());
+  }
+
   @Get(':id')
   @ApiBearerAuth()
   @ApiOkResponse({

+ 19 - 0
src/article/dto/search-article.filter.ts

@@ -2,12 +2,27 @@ import { BaseFilter } from '../../core/dto/base.filter';
 import { ApiProperty } from '@nestjs/swagger';
 import { IsOptional } from 'class-validator';
 import { Like } from 'typeorm';
+import { ArticleStatus } from '../enum/article.status';
 
 export class SearchArticleFilter extends BaseFilter {
   @ApiProperty({ required: false, description: '标题模糊搜索', example: '猫' })
   @IsOptional()
   title?: string;
 
+  @ApiProperty({
+    required: false,
+    description: '文章状态',
+  })
+  @IsOptional()
+  status?: ArticleStatus;
+
+  @ApiProperty({
+    required: false,
+    description: '分类ID',
+  })
+  @IsOptional()
+  categoryId?: string;
+
   getConditions(): Record<string, any> {
     const conditions = super.getConditions();
 
@@ -16,6 +31,10 @@ export class SearchArticleFilter extends BaseFilter {
       conditions.title = Like(`%${this.title}%`); // 使用 TypeORM 的 Like 运算符
     }
 
+    if (this.status) {
+      conditions.status = this.status;
+    }
+
     return conditions;
   }
 }

+ 5 - 5
src/article/entity/article.entity.ts

@@ -1,6 +1,6 @@
 import { TraceableEntity } from '../../core/entity/traceable.entity';
 import { Column, Entity, ManyToOne, JoinColumn } from 'typeorm';
-import { ArticleStatusEnum } from '../enum/article-status.enum';
+import { ArticleStatus } from '../enum/article.status';
 import { Category } from './category.entity';
 
 @Entity()
@@ -14,7 +14,7 @@ export class Article extends TraceableEntity {
   })
   content: string;
 
-  @ManyToOne(() => Category)
+  @ManyToOne(() => Category, { eager: true })
   @JoinColumn({
     name: 'category_id',
   })
@@ -22,8 +22,8 @@ export class Article extends TraceableEntity {
 
   @Column({
     type: 'enum',
-    enum: ArticleStatusEnum,
-    default: ArticleStatusEnum.DRAFT,
+    enum: ArticleStatus,
+    default: ArticleStatus.DRAFT,
   })
-  status: ArticleStatusEnum = ArticleStatusEnum.DRAFT;
+  status: ArticleStatus = ArticleStatus.DRAFT;
 }

+ 1 - 1
src/article/enum/article-status.enum.ts → src/article/enum/article.status.ts

@@ -1,4 +1,4 @@
-export enum ArticleStatusEnum {
+export enum ArticleStatus {
   DRAFT = 'draft',
   PUBLISHED = 'published',
   CLOSED = 'closed',

+ 9 - 3
src/article/service/article.service.ts

@@ -7,7 +7,7 @@ import { CategoryService } from './category.service';
 import { SearchArticleFilter } from '../dto/search-article.filter';
 import { BizException } from '../../core/exception/biz.exception';
 import { ArticleError } from '../error/article.error';
-import { ArticleStatusEnum } from '../enum/article-status.enum';
+import { ArticleStatus } from '../enum/article.status';
 
 @Injectable()
 export class ArticleService {
@@ -29,6 +29,12 @@ export class ArticleService {
   }
 
   async search(searchArticleFilter: SearchArticleFilter) {
+    const conditions = searchArticleFilter.getConditions();
+    if (searchArticleFilter.categoryId) {
+      conditions.category = await this.categoryService.get(
+        searchArticleFilter.categoryId,
+      );
+    }
     return this.articleRepository.findAndCount({
       where: searchArticleFilter.getConditions(),
       skip: searchArticleFilter.getSkip(),
@@ -62,13 +68,13 @@ export class ArticleService {
 
   async publish(id: string) {
     const article = await this.get(id);
-    article.status = ArticleStatusEnum.PUBLISHED;
+    article.status = ArticleStatus.PUBLISHED;
     return this.articleRepository.save(article);
   }
 
   async close(id: string) {
     const article = await this.get(id);
-    article.status = ArticleStatusEnum.CLOSED;
+    article.status = ArticleStatus.CLOSED;
     return this.articleRepository.save(article);
   }
 

+ 9 - 0
src/article/service/category.service.ts

@@ -64,4 +64,13 @@ export class CategoryService {
     }
     await this.categoryRepository.remove(category);
   }
+
+  async list() {
+    return this.categoryRepository.find({
+      loadEagerRelations: false,
+      order: {
+        order: 'ASC',
+      },
+    });
+  }
 }

+ 2 - 2
src/article/vo/article.vo.ts

@@ -1,5 +1,5 @@
 import { TraceableVo } from '../../core/vo/traceable.vo';
-import { ArticleStatusEnum } from '../enum/article-status.enum';
+import { ArticleStatus } from '../enum/article.status';
 import { ApiProperty, ApiSchema } from '@nestjs/swagger';
 import { CategoryVo } from './category.vo';
 
@@ -17,5 +17,5 @@ export class ArticleVo extends TraceableVo {
   category: CategoryVo;
 
   @ApiProperty()
-  status: ArticleStatusEnum;
+  status: ArticleStatus;
 }