Skip to content

Licensing Service

@nx/licensing phát hành license từ các policy tái sử dụng, gắn chúng với thiết bị qua activation, xác thực lúc runtime, và ký chứng chỉ Ed25519LicenseMiddleware của @nx/core xác minh offline. Nó không sở hữu schema nào (mọi bảng nằm trong @nx/core) và chỉ phụ thuộc @nx/core. Billing, subscription, hoá đơn, đo lường sử dụng và dunning rõ ràng nằm ngoài phạm vi.

1. Tham chiếu nhanh

Thuộc tínhGiá trị
Package@nx/licensing
CodeSVC-00140-LICENSING
TypeMicroservice
RuntimeBun
Base ClassVerifierApplication
Locationpackages/licensing
Base Path/v1/api/licensing
Dev Port31120
Container Port3000 (ngoài 31120)
Snowflake ID11
DB Schemalicensing (5 bảng)
Binding Namespace@nx/licensing
Run Modesstartup, migrate (env RUN_MODE)

SVC-00140-LICENSING đã đăng ký trong enum ServiceCodes của core. Nó được gán lại từ SVC-00110 (thuộc @nx/outreach) để giải quyết va chạm; SVC-00120 thuộc helpdesk nên licensing nhận SVC-00140. Xem ADR-0002.

2. Mục đích & Phạm vi

Bao gồmLoại trừ
Template policy (TRIAL / SUBSCRIPTION / PERPETUAL)Billing, hoá đơn, dunning
Feature flag có kiểu (PolicyFeature, giá trị đa hình)Tích hợp subscription / thanh toán
Phát hành, gia hạn, đình chỉ, khôi phục, thu hồi licenseCưỡng chế runtime theo từng feature (consumer làm việc đó)
Kích hoạt thiết bị (gắn fingerprint, giới hạn seat)Đo lường sử dụng / heartbeat reaper
Pipeline xác thực runtime (POST /validation/validate)UI license (việc của frontend)
Ký chứng chỉ Ed25519 + phân phối RedisXác minh chứng chỉ (do middleware @nx/core làm)
Phát hành free-trial tự phục vụ
Log audit vòng đời LicenseEvent

3. Tech Stack

External:

LibraryMục đích
@venizia/ignisIoC container, DI, VerifierApplication, ControllerFactory
@venizia/ignis-helpersLogger, DefaultRedisHelper, applicationEnvironment, AES helper
@hono/zod-openapiSinh OpenAPI từ Zod schema
@scalar/hono-api-referenceOpenAPI explorer tại /doc
honoHTTP server (qua IGNIS)
drizzle-ormTruy cập DB qua PostgresCoreDataSource
pgDriver PostgreSQL
node:cryptoEd25519 sign/verify, AES-256-GCM (trong cert helper của @nx/core)

bullmq@platformatic/kafka được liệt kê trong package.json nhưng không được wire — application không đăng ký component Kafka, Queue, WebSocket hay Mail nào (xem §8).

Internal:

PackageMục đích
@nx/coreSchema Policy/License/Activation/PolicyFeature/LicenseEvent + repository (re-export), VerifierApplication, LicenseCertSignerHelper, LicenseMiddleware, LicenseStatuses/PolicyTypes/DurationUnits, Redis helper. Package này không sở hữu định nghĩa schema nào.

4. Cấu trúc dự án

packages/licensing/
├── src/
│   ├── application.ts            # subclass VerifierApplication
│   ├── index.ts                  # bootstrapApplication()
│   ├── migrate.ts                # bootstrapMigration()
│   ├── common/                   # constants, keys, rest-paths, types
│   ├── controllers/              # 5 controller (policy, policy-feature, license, activation, validation)
│   ├── datasources/              # binding PostgresCoreDataSource
│   ├── errors/                   # lỗi license / activation / policy / duration
│   ├── migrations/processes/     # 4 seed (permissions, free-trial, role-perms, guest-perms)
│   ├── models/requests/          # zod request schema
│   ├── repositories/             # re-export từ @nx/core
│   └── services/licensing/       # 3 service + base dùng chung
├── package.json
└── tsconfig.json

