Skip to content

Commerce Service

@nx/commerce là dịch vụ catalog và tenant trung tâm: nó sở hữu products, variants, options, categories, merchants, organizers, sale channels, devices, receipt templates và các tích hợp provider được mã hóa. Đây là nguồn sự thật CDC — Debezium đọc Postgres WAL của nó và nhiều dịch vụ chị em (search, pricing, taxation, invoice, inventory) tự khởi tạo dữ liệu từ đây. Nó đăng ký Kafka chỉ producer và sao chép sản phẩm giữa các merchant qua EventBus in-process + hàng đợi BullMQ.

1. Tham khảo nhanh

Thuộc tínhGiá trị
Package@nx/commerce
CodeSVC-00020-COMMERCE
TypeMicroservice
RuntimeBun
Base ClassVerifierApplication (xác thực JWT dựa trên JWKS)
Locationpackages/commerce
Base Path/v1/api/commerce
Dev Port31020
Container Port3000 (external 31020)
Snowflake ID2
DB Schemapublic (+ allocation) — schema thuộc @nx/core
Binding Namespace@nx/commerce
Live OpenAPI/v1/api/commerce/doc/openapi.json

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

Bao gồmLoại trừ
Catalog product / variant / option (CRUD aggregate)Định giá động — fares/rules (ủy thác cho @nx/pricing)
Phân cấp category (SYSTEM + tùy biến)Cấp phát quy tắc thuế (@nx/taxation)
Quản lý & onboarding merchant + organizer (tenant)Mức tồn kho / InventoryItem (ủy thác cho @nx/inventory)
Cấu hình kênh bán + liên kết SaleChannelProductVòng đời order / checkout (ủy thác cho @nx/sale)
Device, receipt template, setting, discrimination typePhát hành hóa đơn điện tử (ủy thác cho @nx/invoice)
Thông tin đăng nhập tích hợp provider được mã hóa (AES-256-GCM)Engine đánh chỉ mục tìm kiếm (Typesense — đồng bộ qua CDC @nx/search)
Sao chép sản phẩm đa merchant nền (EventBus → BullMQ)Push trực tiếp tới inventory (thay bằng CDC)
Thu thập thông tin thuế merchant (Merchant.metadata.tax) → CDC → TaxInfo
WebSocket emitter cho sự kiện merchant thời gian thực

3. Tech Stack

Bên ngoài:

Thư việnMục đích
@venizia/ignisIoC container, DI, BaseService/Controller, ControllerFactory
@venizia/ignis-helpersLogger, KafkaProducerHelper, BullMQHelper, WebSocketEmitter, AES
@platformatic/kafkaKafka client (chỉ producer)
eventemitter3EventBus in-process cho sự kiện product aggregate
hono + @hono/zod-openapiHTTP server + sinh OpenAPI
@scalar/hono-api-referenceTrình khám phá OpenAPI tại /doc
drizzle-orm + pgTruy cập DB qua PostgresCoreDataSource
minioLưu trữ object (qua @nx/asset)
typesenseClient engine tìm kiếm (qua @nx/search)

Nội bộ:

PackageMục đích
@nx/coreSchemas, repositories, VerifierApplication, CDCKafkaTopics, status/type enums
@nx/assetApplicationAssetComponent — media Minio + MetaLinks
@nx/searchCác component search + embedding + Typesense + CDC consumer
@nx/mq-smsPhụ thuộc được khai báo; không được import trong src/

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

packages/commerce/
├── src/
│   ├── application.ts                # Lớp con VerifierApplication
│   ├── index.ts / migrate.ts         # điểm vào bootstrap
│   ├── common/
│   │   ├── constants.ts              # ApplicationRoles (api/worker)
│   │   ├── keys.ts                   # BindingKeys (Kafka/BullMQ/EventBus)
│   │   ├── event.ts                  # khóa sự kiện EVENT_EMITTER product
│   │   ├── rest-paths.ts             # RestPaths
│   │   └── environments.ts           # khóa env Redis BullMQ
│   ├── components/
│   │   ├── kafka/                    # ApplicationKafkaComponent (chỉ producer)
│   │   ├── redis/                    # kết nối Redis BullMQ
│   │   ├── queues/                   # SYNC_PRODUCT_QUEUE
│   │   ├── event-bus/                # bus EventEmitter3 + registry
│   │   ├── workers/                  # SyncProductWorker + WorkerComponent
│   │   └── websocket/                # CommerceSocketEventService
│   ├── controllers/                  # 18 thư mục → 17 controller được đăng ký
│   ├── datasources/                  # PostgresCoreDataSource
│   ├── events/                       # emitters + listener product aggregate
│   ├── services/                     # gồm services/product, services/allocation
│   ├── migrations/processes/         # 9 process seed/backfill
│   └── models/                       # zod request/response schemas
├── package.json
└── tsconfig.json

5. Kiến trúc

Chi tiết: xem Kiến trúc.

6. Ảnh chụp Domain

ERD đầy đủ + bảng theo từng thực thể: xem Domain Model.

7. Tóm tắt Bề mặt

REST controllers — tham khảo đầy đủ render trực tiếp từ /v1/api/commerce/doc/openapi.json (trình xem Scalar tại /doc, cổng gateway). 17 controller được đăng ký; tất cả xác thực qua strategies: ['jwt', 'basic'].

ControllerBase pathGhi chú
ProductController/products+ create/update /aggregate
ProductVariantController/product-variants+ create/update /aggregate
ProductOptionController/product-optionsđịnh nghĩa option
ProductOptionValueController/product-option-valuesgiá trị option
ProductVariantOptionController/product-variant-optionschọn variant↔option
CategoryController/categoriesSYSTEM + tùy biến; không có CategoryService
MerchantController/merchants+ aggregate, footer-summary, deletion-policy
OrganizerController/organizers+ on-boarding (đồng bộ)
SaleChannelController/sale-channelsphân giải identifier
ConfigurationController/configurations+ /provider-integrations (mã hóa)
DeviceController/devicesregistry thiết bị POS
DiscriminationTypeController/discrimination-typesphân loại nhóm
ReceiptTemplateController/receipt-templatesmẫu in
SettingController/settingscài đặt đa hình
AllocationLayoutController/allocation-layoutssơ đồ mặt bằng
AllocationZoneController/allocation-zoneskhu vực/phân vùng
AllocationUnitController/allocation-unitsbàn/ghế

SaleChannelInventoryLocationController + SaleChannelInventoryLocationService tồn tại trong src/ nhưng không được đăng ký.

Bề mặt async — tham khảo đầy đủ trong API Events:

HướngKênhSố lượng
OutboundCDC (Debezium)9+ bảng được tiêu thụ bởi search/pricing/taxation/invoice/inventory
Nội bộEventBus (eventemitter3)2 sự kiện (product.aggregate.{created,updated})
Nội bộBullMQ1 hàng đợi (SYNC_PRODUCT_QUEUE) × job create/update
OutboundWebSocketphát thời gian thực merchant (emitter được đăng ký)
OutboundKafka produceproducer được bind; không có call site .send() trong src/

8. Components

Đăng ký trong application.ts:configureComponents() (theo thứ tự):

ComponentFile / nguồnMục đích
ApplicationSearchComponent@nx/searchTích hợp tìm kiếm Typesense
ApplicationEmbeddingConfigurationComponent@nx/searchCấu hình embedding cho tìm kiếm ngữ nghĩa
TypesenseSearchEngineComponent@nx/searchĐấu nối engine Typesense
ApplicationCdcComponent@nx/searchchỉ vai trò WORKER — Debezium CDC → Typesense
ApplicationAssetComponent@nx/assetMedia nền Minio + MetaLinks
useCacheRedis(...)core helperCache Redis (cũng là authorization Redis)
RedisComponentcomponents/redis/Redis BullMQ riêng (single/cluster)
QueueComponentcomponents/queues/Tạo SYNC_PRODUCT_QUEUE
EventBusComponentcomponents/event-bus/Bus EventEmitter3 + listener product aggregate
WorkerComponentcomponents/workers/Đăng ký worker từ APP_ENV_WORKERS
ApplicationKafkaComponentcomponents/kafka/Khởi tạo producer Kafka (không .send() trong src/)
ApplicationWebSocketComponentcomponents/websocket/WebSocketEmitter cho sự kiện thời gian thực

Hai kết nối Redis (cache + BullMQ). Khóa APPLICATION_KAFKA_CONSUMER được khai báo nhưng không có consumer nào được đấu nối.

9. Services

Đăng ký trong application.ts:configureServices():

ServiceMô tả một dòng
ProductServiceĐọc product + phân giải identifier; ủy thác aggregate cho service create/update
ProductCreateService / ProductUpdateServiceLogic transaction aggregate; phát sự kiện product EventBus
ProductCreateSyncService / ProductUpdateSyncServicesyncToAdditionalMerchants() (worker BullMQ)
ProductVariantServiceCRUD aggregate variant (chỉ catalog — không inject pricing)
ProductOptionServiceQuản lý option / option-value
MerchantServiceAggregate merchant, tax→metadata, cache footer-summary
OrganizerServiceonBoarding() — organizer + merchant + policies + kênh mặc định
CategoryServiceLogic category SYSTEM/tùy biến
SaleChannelServiceTra cứu theo identifier
ConfigurationServiceConfig hệ thống + tích hợp provider được mã hóa
EncryptServiceMã hóa/giải mã AES-256-GCM (nội bộ)
DeletionPolicyServiceThực thi xóa nghiêm ngặt theo merchant
AllocationLayoutService / AllocationZoneService (+ Create/Update)Sơ đồ phân bổ ghế/khu vực
ReceiptTemplateServiceCRUD mẫu hóa đơn
WebhookDispatcherServiceRe-export từ @nx/core

SaleChannelInventoryLocationService tồn tại nhưng không được đăng ký.

10. Repositories

Re-export từ @nx/core và đăng ký trong configureRepositories(). Bao gồm các bảng do commerce sở hữu (Product, ProductVariant, ProductInfo, ProductIdentifier, ProductOption(Value), ProductVariantOption, ProductVariantMapping, ProductBundler, ProductCategory, Category, Merchant, Organizer, SaleChannel(Product), Configuration, Device, DiscriminationType, ReceiptTemplate, Setting, MetaLink) cộng với các đọc cross-package (SaleOrder(Item), Inventory*, Invoice, Material, Fare(Set), Tax*, FinanceAccount, TaxInfo, Permission, Role, PolicyDefinition, Notification, WebhookConfig, Customer).

Theo quy ước, không có repo wrapper mỏng — các method tùy biến (ví dụ MerchantRepository.markOnboardingStepComplete, SaleOrderRepository.sumWindowCompletedOrders, InventoryStockRepository.getOverview) có chỗ đứng nhờ logic không tầm thường.

11. Điểm vào

FileMục đích
src/index.tsĐiểm vào dịch vụ → bootstrapApplication()
src/migrate.tsĐiểm vào migration → bootstrapMigration()
src/application.tsApplication extends VerifierApplication

12. Cấu hình

Biến env + dữ liệu seed: xem Cấu hình.

13. Vận hành

Triển khai + observability + bảo mật + runbook: xem Vận hành.

14. Trang liên quan

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

Tham khảo — tra cứu:

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

Quyết định:

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