Перейти к содержимому

08 — NX Monorepo Structure (Admin Service)

This document details the NX workspace changes required to implement the Admin Service feature: new libraries, modified libraries, dependency graph, boundary rules, tsconfig aliases, and scaffolding commands.


Legend: [NEW] = new file/directory, [MODIFIED] = change to existing file.

libs/apis/configs/auth-api/jwt-admin/ [NEW]
project.json
tsconfig.json
tsconfig.lib.json
tsconfig.spec.json
eslint.config.mjs
jest.config.ts
src/
index.ts
lib/
jwt-admin-config.module.ts
jwt-admin-config.service.ts
jwt-admin.config.ts
jwt-admin.env.ts
jwt-admin.validation.ts
libs/apis/providers/auth-api/features/admin-auth/ [NEW]
project.json
tsconfig.json
tsconfig.lib.json
tsconfig.spec.json
eslint.config.mjs
jest.config.ts
src/
index.ts
lib/
admin-auth.module.ts
admin-auth.controller.ts
admin-auth.service.ts
strategies/
jwt-admin.strategy.ts
constants/
admin-auth.constants.ts
libs/apis/providers/admin-api/features/admin-project/ [NEW]
project.json
tsconfig.json
tsconfig.lib.json
tsconfig.spec.json
eslint.config.mjs
jest.config.ts
src/
index.ts
lib/
admin-project.module.ts
admin-project.controller.ts
admin-project.service.ts
admin-project.repository.ts
libs/apis/providers/admin-api/features/admin-user/ [NEW]
project.json
tsconfig.json
tsconfig.lib.json
tsconfig.spec.json
eslint.config.mjs
jest.config.ts
src/
index.ts
lib/
admin-user.module.ts
admin-user.controller.ts
admin-user.service.ts
admin-user.repository.ts
libs/apis/providers/admin-api/data-access/ [NEW]
project.json
tsconfig.json
tsconfig.lib.json
tsconfig.spec.json
eslint.config.mjs
jest.config.ts
src/
index.ts
lib/
dto/
block-user.dto.ts
admin-project-query.dto.ts
admin-user-query.dto.ts
update-project-status.dto.ts
constants/
admin-api.constants.ts
libs/apis/shared/src/ [MODIFIED]
lib/
guards/
admin-jwt-auth.guard.ts [NEW]
constants/
roles.constants.ts [MODIFIED]
helpers/
pagination.helper.ts [MODIFIED]
types/
admin.types.ts [NEW]
index.ts [MODIFIED]
libs/apis/providers/auth-api/features/token/src/ [MODIFIED]
lib/
token.module.ts [MODIFIED]
token-admin.service.ts [NEW]
index.ts [MODIFIED]
libs/apis/providers/auth-api/features/customer-auth/src/ [MODIFIED]
lib/
customer-auth.service.ts [MODIFIED]
libs/apis/providers/auth-api/features/employee-auth/src/ [MODIFIED]
lib/
employee-auth.service.ts [MODIFIED]
libs/apis/providers/email-sender-api/features/sender/src/ [MODIFIED]
lib/
sender.service.ts [MODIFIED]
templates/
admin-verification-code.template.ts [NEW]
libs/apis/providers/project-api/features/project/src/ [MODIFIED]
lib/
project.repository.ts [MODIFIED]
libs/apis/providers/user-api/features/user/src/ [MODIFIED]
lib/
user.service.ts [MODIFIED]
user.repository.ts [MODIFIED]
tsconfig.base.json [MODIFIED]

jwt-admin config (libs/apis/configs/auth-api/jwt-admin/project.json):

{
"name": "config-auth-api-jwt-admin",
"$schema": "../../../../../node_modules/nx/schemas/project-schema.json",
"sourceRoot": "libs/apis/configs/auth-api/jwt-admin/src",
"projectType": "library",
"tags": ["scope:config", "type:config"],
"targets": {}
}

admin-auth feature (libs/apis/providers/auth-api/features/admin-auth/project.json):