5. Kiến trúc

Đường tin cậy: licensing chứng chỉ Ed25519 và ghi vào Redis; mọi service khác xác minh offline với public key đóng gói trong @nx/core. Không service nào gọi licensing để kiểm tra runtime. Chi tiết: xem Architecture.

6. Ảnh chụp Domain

ERD đầy đủ + bảng theo từng entity: xem Domain Model.

7. Tổng quan bề mặt

REST controllers — tham chiếu đầy đủ render trực tiếp từ /v1/api/licensing/doc/openapi.json (Scalar viewer tại /doc, portal gateway):

ControllerBase pathGhi chú
PolicyController/policiesCRUD (soft-delete theo status, không hard delete)
PolicyFeatureController/policy-featuresCRUD
LicenseController/licensesCRUD + issue / suspend / reinstate / renew / revoke / free-trial. Route read tạm bỏ qua authz ⚠️ (ADR-0003)
ActivationController/activationsCRUD
ValidationController/validationvalidate stateless (trả về cert)

Bề mặt async — xem API Events:

HướngKênhSố lượng
InboundKafka0 (không consumer)
OutboundKafka0 (không producer)
Inbound / OutboundBullMQ0 (không queue)
OutboundWebSocket0 (không component WS)

Kênh async xuyên service duy nhất là Redis: licensing SET một cert đã ký tại lic:certs:<entityType>:<entityId>; consumer GET nó qua LicenseMiddleware.

8. Components

ComponentĐăng kýMục đích
Redis cacheuseCacheRedis({ bindingKey: BindingKeys.APPLICATION_REDIS_CACHE })Phân phối chứng chỉ + cache permission authorization

Không component Kafka, Queue (BullMQ), WebSocket, hay Mail nào được đăng ký. configureComponents() chỉ gọi super.configureComponents() + useCacheRedis(...).

9. Services

ServiceFileMột dòng
LicenseManagementServiceservices/licensing/license-management.service.tsIssue / renew / suspend / reinstate / revoke; free trial tự phục vụ. Mọi mutation transactional + row-lock; re-publish chứng chỉ sau commit
ActivationServiceservices/licensing/activation.service.tsactivate() (fast-path idempotent → tx + lock → kiểm giới hạn) và deactivate()
ValidationServiceservices/licensing/validation.service.tsPipeline validate(): status → expiry/grace → features → activation → result code
LicensingBaseServiceservices/licensing/licensing-base.service.tsBase dùng chung (không bind như service): sinh key, giải feature, publishCertificate(), logEvent()

10. Repositories

Tất cả re-export từ @nx/core — package này không định nghĩa repository class nào và không thêm method tuỳ chỉnh.

RepositoryTableSource
PolicyRepositorylicensing.Policy@nx/core
PolicyFeatureRepositorylicensing.PolicyFeature@nx/core
LicenseRepositorylicensing.License@nx/core
ActivationRepositorylicensing.Activation@nx/core
LicenseEventRepositorylicensing.LicenseEvent@nx/core

Cũng bind cho seed authorization: MigrationRepository, PermissionRepository, PolicyDefinitionRepository, RoleRepository (tất cả @nx/core).

11. Entry Points

FileMục đích
src/index.tsEntry service → bootstrapApplication()
src/migrate.tsEntry migration → bootstrapMigration()
src/application.tsApplication extends VerifierApplication

12. Configuration

Env vars + feature flag + dữ liệu seed: xem Configuration.

13. Operations

Triển khai + observability + bảo mật + runbook + hướng dẫn thao tác: xem Operations.

14. Trang liên quan

Khái niệm — vì sao/như thế nào:

Tham chiếu — tra cứu:

Tính năng — đào sâu:

Decisions:

Proprietary and Confidential. Unauthorized copying, distribution, or use of this software is strictly prohibited.