Skip to content

Kiến Trúc Hệ Thống

Dự ÁnPTX Channel Manager (ptx-cm)
Phiên Bản2.0.0
Cập Nhật2026-02-20

Tổng Quan

PTX Channel Manager là nền tảng quản lý kênh OTA thống nhất, tự động đồng bộ phòng trống giữa Booking.com, Agoda, Traveloka và Expedia để ngăn chặn overbooking. Hệ thống sử dụng cấu trúc monorepo với frontend Next.js, backend NestJS, database PostgreSQL và hệ thống queue Redis.


1. Sơ Đồ Kiến Trúc Tổng Quan


2. Luồng Sync Engine (Polling → Booking → Phòng Trống)


3. Luồng Xác Thực & Phân Quyền


4. Sơ Đồ Quan Hệ Thực Thể Database

20 bảng — Xác Thực (5), Inventory (4), OTA (3), Booking (4), Vận Hành (4)


2. Cấu Trúc Monorepo

ptx-cm/
├── apps/
│   ├── api/                          # NestJS 10 Backend
│   │   ├── src/
│   │   │   ├── modules/              # 15 feature module
│   │   │   ├── common/               # Guard, filter, decorator
│   │   │   ├── utils/                # Helper, crypto, phân trang
│   │   │   └── main.ts               # Khởi động
│   │   └── package.json
│   │
│   └── web/                          # Next.js 16 Frontend
│       ├── app/                      # App Router
│       │   ├── (auth)/               # Route công khai
│       │   ├── (main)/               # Route bảo vệ
│       │   └── api/[...proxy]/       # Proxy backend
│       ├── components/               # Component React
│       ├── hooks/                    # Hook tùy chỉnh
│       ├── contexts/                 # Provider context
│       ├── lib/                      # Tiện ích
│       └── package.json

├── packages/
│   ├── database/                     # Prisma
│   │   ├── prisma/                   # Schema + migration
│   │   ├── src/
│   │   │   └── client.ts
│   │   └── package.json
│   │
│   ├── types/                        # TypeScript dùng chung
│   │   ├── src/
│   │   │   ├── api.types.ts          # DTO request/response
│   │   │   └── enums.ts              # OtaType, AlertSeverity, v.v.
│   │   └── package.json
│   │
│   └── config/                       # ESLint/TypeScript
│       ├── eslint-config/
│       ├── typescript-config/
│       └── package.json

├── docs/                             # Tài liệu
├── docker-compose.yml                # PostgreSQL 16 + Redis 7
├── turbo.json                        # Cấu hình Turborepo
├── pnpm-workspace.yaml               # pnpm workspace
└── package.json                      # Cấu hình gốc

3. Kiến Trúc Module Backend

Module Chính (tổng 15)

ModuleMục ĐíchFile Chính
authXác thực JWT, đăng nhập, refresh, đặt lại mật khẩuauth.service.ts, jwt.strategy.ts
usersCRUD user, cài đặt tài khoảnusers.service.ts, users.controller.ts
rolesĐịnh nghĩa vai trò, bitmask quyền hạnroles.service.ts
activity-logsGhi log HTTP request, audit trailactivity-log.middleware.ts
notificationsDịch vụ email (Resend API)notifications.service.ts
propertiesCRUD property, gán timezone/tiền tệproperties.service.ts
room-typesInventory phòng, giá cơ bảnroom-types.service.ts
room-mappingsMapping OTA ↔ room type nội bộroom-mappings.service.ts
suppliersQuản lý supplier/chủ phòngsuppliers.service.ts
ota-accountsCredential OTA mã hóa (AES-256-GCM)ota-accounts.service.ts, crypto.service.ts
ota-connectionsLiên kết property ↔ tài khoản OTAota-connections.service.ts
ota-adaptersFactory pattern + 4 adapter stubota-adapter.factory.ts, booking.adapter.ts
bookingsCRUD booking, loại trùng upsertFromOtabookings.service.ts
booking-statusĐịnh nghĩa trạng thái, state machinebooking-status.service.ts
sync-engineĐiều phối polling, kéo dữ liệu, đồng bộsync-engine.service.ts, ota-polling.processor.ts
sync-jobsTheo dõi job với trạng tháisync-jobs.service.ts
alertsPhát hiện overbooking, thông báoalerts.service.ts
dashboardKPI tổng hợpdashboard.service.ts
settingsCài đặt ứng dụng (booking_pull_minutes, v.v.)settings.service.ts
healthLiveness probehealth.controller.ts
countriesDữ liệu tham khảo lọc quốc giacountries.service.ts

Mẫu Guard & Decorator

typescript
// Guard toàn cục (áp dụng theo thứ tự):
1. JwtAuthGuard          // Xác thực chữ ký JWT & hạn sử dụng
2. PermissionsGuard      // Kiểm tra bitmask module:action
3. CountryScopeGuard     // Áp dụng bộ lọc quốc gia vào truy vấn

// Decorator để tùy chỉnh:
@Public()                // Bỏ qua JwtAuthGuard
@RequirePermission(MODULE.PROPERTIES, ACTIONS.CREATE)
@CountryScope()          // Inject tham số countryScope

4. Kiến Trúc Route Frontend

Mẫu RouteLayerXác Thực
/login, /forgot-password, /reset-password(auth)Công khai
/dashboard, /bookings, /properties, /alerts, /sync-jobs, /ota-accounts, /suppliers, /master-data, /logs, /profile, /settings(main)Bảo vệ + JWT

Chuỗi Context Provider

AuthProvider (JWT + trạng thái user)

CountryProvider (bộ lọc VN/ID/MY)

ReferenceDataProvider (cache quốc gia)

ThemeProvider (chế độ sáng/tối)

I18nProvider (ngôn ngữ en/vi)

ActivityTrackerProvider (timeout phiên)

5. Tổng Hợp Tech Stack

TầngCông NghệPhiên Bản
FrontendNext.js + React + Tailwind CSS16 + 18
Frontend StateSWR + Context API-
Frontend Formreact-hook-form + zod-
Frontend TablesTanStack Table (react-table)-
BackendNestJS + Passport10
Backend Validationclass-validator-
Backend QueueBullMQ + Redis-
DatabasePostgreSQL + Prisma ORM16 + 7
Xác ThựcJWT + bcrypt-
Mã HóaAES-256-GCM-
Build ToolTurborepo + pnpm-
Ngôn NgữTypeScript5.7
TestingJest + @nestjs/testing-

6. Mẫu Thiết Kế Chính

Mẫu Xác Thực

  • JWT payload bao gồm: sub, email, roleId, permissions (PermissionMap), country, locale
  • Trích xuất token: Cookie HttpOnly access_token → fallback sang Bearer header
  • Guard áp dụng theo phương thức controller hoặc toàn cục

Mẫu Phân Quyền

  • Quyền hạn dựa trên bitmask theo module (VIEW=1, CREATE=2, EDIT=4, DELETE=8)
  • Vai trò mặc định: super_admin, admin, manager, ota, cs, fin
  • Truy vấn phân quyền quốc gia: tất cả truy vấn user lọc theo middleware countryScope

Mẫu OTA Adapter

  • Factory pattern: OtaAdapterFactory.create(otaType) trả về instance adapter
  • Strategy interface: IOtaAdapter { fetchBookings(), pushAvailability() }
  • 4 triển khai: BookingAdapter, AgodaAdapter, TravelokaAdapter, ExpediaAdapter

Mẫu Pipeline Đồng Bộ

  • Job lặp lại qua BullMQ scheduler (interval 150 giây)
  • Xử lý đa giai đoạn: polling → kéo booking → tính phòng trống → đẩy OTA
  • Theo dõi job: Bản ghi SyncJob cho audit + logic retry

Data Fetching (Frontend)

  • SWR cho cache dữ liệu & revalidation
  • Context provider cho state toàn cục (auth, quốc gia, dữ liệu tham khảo)
  • TanStack Table cho sắp xếp, phân trang, lọc

7. Enum & Kiểu Dữ Liệu Chính

Enum OTA:

  • OtaType: Booking, Agoda, Traveloka, Expedia
  • ConnectionStatus: Active, Inactive, Error
  • SyncJobType: BookingPull, AvailabilitySync
  • SyncJobStatus: Pending, Running, Completed, Failed

Enum Booking:

  • BookingStatus: Pending, Confirmed, CheckedIn, CheckedOut, Cancelled
  • AlertType: Overbooking, SyncFailure, CredentialExpired
  • AlertSeverity: Info, Warning, Critical

Module Quyền Hạn (14): DASHBOARD, PROPERTIES, ROOM_TYPES, OTA_ACCOUNTS, BOOKINGS, AVAILABILITY, SYNC_JOBS, RATES, ALERTS, SETTINGS, USERS, SUPPLIERS, COUNTRIES, ROLES


8. Kiến Trúc Triển Khai

Phát Triển:

  • Dev server monorepo: pnpm dev khởi động cả hai app + BullMQ listener
  • PostgreSQL trong Docker: port 5433
  • Redis trong Docker: port 6379
  • Mailpit (bắt email): port 1025/8025

Production:

  • Image container riêng biệt: API (port 3002), Web (port 3100)
  • PostgreSQL managed service (Cloud SQL / RDS)
  • Redis managed service (ElastiCache / Upstash)
  • Email qua Resend API
  • Sync job lưu trong BullMQ (Redis)

Cập Nhật2026-02-20
Trạng TháiĐang hoạt động - Tất cả phần đã cập nhật theo review mã nguồn mới nhất

PTX Channel Manager — Tài Liệu Nội Bộ