{
"name": "auth-api-feature-admin-auth",
"$schema": "../../../../../../node_modules/nx/schemas/project-schema.json",
"sourceRoot": "libs/apis/providers/auth-api/features/admin-auth/src",
"projectType": "library",
"tags": ["scope:auth-api", "type:feature"],
"targets": {}
}

admin-project feature (libs/apis/providers/admin-api/features/admin-project/project.json):

{
"name": "admin-api-feature-admin-project",
"$schema": "../../../../../../node_modules/nx/schemas/project-schema.json",
"sourceRoot": "libs/apis/providers/admin-api/features/admin-project/src",
"projectType": "library",
"tags": ["scope:admin-api", "type:feature"],
"targets": {}
}

admin-user feature (libs/apis/providers/admin-api/features/admin-user/project.json):

{
"name": "admin-api-feature-admin-user",
"$schema": "../../../../../../node_modules/nx/schemas/project-schema.json",
"sourceRoot": "libs/apis/providers/admin-api/features/admin-user/src",
"projectType": "library",
"tags": ["scope:admin-api", "type:feature"],
"targets": {}
}

admin-api data-access (libs/apis/providers/admin-api/data-access/project.json):

{
"name": "admin-api-data-access",
"$schema": "../../../../../node_modules/nx/schemas/project-schema.json",
"sourceRoot": "libs/apis/providers/admin-api/data-access/src",
"projectType": "library",
"tags": ["scope:admin-api", "type:data-access"],
"targets": {}
}

Each new library re-exports its public API from src/index.ts:

libs/apis/configs/auth-api/jwt-admin/src/index.ts
export * from './lib/jwt-admin-config.module';
export * from './lib/jwt-admin-config.service';
// libs/apis/providers/auth-api/features/admin-auth/src/index.ts
export * from './lib/admin-auth.module';
// libs/apis/providers/admin-api/features/admin-project/src/index.ts
export * from './lib/admin-project.module';
// libs/apis/providers/admin-api/features/admin-user/src/index.ts
export * from './lib/admin-user.module';
// libs/apis/providers/admin-api/data-access/src/index.ts
export * from './lib/dto/block-user.dto';
export * from './lib/dto/admin-project-query.dto';
export * from './lib/dto/admin-user-query.dto';
export * from './lib/dto/update-project-status.dto';
export * from './lib/constants/admin-api.constants';

graph TD
subgraph "Admin API Domain"
AdminProject["admin-api-feature-admin-project"]
AdminUser["admin-api-feature-admin-user"]
AdminDataAccess["admin-api-data-access"]
end
subgraph "Auth API Domain"
AdminAuth["auth-api-feature-admin-auth"]
JwtAdminConfig["config-auth-api-jwt-admin"]
Token["auth-api-feature-token"]
Session["auth-api-feature-session"]
end
subgraph "User API Domain"
User["user-api-feature-user"]
end
subgraph "Project API Domain"
ProjectDataAccess["project-api-data-access"]
end
subgraph "Shared / Utils"
Shared["apis-shared"]
Prisma["prisma-client"]
RedisClient["redis-client"]
EmailSender["email-sender-api-features-sender"]
end
%% admin-auth dependencies
AdminAuth --> JwtAdminConfig
AdminAuth --> Token
AdminAuth --> Session
AdminAuth --> User
AdminAuth --> RedisClient
AdminAuth --> EmailSender
AdminAuth --> Shared
%% admin-project dependencies
AdminProject --> Prisma
AdminProject --> Shared
AdminProject --> ProjectDataAccess
AdminProject --> AdminDataAccess
%% admin-user dependencies
AdminUser --> Prisma
AdminUser --> Shared
AdminUser --> User
AdminUser --> AdminDataAccess
%% jwt-admin-config: standalone, no deps

Library NameTagsAllowed Dependencies
config-auth-api-jwt-adminscope:config, type:configNone (standalone)
auth-api-feature-admin-authscope:auth-api, type:featurescope:config, scope:auth-api, scope:user-api, scope:shared, scope:utils, scope:email-sender
admin-api-feature-admin-projectscope:admin-api, type:featurescope:shared, scope:utils, scope:project-api, scope:admin-api
admin-api-feature-admin-userscope:admin-api, type:featurescope:shared, scope:utils, scope:user-api, scope:admin-api
admin-api-data-accessscope:admin-api, type:data-accessscope:shared (DTOs/constants only, no runtime deps)

The following constraint entries should be added to the depConstraints array:

{
"sourceTag": "scope:admin-api",
"onlyDependOnLibsWithTags": [
"scope:admin-api",
"scope:shared",
"scope:utils",
"scope:user-api",
"scope:project-api"
]
},
{
"sourceTag": "type:data-access",
"onlyDependOnLibsWithTags": [
"type:data-access",
"scope:shared",
"scope:utils"
]
},
{
"sourceTag": "type:config",
"onlyDependOnLibsWithTags": []
}

Add the following path aliases to the compilerOptions.paths object in tsconfig.base.json:

{
"compilerOptions": {
"paths": {
"@crewsforge-back/apis/configs/auth-api/jwt-admin": [
"libs/apis/configs/auth-api/jwt-admin/src/index.ts"
],
"@crewsforge-back/apis/providers/auth-api/features/admin-auth": [
"libs/apis/providers/auth-api/features/admin-auth/src/index.ts"
],
"@crewsforge-back/apis/providers/admin-api/features/admin-project": [
"libs/apis/providers/admin-api/features/admin-project/src/index.ts"
],
"@crewsforge-back/apis/providers/admin-api/features/admin-user": [
"libs/apis/providers/admin-api/features/admin-user/src/index.ts"
],
"@crewsforge-back/apis/providers/admin-api/data-access": [
"libs/apis/providers/admin-api/data-access/src/index.ts"
]
}
}
}

Run these commands from the workspace root to scaffold the new libraries. They follow the existing naming conventions observed in the repository (config-auth-api-jwt-*, auth-api-feature-*, *-api-feature-*, *-api-data-access).

Окно терминала
nx g @nx/nest:lib config-auth-api-jwt-admin \
--directory=libs/apis/configs/auth-api/jwt-admin \
--importPath=@crewsforge-back/apis/configs/auth-api/jwt-admin \
--tags="scope:config,type:config" \
--unitTestRunner=jest \
--projectNameAndRootFormat=as-provided
Окно терминала
nx g @nx/nest:lib auth-api-feature-admin-auth \
--directory=libs/apis/providers/auth-api/features/admin-auth \
--importPath=@crewsforge-back/apis/providers/auth-api/features/admin-auth \
--tags="scope:auth-api,type:feature" \
--unitTestRunner=jest \
--projectNameAndRootFormat=as-provided
Окно терминала
nx g @nx/nest:lib admin-api-feature-admin-project \
--directory=libs/apis/providers/admin-api/features/admin-project \
--importPath=@crewsforge-back/apis/providers/admin-api/features/admin-project \
--tags="scope:admin-api,type:feature" \
--unitTestRunner=jest \
--projectNameAndRootFormat=as-provided
Окно терминала
nx g @nx/nest:lib admin-api-feature-admin-user \
--directory=libs/apis/providers/admin-api/features/admin-user \
--importPath=@crewsforge-back/apis/providers/admin-api/features/admin-user \
--tags="scope:admin-api,type:feature" \
--unitTestRunner=jest \
--projectNameAndRootFormat=as-provided
Окно терминала
nx g @nx/nest:lib admin-api-data-access \
--directory=libs/apis/providers/admin-api/data-access \
--importPath=@crewsforge-back/apis/providers/admin-api/data-access \
--tags="scope:admin-api,type:data-access" \
--unitTestRunner=jest \
--projectNameAndRootFormat=as-provided

CategoryCountDetails
New libraries5jwt-admin config, admin-auth, admin-project, admin-user, admin-api data-access
Modified libraries7shared, token, customer-auth, employee-auth, email-sender, project, user
New tsconfig paths5One per new library
New NX projects5Matching library names per existing conventions
Boundary rule updates3scope:admin-api, type:data-access, type:config constraints