From ff8e3908f46f17ccf642913b3c384007828e524d Mon Sep 17 00:00:00 2001 From: sunlei Date: Mon, 15 Jun 2026 11:12:57 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E6=94=B6=E6=95=9BBlog=20WordPress?= =?UTF-8?q?=20Asset=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../architecture-convergence-inventory.md | 2 +- src/blog/blog.module.ts | 31 ------- src/minio/minio.module.ts | 13 --- .../identity/auth/admin-auth.controller.ts | 2 +- .../asset/application/asset-minio.service.ts} | 2 +- src/modules/asset/asset.module.ts | 13 +-- .../asset/contract/asset-minio.controller.ts} | 6 +- .../asset/contract/asset-minio.dto.ts} | 0 .../asset/domain/asset-minio.types.ts} | 0 .../blog/application}/blog-article.service.ts | 6 +- .../blog/application}/blog-term.service.ts | 9 ++- .../application}/blog-theme-config.service.ts | 8 +- src/modules/blog/blog-content.module.ts | 31 ++++--- .../blog/contract}/blog-article.controller.ts | 2 +- .../blog/contract}/blog-article.dto.ts | 5 +- .../blog/contract}/blog-term.controller.ts | 4 +- .../blog/contract}/blog-term.dto.ts | 0 .../contract}/blog-theme-config.controller.ts | 2 +- .../blog/contract}/blog-theme-config.dto.ts | 2 +- .../persistence}/blog-article.entity.ts | 0 .../persistence}/blog-term.entity.ts | 0 .../persistence}/blog-theme-config.entity.ts | 2 +- .../application}/wordpress.service.ts | 4 +- .../contract}/wordpress-article.controller.ts | 2 +- .../contract}/wordpress-auth.controller.ts | 2 +- .../wordpress-category.controller.ts | 2 +- .../contract}/wordpress-tag.controller.ts | 2 +- .../contract}/wordpress-theme.controller.ts | 2 +- .../wordpress/contract}/wordpress.dto.ts | 0 .../wordpress/domain}/wordpress.types.ts | 2 +- .../wordpress/wordpress-mirror.module.ts | 20 ++--- .../wordpress/wordpress-mirror.service.ts | 1 - src/wordpress/wordpress.module.ts | 22 ----- test/app.e2e-spec.ts | 28 +++---- test/blog/blog-article.service.spec.ts | 8 +- test/blog/blog-term.service.spec.ts | 6 +- test/blog/blog-theme-config.service.spec.ts | 6 +- .../asset/asset-module-contract.spec.ts | 56 ++++++------- .../modules/blog/blog-module-contract.spec.ts | 80 +++++++++++-------- .../wordpress-module-contract.spec.ts | 71 ++++++++-------- test/wordpress/wordpress.service.spec.ts | 2 +- 41 files changed, 215 insertions(+), 241 deletions(-) delete mode 100644 src/blog/blog.module.ts delete mode 100644 src/minio/minio.module.ts rename src/{minio/minio.service.ts => modules/asset/application/asset-minio.service.ts} (99%) rename src/{minio/minio.controller.ts => modules/asset/contract/asset-minio.controller.ts} (98%) rename src/{minio/minio.dto.ts => modules/asset/contract/asset-minio.dto.ts} (100%) rename src/{minio/minio.types.ts => modules/asset/domain/asset-minio.types.ts} (100%) rename src/{blog => modules/blog/application}/blog-article.service.ts (98%) rename src/{blog => modules/blog/application}/blog-term.service.ts (97%) rename src/{blog => modules/blog/application}/blog-theme-config.service.ts (91%) rename src/{blog => modules/blog/contract}/blog-article.controller.ts (98%) rename src/{blog => modules/blog/contract}/blog-article.dto.ts (95%) rename src/{blog => modules/blog/contract}/blog-term.controller.ts (96%) rename src/{blog => modules/blog/contract}/blog-term.dto.ts (100%) rename src/{blog => modules/blog/contract}/blog-theme-config.controller.ts (94%) rename src/{blog => modules/blog/contract}/blog-theme-config.dto.ts (75%) rename src/{blog => modules/blog/infrastructure/persistence}/blog-article.entity.ts (100%) rename src/{blog => modules/blog/infrastructure/persistence}/blog-term.entity.ts (100%) rename src/{blog => modules/blog/infrastructure/persistence}/blog-theme-config.entity.ts (88%) rename src/{wordpress => modules/wordpress/application}/wordpress.service.ts (99%) rename src/{wordpress => modules/wordpress/contract}/wordpress-article.controller.ts (98%) rename src/{wordpress => modules/wordpress/contract}/wordpress-auth.controller.ts (96%) rename src/{wordpress => modules/wordpress/contract}/wordpress-category.controller.ts (97%) rename src/{wordpress => modules/wordpress/contract}/wordpress-tag.controller.ts (97%) rename src/{wordpress => modules/wordpress/contract}/wordpress-theme.controller.ts (90%) rename src/{wordpress => modules/wordpress/contract}/wordpress.dto.ts (100%) rename src/{wordpress => modules/wordpress/domain}/wordpress.types.ts (98%) delete mode 100644 src/modules/wordpress/wordpress-mirror.service.ts delete mode 100644 src/wordpress/wordpress.module.ts diff --git a/docs/refactor-v3/architecture-convergence-inventory.md b/docs/refactor-v3/architecture-convergence-inventory.md index d68d2f4..bb4fa72 100644 --- a/docs/refactor-v3/architecture-convergence-inventory.md +++ b/docs/refactor-v3/architecture-convergence-inventory.md @@ -15,7 +15,7 @@ | Domain | Deleted | Merged | Kept | Evidence | | --- | --- | --- | --- | --- | | Admin/Auth/Platform Config | `src/admin/example` if no active route evidence; empty old admin subdirectories | auth/user/role/menu/dept/component/dict/notice/system-log/timezone moved into `src/modules/admin/**`; duplicate old imports removed | route paths and public DTO class names kept | `rg '@/admin/' src test` returns no source hits; admin focused Jest passes | -| Blog/WordPress/Asset | none yet | none yet | current files before migration | baseline only | +| Blog/WordPress/Asset | old `src/blog`, `src/wordpress`, `src/minio`; legacy module wrappers after local imports replaced | MinIO internal files renamed into Asset module; Blog and WordPress controller/service/entity files moved under target modules | existing route decorators and response DTO behavior | `rg '@/blog/|@/wordpress/|@/minio/' src test` has no hits; Blog/WordPress/Asset focused tests pass | | Runtime/Common | none yet | none yet | current files before migration | baseline only | | QQBot Core/NapCat | none yet | none yet | current files before migration | baseline only | | Plugin Platform/Plugins | none yet | none yet | current files before migration | baseline only | diff --git a/src/blog/blog.module.ts b/src/blog/blog.module.ts deleted file mode 100644 index 12e93fb..0000000 --- a/src/blog/blog.module.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { Module } from '@nestjs/common'; -import { TypeOrmModule } from '@nestjs/typeorm'; -import { AdminAuthGuardModule } from '@/modules/admin/identity/auth/admin-auth-guard.module'; -import { CommonModule } from '@/common'; -import { WordpressModule } from '@/wordpress/wordpress.module'; -import { BlogArticleController } from './blog-article.controller'; -import { BlogArticle } from './blog-article.entity'; -import { BlogArticleService } from './blog-article.service'; -import { BlogThemeConfigController } from './blog-theme-config.controller'; -import { BlogThemeConfig } from './blog-theme-config.entity'; -import { BlogThemeConfigService } from './blog-theme-config.service'; -import { BlogTermController } from './blog-term.controller'; -import { BlogTerm } from './blog-term.entity'; -import { BlogTermService } from './blog-term.service'; - -@Module({ - imports: [ - AdminAuthGuardModule, - CommonModule, - WordpressModule, - TypeOrmModule.forFeature([BlogArticle, BlogTerm, BlogThemeConfig]), - ], - controllers: [ - BlogArticleController, - BlogTermController, - BlogThemeConfigController, - ], - providers: [BlogArticleService, BlogTermService, BlogThemeConfigService], - exports: [BlogArticleService, BlogTermService, BlogThemeConfigService], -}) -export class BlogModule {} diff --git a/src/minio/minio.module.ts b/src/minio/minio.module.ts deleted file mode 100644 index d550035..0000000 --- a/src/minio/minio.module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Module } from '@nestjs/common'; -import { ConfigModule } from '@nestjs/config'; -import { AdminAuthGuardModule } from '@/modules/admin/identity/auth/admin-auth-guard.module'; -import { MinioClientController } from './minio.controller'; -import { MinioClientService } from './minio.service'; - -@Module({ - imports: [AdminAuthGuardModule, ConfigModule], - controllers: [MinioClientController], - providers: [MinioClientService], - exports: [MinioClientService], -}) -export class MinioClientModule {} diff --git a/src/modules/admin/identity/auth/admin-auth.controller.ts b/src/modules/admin/identity/auth/admin-auth.controller.ts index 446a0a2..7143858 100644 --- a/src/modules/admin/identity/auth/admin-auth.controller.ts +++ b/src/modules/admin/identity/auth/admin-auth.controller.ts @@ -17,7 +17,7 @@ import { AdminAuthService } from './admin-auth.service'; import { AdminLoginDto } from './admin-auth.dto'; import { AdminPasswordCryptoService } from './admin-password-crypto.service'; import { JwtAuthGuard } from './jwt-auth.guard'; -import { WordpressService } from '@/modules/wordpress/wordpress-mirror.service'; +import { WordpressService } from '@/modules/wordpress/application/wordpress.service'; @ApiTags('Admin - 认证') @Controller() diff --git a/src/minio/minio.service.ts b/src/modules/asset/application/asset-minio.service.ts similarity index 99% rename from src/minio/minio.service.ts rename to src/modules/asset/application/asset-minio.service.ts index 19bf55a..21985bd 100644 --- a/src/minio/minio.service.ts +++ b/src/modules/asset/application/asset-minio.service.ts @@ -5,7 +5,7 @@ import type { MinioListObjectOptions, MinioObjectResult, MinioUploadObjectOptions, -} from './minio.types'; +} from '../domain/asset-minio.types'; @Injectable() export class MinioClientService { diff --git a/src/modules/asset/asset.module.ts b/src/modules/asset/asset.module.ts index ae00c35..c399ed1 100644 --- a/src/modules/asset/asset.module.ts +++ b/src/modules/asset/asset.module.ts @@ -1,7 +1,8 @@ import { Module } from '@nestjs/common'; -import { MinioClientController } from '@/minio/minio.controller'; -import { MinioClientModule } from '@/minio/minio.module'; -import { MinioClientService } from '@/minio/minio.service'; +import { ConfigModule } from '@nestjs/config'; +import { AdminAuthGuardModule } from '@/modules/admin/identity/auth/admin-auth-guard.module'; +import { MinioClientService } from './application/asset-minio.service'; +import { MinioClientController } from './contract/asset-minio.controller'; export const ASSET_CONTROLLERS = [MinioClientController]; @@ -41,7 +42,9 @@ export const ASSET_DOMAIN_CONTRACT = { } as const; @Module({ - imports: [MinioClientModule], - exports: [MinioClientModule], + imports: [AdminAuthGuardModule, ConfigModule], + controllers: ASSET_CONTROLLERS, + providers: ASSET_PROVIDERS, + exports: ASSET_PROVIDERS, }) export class AssetModule {} diff --git a/src/minio/minio.controller.ts b/src/modules/asset/contract/asset-minio.controller.ts similarity index 98% rename from src/minio/minio.controller.ts rename to src/modules/asset/contract/asset-minio.controller.ts index bd1ae8f..e2c0ada 100644 --- a/src/minio/minio.controller.ts +++ b/src/modules/asset/contract/asset-minio.controller.ts @@ -21,8 +21,8 @@ import { ApiTags, } from '@nestjs/swagger'; import { Response } from 'express'; -import { MinioClientService } from './minio.service'; -import type { MinioUploadFile } from './minio.types'; +import { MinioClientService } from '../application/asset-minio.service'; +import type { MinioUploadFile } from '../domain/asset-minio.types'; import { ApiFileDownloadResponse, ApiArrayResponse, @@ -35,7 +35,7 @@ import { MinioBucketStatusDto, MinioObjectDto, MinioUploadResultDto, -} from './minio.dto'; +} from './asset-minio.dto'; import { JwtAuthGuard } from '@/modules/admin/identity/auth/jwt-auth.guard'; const PROXY_RESOURCE_TIMEOUT = 1000 * 15; diff --git a/src/minio/minio.dto.ts b/src/modules/asset/contract/asset-minio.dto.ts similarity index 100% rename from src/minio/minio.dto.ts rename to src/modules/asset/contract/asset-minio.dto.ts diff --git a/src/minio/minio.types.ts b/src/modules/asset/domain/asset-minio.types.ts similarity index 100% rename from src/minio/minio.types.ts rename to src/modules/asset/domain/asset-minio.types.ts diff --git a/src/blog/blog-article.service.ts b/src/modules/blog/application/blog-article.service.ts similarity index 98% rename from src/blog/blog-article.service.ts rename to src/modules/blog/application/blog-article.service.ts index 2c5aaf7..e7fe89c 100644 --- a/src/blog/blog-article.service.ts +++ b/src/modules/blog/application/blog-article.service.ts @@ -2,19 +2,19 @@ import { HttpStatus, Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Brackets, Repository } from 'typeorm'; import { MarkdownService, throwVbenError, ToolsService } from '@/common'; +import { WordpressService } from '@/modules/wordpress/application/wordpress.service'; import { BlogArticle, type BlogArticleStatus, type BlogArticleTerm, -} from './blog-article.entity'; +} from '../infrastructure/persistence/blog-article.entity'; import type { BlogArticleBodyDto, BlogArticleImportWordpressDto, BlogArticleListQueryDto, BlogArticleTermOptionsQueryDto, BlogArticleUpdateBodyDto, -} from './blog-article.dto'; -import { WordpressService } from '@/wordpress/wordpress.service'; +} from '../contract/blog-article.dto'; import { BlogTermService } from './blog-term.service'; @Injectable() diff --git a/src/blog/blog-term.service.ts b/src/modules/blog/application/blog-term.service.ts similarity index 97% rename from src/blog/blog-term.service.ts rename to src/modules/blog/application/blog-term.service.ts index 14ed48c..8da9ccf 100644 --- a/src/blog/blog-term.service.ts +++ b/src/modules/blog/application/blog-term.service.ts @@ -5,13 +5,16 @@ import { throwVbenError, ToolsService } from '@/common'; import { BlogArticle, type BlogArticleTerm, -} from './blog-article.entity'; -import { BlogTerm, type BlogTermKind } from './blog-term.entity'; +} from '../infrastructure/persistence/blog-article.entity'; +import { + BlogTerm, + type BlogTermKind, +} from '../infrastructure/persistence/blog-term.entity'; import type { BlogTermBodyDto, BlogTermListQueryDto, BlogTermUpdateBodyDto, -} from './blog-term.dto'; +} from '../contract/blog-term.dto'; type CountedBlogTerm = BlogArticleTerm & { count: number; diff --git a/src/blog/blog-theme-config.service.ts b/src/modules/blog/application/blog-theme-config.service.ts similarity index 91% rename from src/blog/blog-theme-config.service.ts rename to src/modules/blog/application/blog-theme-config.service.ts index cf8bf2b..3444806 100644 --- a/src/blog/blog-theme-config.service.ts +++ b/src/modules/blog/application/blog-theme-config.service.ts @@ -2,10 +2,10 @@ import { HttpStatus, Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { throwVbenError, ToolsService } from '@/common'; -import { WordpressService } from '@/wordpress/wordpress.service'; -import type { WordpressArgonThemeConfig } from '@/wordpress/wordpress.types'; -import { BlogThemeConfigBodyDto } from './blog-theme-config.dto'; -import { BlogThemeConfig } from './blog-theme-config.entity'; +import { WordpressService } from '@/modules/wordpress/application/wordpress.service'; +import type { WordpressArgonThemeConfig } from '@/modules/wordpress/domain/wordpress.types'; +import { BlogThemeConfigBodyDto } from '../contract/blog-theme-config.dto'; +import { BlogThemeConfig } from '../infrastructure/persistence/blog-theme-config.entity'; const DEFAULT_THEME_ID = 'argon'; diff --git a/src/modules/blog/blog-content.module.ts b/src/modules/blog/blog-content.module.ts index 8bdfe70..de58925 100644 --- a/src/modules/blog/blog-content.module.ts +++ b/src/modules/blog/blog-content.module.ts @@ -1,11 +1,17 @@ import { Module } from '@nestjs/common'; -import { BlogArticleController } from '@/blog/blog-article.controller'; -import { BlogArticleService } from '@/blog/blog-article.service'; -import { BlogModule } from '@/blog/blog.module'; -import { BlogTermController } from '@/blog/blog-term.controller'; -import { BlogTermService } from '@/blog/blog-term.service'; -import { BlogThemeConfigController } from '@/blog/blog-theme-config.controller'; -import { BlogThemeConfigService } from '@/blog/blog-theme-config.service'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { CommonModule } from '@/common'; +import { AdminAuthGuardModule } from '@/modules/admin/identity/auth/admin-auth-guard.module'; +import { WordpressMirrorModule } from '@/modules/wordpress/wordpress-mirror.module'; +import { BlogArticleService } from './application/blog-article.service'; +import { BlogTermService } from './application/blog-term.service'; +import { BlogThemeConfigService } from './application/blog-theme-config.service'; +import { BlogArticleController } from './contract/blog-article.controller'; +import { BlogTermController } from './contract/blog-term.controller'; +import { BlogThemeConfigController } from './contract/blog-theme-config.controller'; +import { BlogArticle } from './infrastructure/persistence/blog-article.entity'; +import { BlogTerm } from './infrastructure/persistence/blog-term.entity'; +import { BlogThemeConfig } from './infrastructure/persistence/blog-theme-config.entity'; export const BLOG_CONTENT_CONTROLLERS = [ BlogArticleController, @@ -60,7 +66,14 @@ export const BLOG_CONTENT_DOMAIN_CONTRACT = { } as const; @Module({ - imports: [BlogModule], - exports: [BlogModule], + imports: [ + AdminAuthGuardModule, + CommonModule, + WordpressMirrorModule, + TypeOrmModule.forFeature([BlogArticle, BlogTerm, BlogThemeConfig]), + ], + controllers: BLOG_CONTENT_CONTROLLERS, + providers: BLOG_CONTENT_PROVIDERS, + exports: BLOG_CONTENT_PROVIDERS, }) export class BlogContentModule {} diff --git a/src/blog/blog-article.controller.ts b/src/modules/blog/contract/blog-article.controller.ts similarity index 98% rename from src/blog/blog-article.controller.ts rename to src/modules/blog/contract/blog-article.controller.ts index 5ebd185..a2dd3fc 100644 --- a/src/blog/blog-article.controller.ts +++ b/src/modules/blog/contract/blog-article.controller.ts @@ -19,7 +19,7 @@ import { BlogArticleTermOptionsQueryDto, BlogArticleUpdateBodyDto, } from './blog-article.dto'; -import { BlogArticleService } from './blog-article.service'; +import { BlogArticleService } from '../application/blog-article.service'; @ApiTags('Blog - 文章') @Controller('blog/article') diff --git a/src/blog/blog-article.dto.ts b/src/modules/blog/contract/blog-article.dto.ts similarity index 95% rename from src/blog/blog-article.dto.ts rename to src/modules/blog/contract/blog-article.dto.ts index 21c2dc1..ceec0bd 100644 --- a/src/blog/blog-article.dto.ts +++ b/src/modules/blog/contract/blog-article.dto.ts @@ -1,5 +1,8 @@ import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; -import type { BlogArticleStatus, BlogArticleTerm } from './blog-article.entity'; +import type { + BlogArticleStatus, + BlogArticleTerm, +} from '../infrastructure/persistence/blog-article.entity'; export class BlogArticleListQueryDto { @ApiPropertyOptional({ diff --git a/src/blog/blog-term.controller.ts b/src/modules/blog/contract/blog-term.controller.ts similarity index 96% rename from src/blog/blog-term.controller.ts rename to src/modules/blog/contract/blog-term.controller.ts index 491d24f..3a55634 100644 --- a/src/blog/blog-term.controller.ts +++ b/src/modules/blog/contract/blog-term.controller.ts @@ -12,13 +12,13 @@ import { import { ApiOperation, ApiQuery, ApiTags } from '@nestjs/swagger'; import { JwtAuthGuard } from '@/modules/admin/identity/auth/jwt-auth.guard'; import { vbenSuccess } from '@/common'; -import type { BlogTermKind } from './blog-term.entity'; +import type { BlogTermKind } from '../infrastructure/persistence/blog-term.entity'; import { BlogTermBodyDto, BlogTermListQueryDto, BlogTermUpdateBodyDto, } from './blog-term.dto'; -import { BlogTermService } from './blog-term.service'; +import { BlogTermService } from '../application/blog-term.service'; @ApiTags('Blog - 分类标签') @Controller('blog') diff --git a/src/blog/blog-term.dto.ts b/src/modules/blog/contract/blog-term.dto.ts similarity index 100% rename from src/blog/blog-term.dto.ts rename to src/modules/blog/contract/blog-term.dto.ts diff --git a/src/blog/blog-theme-config.controller.ts b/src/modules/blog/contract/blog-theme-config.controller.ts similarity index 94% rename from src/blog/blog-theme-config.controller.ts rename to src/modules/blog/contract/blog-theme-config.controller.ts index 0f3d499..84f4bce 100644 --- a/src/blog/blog-theme-config.controller.ts +++ b/src/modules/blog/contract/blog-theme-config.controller.ts @@ -12,7 +12,7 @@ import { ApiOperation, ApiTags } from '@nestjs/swagger'; import { JwtAuthGuard } from '@/modules/admin/identity/auth/jwt-auth.guard'; import { Public, vbenSuccess } from '@/common'; import { BlogThemeConfigBodyDto } from './blog-theme-config.dto'; -import { BlogThemeConfigService } from './blog-theme-config.service'; +import { BlogThemeConfigService } from '../application/blog-theme-config.service'; @ApiTags('Blog - 主题') @Controller('blog/theme') diff --git a/src/blog/blog-theme-config.dto.ts b/src/modules/blog/contract/blog-theme-config.dto.ts similarity index 75% rename from src/blog/blog-theme-config.dto.ts rename to src/modules/blog/contract/blog-theme-config.dto.ts index 13ef4f8..c123caa 100644 --- a/src/blog/blog-theme-config.dto.ts +++ b/src/modules/blog/contract/blog-theme-config.dto.ts @@ -1,5 +1,5 @@ import { ApiPropertyOptional } from '@nestjs/swagger'; -import type { WordpressArgonThemeConfig } from '@/wordpress/wordpress.types'; +import type { WordpressArgonThemeConfig } from '@/modules/wordpress/domain/wordpress.types'; export class BlogThemeConfigBodyDto { @ApiPropertyOptional({ diff --git a/src/blog/blog-article.entity.ts b/src/modules/blog/infrastructure/persistence/blog-article.entity.ts similarity index 100% rename from src/blog/blog-article.entity.ts rename to src/modules/blog/infrastructure/persistence/blog-article.entity.ts diff --git a/src/blog/blog-term.entity.ts b/src/modules/blog/infrastructure/persistence/blog-term.entity.ts similarity index 100% rename from src/blog/blog-term.entity.ts rename to src/modules/blog/infrastructure/persistence/blog-term.entity.ts diff --git a/src/blog/blog-theme-config.entity.ts b/src/modules/blog/infrastructure/persistence/blog-theme-config.entity.ts similarity index 88% rename from src/blog/blog-theme-config.entity.ts rename to src/modules/blog/infrastructure/persistence/blog-theme-config.entity.ts index 6ed830f..e0b4117 100644 --- a/src/blog/blog-theme-config.entity.ts +++ b/src/modules/blog/infrastructure/persistence/blog-theme-config.entity.ts @@ -1,7 +1,7 @@ import { Column, Entity, PrimaryColumn } from 'typeorm'; import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; import { KtCreateDateColumn, KtDateTime, KtUpdateDateColumn } from '@/common'; -import type { WordpressArgonThemeConfig } from '@/wordpress/wordpress.types'; +import type { WordpressArgonThemeConfig } from '@/modules/wordpress/domain/wordpress.types'; @Entity('blog_theme_config') export class BlogThemeConfig { diff --git a/src/wordpress/wordpress.service.ts b/src/modules/wordpress/application/wordpress.service.ts similarity index 99% rename from src/wordpress/wordpress.service.ts rename to src/modules/wordpress/application/wordpress.service.ts index d5078b5..8e1cb11 100644 --- a/src/wordpress/wordpress.service.ts +++ b/src/modules/wordpress/application/wordpress.service.ts @@ -10,7 +10,7 @@ import type { WordpressArticleListQueryDto, WordpressTermBodyDto, WordpressTermListQueryDto, -} from './wordpress.dto'; +} from '../contract/wordpress.dto'; import type { WordpressAuthContext, WordpressAvailabilityCache, @@ -22,7 +22,7 @@ import type { WordpressResponse, WordpressArgonThemeConfig, WordpressArgonMenuItem, -} from './wordpress.types'; +} from '../domain/wordpress.types'; const WORDPRESS_COOKIE_PREFIXES = [ 'wordpress_', diff --git a/src/wordpress/wordpress-article.controller.ts b/src/modules/wordpress/contract/wordpress-article.controller.ts similarity index 98% rename from src/wordpress/wordpress-article.controller.ts rename to src/modules/wordpress/contract/wordpress-article.controller.ts index e116248..efd6c91 100644 --- a/src/wordpress/wordpress-article.controller.ts +++ b/src/modules/wordpress/contract/wordpress-article.controller.ts @@ -19,7 +19,7 @@ import { WordpressArticleListQueryDto, WordpressArticleUpdateBodyDto, } from './wordpress.dto'; -import { WordpressService } from './wordpress.service'; +import { WordpressService } from '../application/wordpress.service'; @ApiTags('WordPress - 文章') @ApiHeader({ diff --git a/src/wordpress/wordpress-auth.controller.ts b/src/modules/wordpress/contract/wordpress-auth.controller.ts similarity index 96% rename from src/wordpress/wordpress-auth.controller.ts rename to src/modules/wordpress/contract/wordpress-auth.controller.ts index e7130f4..55be538 100644 --- a/src/wordpress/wordpress-auth.controller.ts +++ b/src/modules/wordpress/contract/wordpress-auth.controller.ts @@ -10,7 +10,7 @@ import { ApiHeader, ApiOperation, ApiTags } from '@nestjs/swagger'; import type { Request, Response } from 'express'; import { JwtAuthGuard } from '@/modules/admin/identity/auth/jwt-auth.guard'; import { Public, vbenSuccess } from '@/common'; -import { WordpressService } from './wordpress.service'; +import { WordpressService } from '../application/wordpress.service'; @ApiTags('WordPress - 认证') @ApiHeader({ diff --git a/src/wordpress/wordpress-category.controller.ts b/src/modules/wordpress/contract/wordpress-category.controller.ts similarity index 97% rename from src/wordpress/wordpress-category.controller.ts rename to src/modules/wordpress/contract/wordpress-category.controller.ts index d58ad97..10cfa0d 100644 --- a/src/wordpress/wordpress-category.controller.ts +++ b/src/modules/wordpress/contract/wordpress-category.controller.ts @@ -19,7 +19,7 @@ import { WordpressTermListQueryDto, WordpressTermUpdateBodyDto, } from './wordpress.dto'; -import { WordpressService } from './wordpress.service'; +import { WordpressService } from '../application/wordpress.service'; @ApiTags('WordPress - 分类') @ApiHeader({ diff --git a/src/wordpress/wordpress-tag.controller.ts b/src/modules/wordpress/contract/wordpress-tag.controller.ts similarity index 97% rename from src/wordpress/wordpress-tag.controller.ts rename to src/modules/wordpress/contract/wordpress-tag.controller.ts index 93894a8..6793e40 100644 --- a/src/wordpress/wordpress-tag.controller.ts +++ b/src/modules/wordpress/contract/wordpress-tag.controller.ts @@ -19,7 +19,7 @@ import { WordpressTermListQueryDto, WordpressTermUpdateBodyDto, } from './wordpress.dto'; -import { WordpressService } from './wordpress.service'; +import { WordpressService } from '../application/wordpress.service'; @ApiTags('WordPress - 标签') @ApiHeader({ diff --git a/src/wordpress/wordpress-theme.controller.ts b/src/modules/wordpress/contract/wordpress-theme.controller.ts similarity index 90% rename from src/wordpress/wordpress-theme.controller.ts rename to src/modules/wordpress/contract/wordpress-theme.controller.ts index c9f6c5b..cce175c 100644 --- a/src/wordpress/wordpress-theme.controller.ts +++ b/src/modules/wordpress/contract/wordpress-theme.controller.ts @@ -2,7 +2,7 @@ import { Controller, Get, Res, UseGuards } from '@nestjs/common'; import { ApiOperation, ApiTags } from '@nestjs/swagger'; import { JwtAuthGuard } from '@/modules/admin/identity/auth/jwt-auth.guard'; import { Public, vbenSuccess } from '@/common'; -import { WordpressService } from './wordpress.service'; +import { WordpressService } from '../application/wordpress.service'; @ApiTags('WordPress - 主题') @Controller('wordpress/theme') diff --git a/src/wordpress/wordpress.dto.ts b/src/modules/wordpress/contract/wordpress.dto.ts similarity index 100% rename from src/wordpress/wordpress.dto.ts rename to src/modules/wordpress/contract/wordpress.dto.ts diff --git a/src/wordpress/wordpress.types.ts b/src/modules/wordpress/domain/wordpress.types.ts similarity index 98% rename from src/wordpress/wordpress.types.ts rename to src/modules/wordpress/domain/wordpress.types.ts index d19769a..e12d408 100644 --- a/src/wordpress/wordpress.types.ts +++ b/src/modules/wordpress/domain/wordpress.types.ts @@ -1,7 +1,7 @@ import type { WordpressArticleListQueryDto, WordpressTermListQueryDto, -} from './wordpress.dto'; +} from '../contract/wordpress.dto'; export type WordpressAuthContext = { authorization?: string; diff --git a/src/modules/wordpress/wordpress-mirror.module.ts b/src/modules/wordpress/wordpress-mirror.module.ts index 2c40753..bd8df77 100644 --- a/src/modules/wordpress/wordpress-mirror.module.ts +++ b/src/modules/wordpress/wordpress-mirror.module.ts @@ -1,11 +1,11 @@ import { Module } from '@nestjs/common'; -import { WordpressArticleController } from '@/wordpress/wordpress-article.controller'; -import { WordpressAuthController } from '@/wordpress/wordpress-auth.controller'; -import { WordpressCategoryController } from '@/wordpress/wordpress-category.controller'; -import { WordpressModule } from '@/wordpress/wordpress.module'; -import { WordpressService } from '@/wordpress/wordpress.service'; -import { WordpressTagController } from '@/wordpress/wordpress-tag.controller'; -import { WordpressThemeController } from '@/wordpress/wordpress-theme.controller'; +import { AdminAuthGuardModule } from '@/modules/admin/identity/auth/admin-auth-guard.module'; +import { WordpressService } from './application/wordpress.service'; +import { WordpressArticleController } from './contract/wordpress-article.controller'; +import { WordpressAuthController } from './contract/wordpress-auth.controller'; +import { WordpressCategoryController } from './contract/wordpress-category.controller'; +import { WordpressTagController } from './contract/wordpress-tag.controller'; +import { WordpressThemeController } from './contract/wordpress-theme.controller'; export const WORDPRESS_MIRROR_CONTROLLERS = [ WordpressAuthController, @@ -53,7 +53,9 @@ export const WORDPRESS_MIRROR_DOMAIN_CONTRACT = { } as const; @Module({ - imports: [WordpressModule], - exports: [WordpressModule], + imports: [AdminAuthGuardModule], + controllers: WORDPRESS_MIRROR_CONTROLLERS, + providers: WORDPRESS_MIRROR_PROVIDERS, + exports: WORDPRESS_MIRROR_PROVIDERS, }) export class WordpressMirrorModule {} diff --git a/src/modules/wordpress/wordpress-mirror.service.ts b/src/modules/wordpress/wordpress-mirror.service.ts deleted file mode 100644 index 0401b20..0000000 --- a/src/modules/wordpress/wordpress-mirror.service.ts +++ /dev/null @@ -1 +0,0 @@ -export { WordpressService } from '@/wordpress/wordpress.service'; diff --git a/src/wordpress/wordpress.module.ts b/src/wordpress/wordpress.module.ts deleted file mode 100644 index 485e42d..0000000 --- a/src/wordpress/wordpress.module.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Module } from '@nestjs/common'; -import { AdminAuthGuardModule } from '@/modules/admin/identity/auth/admin-auth-guard.module'; -import { WordpressArticleController } from './wordpress-article.controller'; -import { WordpressAuthController } from './wordpress-auth.controller'; -import { WordpressCategoryController } from './wordpress-category.controller'; -import { WordpressService } from './wordpress.service'; -import { WordpressTagController } from './wordpress-tag.controller'; -import { WordpressThemeController } from './wordpress-theme.controller'; - -@Module({ - imports: [AdminAuthGuardModule], - controllers: [ - WordpressAuthController, - WordpressArticleController, - WordpressTagController, - WordpressCategoryController, - WordpressThemeController, - ], - providers: [WordpressService], - exports: [WordpressService], -}) -export class WordpressModule {} diff --git a/test/app.e2e-spec.ts b/test/app.e2e-spec.ts index 9a5b0ee..048ed24 100644 --- a/test/app.e2e-spec.ts +++ b/test/app.e2e-spec.ts @@ -19,20 +19,20 @@ import { SaveBodyInterceptor, ToolsService, } from '../src/common'; -import { BlogArticleController } from '../src/blog/blog-article.controller'; -import { BlogArticleService } from '../src/blog/blog-article.service'; -import { BlogThemeConfigController } from '../src/blog/blog-theme-config.controller'; -import { BlogThemeConfigService } from '../src/blog/blog-theme-config.service'; -import { BlogTermController } from '../src/blog/blog-term.controller'; -import { BlogTermService } from '../src/blog/blog-term.service'; -import { MinioClientController } from '../src/minio/minio.controller'; -import { MinioClientService } from '../src/minio/minio.service'; -import { WordpressArticleController } from '../src/wordpress/wordpress-article.controller'; -import { WordpressAuthController } from '../src/wordpress/wordpress-auth.controller'; -import { WordpressCategoryController } from '../src/wordpress/wordpress-category.controller'; -import { WordpressService } from '../src/wordpress/wordpress.service'; -import { WordpressTagController } from '../src/wordpress/wordpress-tag.controller'; -import { WordpressThemeController } from '../src/wordpress/wordpress-theme.controller'; +import { BlogArticleService } from '../src/modules/blog/application/blog-article.service'; +import { BlogTermService } from '../src/modules/blog/application/blog-term.service'; +import { BlogThemeConfigService } from '../src/modules/blog/application/blog-theme-config.service'; +import { BlogArticleController } from '../src/modules/blog/contract/blog-article.controller'; +import { BlogTermController } from '../src/modules/blog/contract/blog-term.controller'; +import { BlogThemeConfigController } from '../src/modules/blog/contract/blog-theme-config.controller'; +import { MinioClientService } from '../src/modules/asset/application/asset-minio.service'; +import { MinioClientController } from '../src/modules/asset/contract/asset-minio.controller'; +import { WordpressService } from '../src/modules/wordpress/application/wordpress.service'; +import { WordpressArticleController } from '../src/modules/wordpress/contract/wordpress-article.controller'; +import { WordpressAuthController } from '../src/modules/wordpress/contract/wordpress-auth.controller'; +import { WordpressCategoryController } from '../src/modules/wordpress/contract/wordpress-category.controller'; +import { WordpressTagController } from '../src/modules/wordpress/contract/wordpress-tag.controller'; +import { WordpressThemeController } from '../src/modules/wordpress/contract/wordpress-theme.controller'; import { PinoLogger } from 'nestjs-pino'; import { collectControllerRoutes, diff --git a/test/blog/blog-article.service.spec.ts b/test/blog/blog-article.service.spec.ts index 1dfc06a..7512b61 100644 --- a/test/blog/blog-article.service.spec.ts +++ b/test/blog/blog-article.service.spec.ts @@ -1,10 +1,10 @@ import { getRepositoryToken } from '@nestjs/typeorm'; import { Test } from '@nestjs/testing'; import { MarkdownService, ToolsService } from '../../src/common'; -import { BlogArticle } from '../../src/blog/blog-article.entity'; -import { BlogArticleService } from '../../src/blog/blog-article.service'; -import { BlogTermService } from '../../src/blog/blog-term.service'; -import { WordpressService } from '../../src/wordpress/wordpress.service'; +import { BlogArticleService } from '../../src/modules/blog/application/blog-article.service'; +import { BlogTermService } from '../../src/modules/blog/application/blog-term.service'; +import { BlogArticle } from '../../src/modules/blog/infrastructure/persistence/blog-article.entity'; +import { WordpressService } from '../../src/modules/wordpress/application/wordpress.service'; describe('BlogArticleService', () => { let service: BlogArticleService; diff --git a/test/blog/blog-term.service.spec.ts b/test/blog/blog-term.service.spec.ts index e6140d7..4d50756 100644 --- a/test/blog/blog-term.service.spec.ts +++ b/test/blog/blog-term.service.spec.ts @@ -1,9 +1,9 @@ import { getRepositoryToken } from '@nestjs/typeorm'; import { Test } from '@nestjs/testing'; import { ToolsService } from '../../src/common'; -import { BlogArticle } from '../../src/blog/blog-article.entity'; -import { BlogTerm } from '../../src/blog/blog-term.entity'; -import { BlogTermService } from '../../src/blog/blog-term.service'; +import { BlogTermService } from '../../src/modules/blog/application/blog-term.service'; +import { BlogArticle } from '../../src/modules/blog/infrastructure/persistence/blog-article.entity'; +import { BlogTerm } from '../../src/modules/blog/infrastructure/persistence/blog-term.entity'; describe('BlogTermService', () => { let service: BlogTermService; diff --git a/test/blog/blog-theme-config.service.spec.ts b/test/blog/blog-theme-config.service.spec.ts index 7b5be5b..b650708 100644 --- a/test/blog/blog-theme-config.service.spec.ts +++ b/test/blog/blog-theme-config.service.spec.ts @@ -1,9 +1,9 @@ import { getRepositoryToken } from '@nestjs/typeorm'; import { Test } from '@nestjs/testing'; import { ToolsService } from '../../src/common'; -import { BlogThemeConfig } from '../../src/blog/blog-theme-config.entity'; -import { BlogThemeConfigService } from '../../src/blog/blog-theme-config.service'; -import { WordpressService } from '../../src/wordpress/wordpress.service'; +import { BlogThemeConfigService } from '../../src/modules/blog/application/blog-theme-config.service'; +import { BlogThemeConfig } from '../../src/modules/blog/infrastructure/persistence/blog-theme-config.entity'; +import { WordpressService } from '../../src/modules/wordpress/application/wordpress.service'; describe('BlogThemeConfigService', () => { let service: BlogThemeConfigService; diff --git a/test/modules/asset/asset-module-contract.spec.ts b/test/modules/asset/asset-module-contract.spec.ts index 7cbd3a0..a6fd834 100644 --- a/test/modules/asset/asset-module-contract.spec.ts +++ b/test/modules/asset/asset-module-contract.spec.ts @@ -3,16 +3,17 @@ jest.mock('../../../src/modules/qqbot/core/qqbot-core.module', () => ({ })); import { MODULE_METADATA } from '@nestjs/common/constants'; +import { ConfigModule } from '@nestjs/config'; import { AppModule } from '../../../src/app.module'; -import { MinioClientController } from '../../../src/minio/minio.controller'; -import { MinioClientModule } from '../../../src/minio/minio.module'; -import { MinioClientService } from '../../../src/minio/minio.service'; +import { AdminAuthGuardModule } from '../../../src/modules/admin/identity/auth/admin-auth-guard.module'; import { ASSET_CONTROLLERS, ASSET_DOMAIN_CONTRACT, ASSET_PROVIDERS, AssetModule, } from '../../../src/modules/asset/asset.module'; +import { MinioClientService } from '../../../src/modules/asset/application/asset-minio.service'; +import { MinioClientController } from '../../../src/modules/asset/contract/asset-minio.controller'; import { AdminPlatformConfigModule } from '../../../src/modules/admin/platform-config/admin-platform-config.module'; import { collectControllerRoutes, @@ -24,18 +25,13 @@ const getModuleMetadata = (moduleClass: unknown, key: string): T[] => { return Reflect.getMetadata(key, moduleClass) || []; }; -const expectControllersNotRegisteredDirectly = ( - moduleClass: unknown, - controllers: unknown[], -) => { - const directControllers = getModuleMetadata( - moduleClass, - MODULE_METADATA.CONTROLLERS, - ); - - for (const controller of controllers) { - expect(directControllers).not.toContain(controller); - } +const expectNoModuleNamed = (modules: unknown[], moduleName: string) => { + expect( + modules.some( + (moduleRef) => + typeof moduleRef === 'function' && moduleRef.name === moduleName, + ), + ).toBe(false); }; describe('Asset module contract', () => { @@ -62,30 +58,34 @@ describe('Asset module contract', () => { expect(getModuleMetadata(AppModule, MODULE_METADATA.IMPORTS)).toEqual( expect.arrayContaining([AssetModule]), ); - expect(getModuleMetadata(AppModule, MODULE_METADATA.IMPORTS)).not.toEqual( - expect.arrayContaining([MinioClientModule]), - ); expect( getModuleMetadata(AdminPlatformConfigModule, MODULE_METADATA.IMPORTS), ).toEqual(expect.arrayContaining([AssetModule])); - expect( - getModuleMetadata(AdminPlatformConfigModule, MODULE_METADATA.IMPORTS), - ).not.toEqual(expect.arrayContaining([MinioClientModule])); - expect(getModuleMetadata(AssetModule, MODULE_METADATA.IMPORTS)).toEqual( - expect.arrayContaining([MinioClientModule]), + const appImports = getModuleMetadata(AppModule, MODULE_METADATA.IMPORTS); + const platformImports = getModuleMetadata( + AdminPlatformConfigModule, + MODULE_METADATA.IMPORTS, ); - expect(getModuleMetadata(AssetModule, MODULE_METADATA.EXPORTS)).toEqual( - expect.arrayContaining([MinioClientModule]), + const assetImports = getModuleMetadata(AssetModule, MODULE_METADATA.IMPORTS); + const assetExports = getModuleMetadata(AssetModule, MODULE_METADATA.EXPORTS); + + expectNoModuleNamed(appImports, 'MinioClientModule'); + expectNoModuleNamed(platformImports, 'MinioClientModule'); + expectNoModuleNamed(assetImports, 'MinioClientModule'); + expectNoModuleNamed(assetExports, 'MinioClientModule'); + + expect(assetImports).toEqual( + expect.arrayContaining([AdminAuthGuardModule, ConfigModule]), ); - expectControllersNotRegisteredDirectly(AssetModule, ASSET_CONTROLLERS); expect( - getModuleMetadata(MinioClientModule, MODULE_METADATA.CONTROLLERS), + getModuleMetadata(AssetModule, MODULE_METADATA.CONTROLLERS), ).toEqual(expect.arrayContaining([MinioClientController])); expect( - getModuleMetadata(MinioClientModule, MODULE_METADATA.PROVIDERS), + getModuleMetadata(AssetModule, MODULE_METADATA.PROVIDERS), ).toEqual(expect.arrayContaining([MinioClientService])); + expect(assetExports).toEqual(expect.arrayContaining([MinioClientService])); expect(ASSET_CONTROLLERS).toEqual( expect.arrayContaining([MinioClientController]), ); diff --git a/test/modules/blog/blog-module-contract.spec.ts b/test/modules/blog/blog-module-contract.spec.ts index ce34d13..6cae72f 100644 --- a/test/modules/blog/blog-module-contract.spec.ts +++ b/test/modules/blog/blog-module-contract.spec.ts @@ -4,19 +4,21 @@ jest.mock('../../../src/modules/qqbot/core/qqbot-core.module', () => ({ import { MODULE_METADATA } from '@nestjs/common/constants'; import { AppModule } from '../../../src/app.module'; -import { BlogArticleController } from '../../../src/blog/blog-article.controller'; -import { BlogArticleService } from '../../../src/blog/blog-article.service'; -import { BlogModule } from '../../../src/blog/blog.module'; -import { BlogTermController } from '../../../src/blog/blog-term.controller'; -import { BlogTermService } from '../../../src/blog/blog-term.service'; -import { BlogThemeConfigController } from '../../../src/blog/blog-theme-config.controller'; -import { BlogThemeConfigService } from '../../../src/blog/blog-theme-config.service'; +import { CommonModule } from '../../../src/common'; +import { AdminAuthGuardModule } from '../../../src/modules/admin/identity/auth/admin-auth-guard.module'; +import { BlogArticleService } from '../../../src/modules/blog/application/blog-article.service'; +import { BlogTermService } from '../../../src/modules/blog/application/blog-term.service'; +import { BlogThemeConfigService } from '../../../src/modules/blog/application/blog-theme-config.service'; +import { BlogArticleController } from '../../../src/modules/blog/contract/blog-article.controller'; +import { BlogTermController } from '../../../src/modules/blog/contract/blog-term.controller'; +import { BlogThemeConfigController } from '../../../src/modules/blog/contract/blog-theme-config.controller'; import { BLOG_CONTENT_CONTROLLERS, BLOG_CONTENT_DOMAIN_CONTRACT, BLOG_CONTENT_PROVIDERS, BlogContentModule, } from '../../../src/modules/blog/blog-content.module'; +import { WordpressMirrorModule } from '../../../src/modules/wordpress/wordpress-mirror.module'; import { collectControllerRoutes, routeKey, @@ -27,18 +29,13 @@ const getModuleMetadata = (moduleClass: unknown, key: string): T[] => { return Reflect.getMetadata(key, moduleClass) || []; }; -const expectControllersNotRegisteredDirectly = ( - moduleClass: unknown, - controllers: unknown[], -) => { - const directControllers = getModuleMetadata( - moduleClass, - MODULE_METADATA.CONTROLLERS, - ); - - for (const controller of controllers) { - expect(directControllers).not.toContain(controller); - } +const expectNoModuleNamed = (modules: unknown[], moduleName: string) => { + expect( + modules.some( + (moduleRef) => + typeof moduleRef === 'function' && moduleRef.name === moduleName, + ), + ).toBe(false); }; describe('Blog content module contract', () => { @@ -81,29 +78,48 @@ describe('Blog content module contract', () => { expect(getModuleMetadata(AppModule, MODULE_METADATA.IMPORTS)).toEqual( expect.arrayContaining([BlogContentModule]), ); - expect(getModuleMetadata(AppModule, MODULE_METADATA.IMPORTS)).not.toEqual( - expect.arrayContaining([BlogModule]), - ); - expect( - getModuleMetadata(BlogContentModule, MODULE_METADATA.IMPORTS), - ).toEqual(expect.arrayContaining([BlogModule])); - expect( - getModuleMetadata(BlogContentModule, MODULE_METADATA.EXPORTS), - ).toEqual(expect.arrayContaining([BlogModule])); - expectControllersNotRegisteredDirectly( + const appImports = getModuleMetadata(AppModule, MODULE_METADATA.IMPORTS); + const blogImports = getModuleMetadata( BlogContentModule, - BLOG_CONTENT_CONTROLLERS, + MODULE_METADATA.IMPORTS, + ); + const blogExports = getModuleMetadata( + BlogContentModule, + MODULE_METADATA.EXPORTS, ); - expect(getModuleMetadata(BlogModule, MODULE_METADATA.CONTROLLERS)).toEqual( + expectNoModuleNamed(appImports, 'BlogModule'); + expectNoModuleNamed(blogImports, 'BlogModule'); + expectNoModuleNamed(blogExports, 'BlogModule'); + + expect(blogImports).toEqual( + expect.arrayContaining([ + AdminAuthGuardModule, + CommonModule, + WordpressMirrorModule, + ]), + ); + expect( + blogImports.some( + (moduleRef: any) => moduleRef?.module?.name === 'TypeOrmModule', + ), + ).toBe(true); + expect(getModuleMetadata(BlogContentModule, MODULE_METADATA.CONTROLLERS)).toEqual( expect.arrayContaining([ BlogArticleController, BlogTermController, BlogThemeConfigController, ]), ); - expect(getModuleMetadata(BlogModule, MODULE_METADATA.PROVIDERS)).toEqual( + expect(getModuleMetadata(BlogContentModule, MODULE_METADATA.PROVIDERS)).toEqual( + expect.arrayContaining([ + BlogArticleService, + BlogTermService, + BlogThemeConfigService, + ]), + ); + expect(blogExports).toEqual( expect.arrayContaining([ BlogArticleService, BlogTermService, diff --git a/test/modules/wordpress/wordpress-module-contract.spec.ts b/test/modules/wordpress/wordpress-module-contract.spec.ts index 3a61644..ec7faf0 100644 --- a/test/modules/wordpress/wordpress-module-contract.spec.ts +++ b/test/modules/wordpress/wordpress-module-contract.spec.ts @@ -4,20 +4,20 @@ jest.mock('../../../src/modules/qqbot/core/qqbot-core.module', () => ({ import { MODULE_METADATA } from '@nestjs/common/constants'; import { AppModule } from '../../../src/app.module'; +import { AdminAuthGuardModule } from '../../../src/modules/admin/identity/auth/admin-auth-guard.module'; import { AdminIdentityModule } from '../../../src/modules/admin/identity/admin-identity.module'; +import { WordpressService } from '../../../src/modules/wordpress/application/wordpress.service'; +import { WordpressArticleController } from '../../../src/modules/wordpress/contract/wordpress-article.controller'; +import { WordpressAuthController } from '../../../src/modules/wordpress/contract/wordpress-auth.controller'; +import { WordpressCategoryController } from '../../../src/modules/wordpress/contract/wordpress-category.controller'; +import { WordpressTagController } from '../../../src/modules/wordpress/contract/wordpress-tag.controller'; +import { WordpressThemeController } from '../../../src/modules/wordpress/contract/wordpress-theme.controller'; import { WORDPRESS_MIRROR_CONTROLLERS, WORDPRESS_MIRROR_DOMAIN_CONTRACT, WORDPRESS_MIRROR_PROVIDERS, WordpressMirrorModule, } from '../../../src/modules/wordpress/wordpress-mirror.module'; -import { WordpressArticleController } from '../../../src/wordpress/wordpress-article.controller'; -import { WordpressAuthController } from '../../../src/wordpress/wordpress-auth.controller'; -import { WordpressCategoryController } from '../../../src/wordpress/wordpress-category.controller'; -import { WordpressModule } from '../../../src/wordpress/wordpress.module'; -import { WordpressService } from '../../../src/wordpress/wordpress.service'; -import { WordpressTagController } from '../../../src/wordpress/wordpress-tag.controller'; -import { WordpressThemeController } from '../../../src/wordpress/wordpress-theme.controller'; import { collectControllerRoutes, routeKey, @@ -28,18 +28,13 @@ const getModuleMetadata = (moduleClass: unknown, key: string): T[] => { return Reflect.getMetadata(key, moduleClass) || []; }; -const expectControllersNotRegisteredDirectly = ( - moduleClass: unknown, - controllers: unknown[], -) => { - const directControllers = getModuleMetadata( - moduleClass, - MODULE_METADATA.CONTROLLERS, - ); - - for (const controller of controllers) { - expect(directControllers).not.toContain(controller); - } +const expectNoModuleNamed = (modules: unknown[], moduleName: string) => { + expect( + modules.some( + (moduleRef) => + typeof moduleRef === 'function' && moduleRef.name === moduleName, + ), + ).toBe(false); }; describe('WordPress mirror module contract', () => { @@ -79,29 +74,34 @@ describe('WordPress mirror module contract', () => { expect(getModuleMetadata(AppModule, MODULE_METADATA.IMPORTS)).toEqual( expect.arrayContaining([WordpressMirrorModule]), ); - expect(getModuleMetadata(AppModule, MODULE_METADATA.IMPORTS)).not.toEqual( - expect.arrayContaining([WordpressModule]), - ); expect( getModuleMetadata(AdminIdentityModule, MODULE_METADATA.IMPORTS), ).toEqual(expect.arrayContaining([WordpressMirrorModule])); - expect( - getModuleMetadata(AdminIdentityModule, MODULE_METADATA.IMPORTS), - ).not.toEqual(expect.arrayContaining([WordpressModule])); - expect( - getModuleMetadata(WordpressMirrorModule, MODULE_METADATA.IMPORTS), - ).toEqual(expect.arrayContaining([WordpressModule])); - expect( - getModuleMetadata(WordpressMirrorModule, MODULE_METADATA.EXPORTS), - ).toEqual(expect.arrayContaining([WordpressModule])); - expectControllersNotRegisteredDirectly( + const appImports = getModuleMetadata(AppModule, MODULE_METADATA.IMPORTS); + const identityImports = getModuleMetadata( + AdminIdentityModule, + MODULE_METADATA.IMPORTS, + ); + const wordpressImports = getModuleMetadata( WordpressMirrorModule, - WORDPRESS_MIRROR_CONTROLLERS, + MODULE_METADATA.IMPORTS, + ); + const wordpressExports = getModuleMetadata( + WordpressMirrorModule, + MODULE_METADATA.EXPORTS, ); + expectNoModuleNamed(appImports, 'WordpressModule'); + expectNoModuleNamed(identityImports, 'WordpressModule'); + expectNoModuleNamed(wordpressImports, 'WordpressModule'); + expectNoModuleNamed(wordpressExports, 'WordpressModule'); + + expect(wordpressImports).toEqual( + expect.arrayContaining([AdminAuthGuardModule]), + ); expect( - getModuleMetadata(WordpressModule, MODULE_METADATA.CONTROLLERS), + getModuleMetadata(WordpressMirrorModule, MODULE_METADATA.CONTROLLERS), ).toEqual( expect.arrayContaining([ WordpressAuthController, @@ -112,8 +112,9 @@ describe('WordPress mirror module contract', () => { ]), ); expect( - getModuleMetadata(WordpressModule, MODULE_METADATA.PROVIDERS), + getModuleMetadata(WordpressMirrorModule, MODULE_METADATA.PROVIDERS), ).toEqual(expect.arrayContaining([WordpressService])); + expect(wordpressExports).toEqual(expect.arrayContaining([WordpressService])); expect(WORDPRESS_MIRROR_CONTROLLERS).toEqual( expect.arrayContaining([ WordpressAuthController, diff --git a/test/wordpress/wordpress.service.spec.ts b/test/wordpress/wordpress.service.spec.ts index cb23145..2c70385 100644 --- a/test/wordpress/wordpress.service.spec.ts +++ b/test/wordpress/wordpress.service.spec.ts @@ -1,7 +1,7 @@ import { createServer, type Server } from 'node:http'; import { ConfigService } from '@nestjs/config'; import { MarkdownService, ToolsService } from '../../src/common'; -import { WordpressService } from '../../src/wordpress/wordpress.service'; +import { WordpressService } from '../../src/modules/wordpress/application/wordpress.service'; describe('WordpressService theme config', () => { const rootPayload = {