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 { 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,

View File

@ -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<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: [
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)),
],
};
}
}

View File

@ -1,4 +1,3 @@
export * from './category.service';
export * from './tag.service';
export * from './post.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 { 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<PostEntity>) {
@ -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<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) {
switch (orderBy) {
case PostOrder.CREATED: