modify PostService and ContentModule

This commit is contained in:
liuyi 2025-06-01 14:57:20 +08:00
parent 37f11a0097
commit fdd9d80310
4 changed files with 73 additions and 19 deletions

View File

@ -4,7 +4,7 @@ import { APP_FILTER, APP_INTERCEPTOR, APP_PIPE } from '@nestjs/core';
import { AppInterceptor } from '@/modules/core/providers/app.interceptor'; 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 { DEFAULT_VALIDATION_CONFIG } from './modules/content/constants';
import { ContentModule } from './modules/content/content.module'; 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'; import { DatabaseModule } from './modules/database/database.module';
@Module({ @Module({
imports: [ContentModule, CoreModule.forRoot(), DatabaseModule.forRoot(database)], imports: [
ContentModule.forRoot(content),
CoreModule.forRoot(),
DatabaseModule.forRoot(database),
],
providers: [ providers: [
{ {
provide: APP_PIPE, provide: APP_PIPE,

View File

@ -1,4 +1,4 @@
import { Module } from '@nestjs/common'; import { DynamicModule, Module, ModuleMetadata } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm'; import { TypeOrmModule } from '@nestjs/typeorm';
@ -8,19 +8,59 @@ import * as repositories from '@/modules/content/repositories';
import * as services from '@/modules/content/services'; import * as services from '@/modules/content/services';
import { SanitizeService } from '@/modules/content/services/SanitizeService'; import { SanitizeService } from '@/modules/content/services/SanitizeService';
import { PostService } from '@/modules/content/services/post.service';
import { PostSubscriber } from '@/modules/content/subscribers/post.subscriber'; import { PostSubscriber } from '@/modules/content/subscribers/post.subscriber';
import { ContentConfig } from '@/modules/content/types';
import { DatabaseModule } from '@/modules/database/database.module'; import { DatabaseModule } from '@/modules/database/database.module';
@Module({ @Module({})
export class ContentModule {
static forRoot(configRegister?: () => ContentConfig): DynamicModule {
const config: Required<ContentConfig> = {
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: [ imports: [
TypeOrmModule.forFeature(Object.values(entities)), TypeOrmModule.forFeature(Object.values(entities)),
DatabaseModule.forRepository(Object.values(repositories)), DatabaseModule.forRepository(Object.values(repositories)),
], ],
controllers: Object.values(controllers), controllers: Object.values(controllers),
providers: [...Object.values(services), PostSubscriber, SanitizeService], providers,
exports: [ exports: [
...Object.values(services), ...Object.values(services),
PostService,
DatabaseModule.forRepository(Object.values(repositories)), DatabaseModule.forRepository(Object.values(repositories)),
], ],
}) };
export class ContentModule {} }
}

View File

@ -1,4 +1,3 @@
export * from './category.service'; export * from './category.service';
export * from './tag.service'; export * from './tag.service';
export * from './post.service';
export * from './comment.service'; export * from './comment.service';

View File

@ -9,6 +9,7 @@ import { CreatePostDto, QueryPostDto, UpdatePostDto } from '@/modules/content/dt
import { PostEntity } from '@/modules/content/entities/post.entity'; import { PostEntity } from '@/modules/content/entities/post.entity';
import { CategoryRepository } from '@/modules/content/repositories'; import { CategoryRepository } from '@/modules/content/repositories';
import { PostRepository } from '@/modules/content/repositories/post.repository'; import { PostRepository } from '@/modules/content/repositories/post.repository';
import { SearchType } from '@/modules/content/types';
import { SelectTrashMode } from '@/modules/database/constants'; import { SelectTrashMode } from '@/modules/database/constants';
import { QueryHook } from '@/modules/database/types'; import { QueryHook } from '@/modules/database/types';
import { paginate } from '@/modules/database/utils'; import { paginate } from '@/modules/database/utils';
@ -28,6 +29,7 @@ export class PostService {
protected categoryRepository: CategoryRepository, protected categoryRepository: CategoryRepository,
protected categoryService: CategoryService, protected categoryService: CategoryService,
protected tagRepository: TagRepository, protected tagRepository: TagRepository,
protected searchType: SearchType = 'mysql',
) {} ) {}
async paginate(options: QueryPostDto, callback?: QueryHook<PostEntity>) { async paginate(options: QueryPostDto, callback?: QueryHook<PostEntity>) {
@ -115,8 +117,8 @@ export class PostService {
.where('post.id IN (:...ids)', { ids }) .where('post.id IN (:...ids)', { ids })
.withDeleted() .withDeleted()
.getMany(); .getMany();
const trasheds = items.filter((item) => !isNil(item.deleteAt)); const trashes = items.filter((item) => !isNil(item.deleteAt));
const trashedIds = trasheds.map((item) => item.id); const trashedIds = trashes.map((item) => item.id);
if (trashedIds.length < 1) { if (trashedIds.length < 1) {
return []; return [];
} }
@ -157,6 +159,15 @@ export class PostService {
return qb; return qb;
} }
protected buildSearchQuery(qb: SelectQueryBuilder<PostEntity>, 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<PostEntity>, orderBy?: PostOrder) { protected queryOrderBy(qb: SelectQueryBuilder<PostEntity>, orderBy?: PostOrder) {
switch (orderBy) { switch (orderBy) {
case PostOrder.CREATED: case PostOrder.CREATED: