From fdd9d803104e7aaa673b6d3a9943e6b034acc17a Mon Sep 17 00:00:00 2001 From: liuyi Date: Sun, 1 Jun 2025 14:57:20 +0800 Subject: [PATCH] modify PostService and ContentModule --- src/app.module.ts | 8 ++- src/modules/content/content.module.ts | 68 ++++++++++++++++---- src/modules/content/services/index.ts | 1 - src/modules/content/services/post.service.ts | 15 ++++- 4 files changed, 73 insertions(+), 19 deletions(-) diff --git a/src/app.module.ts b/src/app.module.ts index 227a402..83f58c6 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -4,7 +4,7 @@ import { APP_FILTER, APP_INTERCEPTOR, APP_PIPE } from '@nestjs/core'; import { AppInterceptor } from '@/modules/core/providers/app.interceptor'; -import { database } from './config'; +import { content, database } from './config'; import { DEFAULT_VALIDATION_CONFIG } from './modules/content/constants'; import { ContentModule } from './modules/content/content.module'; @@ -14,7 +14,11 @@ import { AppPipe } from './modules/core/providers/app.pipe'; import { DatabaseModule } from './modules/database/database.module'; @Module({ - imports: [ContentModule, CoreModule.forRoot(), DatabaseModule.forRoot(database)], + imports: [ + ContentModule.forRoot(content), + CoreModule.forRoot(), + DatabaseModule.forRoot(database), + ], providers: [ { provide: APP_PIPE, diff --git a/src/modules/content/content.module.ts b/src/modules/content/content.module.ts index ed7f989..6e2540f 100644 --- a/src/modules/content/content.module.ts +++ b/src/modules/content/content.module.ts @@ -1,4 +1,4 @@ -import { Module } from '@nestjs/common'; +import { DynamicModule, Module, ModuleMetadata } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; @@ -8,19 +8,59 @@ import * as repositories from '@/modules/content/repositories'; import * as services from '@/modules/content/services'; import { SanitizeService } from '@/modules/content/services/SanitizeService'; +import { PostService } from '@/modules/content/services/post.service'; import { PostSubscriber } from '@/modules/content/subscribers/post.subscriber'; +import { ContentConfig } from '@/modules/content/types'; import { DatabaseModule } from '@/modules/database/database.module'; -@Module({ - imports: [ - TypeOrmModule.forFeature(Object.values(entities)), - DatabaseModule.forRepository(Object.values(repositories)), - ], - controllers: Object.values(controllers), - providers: [...Object.values(services), PostSubscriber, SanitizeService], - exports: [ - ...Object.values(services), - DatabaseModule.forRepository(Object.values(repositories)), - ], -}) -export class ContentModule {} +@Module({}) +export class ContentModule { + static forRoot(configRegister?: () => ContentConfig): DynamicModule { + const config: Required = { + SearchType: 'mysql', + ...(configRegister ? configRegister() : {}), + }; + const providers: ModuleMetadata['providers'] = [ + ...Object.values(services), + SanitizeService, + PostSubscriber, + { + provide: PostService, + inject: [ + repositories.PostRepository, + repositories.CategoryRepository, + repositories.TagRepository, + services.CategoryService, + ], + useFactory( + postRepository: repositories.PostRepository, + categoryRepository: repositories.CategoryRepository, + tagRepository: repositories.TagRepository, + categoryService: services.CategoryService, + ) { + return new PostService( + postRepository, + categoryRepository, + categoryService, + tagRepository, + config.SearchType, + ); + }, + }, + ]; + return { + module: ContentModule, + imports: [ + TypeOrmModule.forFeature(Object.values(entities)), + DatabaseModule.forRepository(Object.values(repositories)), + ], + controllers: Object.values(controllers), + providers, + exports: [ + ...Object.values(services), + PostService, + DatabaseModule.forRepository(Object.values(repositories)), + ], + }; + } +} diff --git a/src/modules/content/services/index.ts b/src/modules/content/services/index.ts index d8a7033..7531cb4 100644 --- a/src/modules/content/services/index.ts +++ b/src/modules/content/services/index.ts @@ -1,4 +1,3 @@ export * from './category.service'; export * from './tag.service'; -export * from './post.service'; export * from './comment.service'; diff --git a/src/modules/content/services/post.service.ts b/src/modules/content/services/post.service.ts index ab7c67a..55da4aa 100644 --- a/src/modules/content/services/post.service.ts +++ b/src/modules/content/services/post.service.ts @@ -9,6 +9,7 @@ import { CreatePostDto, QueryPostDto, UpdatePostDto } from '@/modules/content/dt import { PostEntity } from '@/modules/content/entities/post.entity'; import { CategoryRepository } from '@/modules/content/repositories'; import { PostRepository } from '@/modules/content/repositories/post.repository'; +import { SearchType } from '@/modules/content/types'; import { SelectTrashMode } from '@/modules/database/constants'; import { QueryHook } from '@/modules/database/types'; import { paginate } from '@/modules/database/utils'; @@ -28,6 +29,7 @@ export class PostService { protected categoryRepository: CategoryRepository, protected categoryService: CategoryService, protected tagRepository: TagRepository, + protected searchType: SearchType = 'mysql', ) {} async paginate(options: QueryPostDto, callback?: QueryHook) { @@ -115,8 +117,8 @@ export class PostService { .where('post.id IN (:...ids)', { ids }) .withDeleted() .getMany(); - const trasheds = items.filter((item) => !isNil(item.deleteAt)); - const trashedIds = trasheds.map((item) => item.id); + const trashes = items.filter((item) => !isNil(item.deleteAt)); + const trashedIds = trashes.map((item) => item.id); if (trashedIds.length < 1) { return []; } @@ -157,6 +159,15 @@ export class PostService { return qb; } + protected buildSearchQuery(qb: SelectQueryBuilder, search: string) { + qb.orWhere('title LIKE :search', { search: `%${search}%` }) + .orWhere('summary LIKE :search', { search: `%${search}%` }) + .orWhere('body LIKE :search', { search: `%${search}%` }) + .orWhere('category.name LIKE :search', { search: `%${search}%` }) + .orWhere('tags.name LIKE :search', { search: `%${search}%` }); + return qb; + } + protected queryOrderBy(qb: SelectQueryBuilder, orderBy?: PostOrder) { switch (orderBy) { case PostOrder.CREATED: