Files
goodgo-platform/docs/audits/API_AUDIT_REPORT.md
Ho Ngoc Hai 11f2bf26e6
Some checks failed
CI / Lint → Typecheck → Test → Build (22) (push) Failing after 29s
CI / E2E Tests (push) Has been skipped
CodeQL Analysis / CodeQL (javascript-typescript) (push) Failing after 2m42s
Deploy / Build Web Image (push) Failing after 27s
Deploy / Build AI Services Image (push) Failing after 29s
E2E Tests / Playwright E2E (push) Failing after 43s
Deploy / Build API Image (push) Failing after 1m31s
Security Scanning / Dependency Audit (pnpm) (push) Failing after 6s
Security Scanning / Trivy Scan — API Image (push) Failing after 5m35s
Security Scanning / Trivy Scan — AI Services Image (push) Failing after 3m45s
Deploy / Deploy to Staging (push) Has been skipped
Deploy / Smoke Test Staging (push) Has been skipped
Deploy / Deploy to Production (push) Has been skipped
Deploy / Smoke Test Production (push) Has been skipped
Deploy / Rollback Staging (push) Has been skipped
Deploy / Rollback Production (push) Has been skipped
Security Scanning / Trivy Scan — Web Image (push) Failing after 13m51s
Security Scanning / Trivy Filesystem Scan (push) Failing after 14m46s
Security Scanning / Security Gate (push) Has been cancelled
chore: update project documentation, audit reports, and initialize IDE configuration files
2026-04-19 03:12:54 +07:00

14 KiB

GoodGo Platform API - Báo Cáo Kiểm Toán Mã Nguồn Toàn Diện

Ngày: 10 tháng 4, 2026
Phạm vi: /apps/api/ | NestJS Backend
Kích thước codebase: ~22K dòng lệnh (sản xuất) | ~20K dòng lệnh (kiểm thử) | 207 tệp kiểm thử


1. CẤU TRÚC MODULE & TUÂN THỦ DDD

MẠNH: Triển Khai Đầy Đủ Các Lớp DDD

Tất cả 16 module đều tuân theo phân tách DDD nghiêm ngặt:

  • Modules: auth, listings, payments, subscriptions, admin, analytics, search, notifications, mcp, metrics, agents, inquiries, leads, reviews, health, shared
  • Cấu trúc lớp: domain/ (thực thể, Value Objects, kho lưu trữ) → application/ (lệnh, truy vấn, xử lý) → infrastructure/ (dịch vụ, chiến lược, repos) → presentation/ (controllers, DTOs, guards)
  • Mẫu CQRS: Được triển khai nhất quán với CommandBus & QueryBus trong các module auth, payments, subscriptions
  • Tất cả module MVP đều có mặt: ✓ auth, ✓ listings, ✓ payments, ✓ subscriptions, ✓ admin, ✓ analytics, ✓ search, ✓ notifications, ✓ mcp, ✓ metrics + 6 module bổ sung (agents, inquiries, leads, reviews, health)

Mức độ nghiêm trọng: THẤP (kiến trúc xuất sắc)


2. CHẤT LƯỢNG MÃ NGUỒN & AN TOÀN KIỂU DỮ LIỆU

XUẤT SẮC: Chế Độ Strict TypeScript

"strict": true
"noUncheckedIndexedAccess": true
"noImplicitOverride": true
"noPropertyAccessFromIndexSignature": true
"skipLibCheck": false
  • Mẫu Result Type: Được triển khai trong shared/domain/result.ts với .match(), .map(), .andThen()
  • Xử lý lỗi: 46 trường hợp ném ngoại lệ tường minh (ngoại lệ thay vì ném trống)
  • Không dùng phím tắt kiểu: Không có kiểu : any trong mã sản xuất
  • Không có console log: Được thực thi qua ghi nhật ký có cấu trúc bằng Pino
  • Không có giá trị cứng: Tất cả bí mật đều dùng process.env có xác thực

Mức độ nghiêm trọng: THẤP (mẫu mực)


3. KIỂM THỬ

TOÀN DIỆN: 207 tệp kiểm thử, độ phủ mã ~50%

  • Cấu trúc kiểm thử: Kiểm thử đơn vị (.spec.ts), kiểm thử tích hợp (.integration.spec.ts)
  • Framework kiểm thử: Vitest với môi trường Node
  • Phạm vi phủ chính:
    • Trình xử lý Auth: 8 tệp spec (register, login, verify-kyc, deletion, export-user)
    • Payments: Toàn bộ trình xử lý CQRS được kiểm thử
    • Listings: Lưu trữ media, cập nhật trạng thái
    • Subscriptions: Quota, đo lường, nâng cấp
  • Tỷ lệ kiểm thử: ~0,93:1 (20,4K dòng kiểm thử : 21,9K dòng sản xuất)
  • Còn thiếu: Chưa cấu hình kiểm thử e2e; chỉ có đơn vị + tích hợp

⚠️ TRUNG BÌNH: Bộ kiểm thử tích hợp chưa được tích hợp vào CI/CD; cần thực thi vitest.integration.config.ts

Mức độ nghiêm trọng: TRUNG BÌNH (phủ đơn vị tốt, thiếu e2e)


4. PHỤ THUỘC & BẢO MẬT

CẬP NHẬT: Tất cả phụ thuộc đều mới nhất (NestJS 11, Prisma 7.7, TypeScript 6)

@nestjs/*: ^11.0
@prisma/*: ^7.7.0
typescript: ^6.0.2
passport: ^0.7.0, @nestjs/jwt: ^11.0.2
helmet: ^8.1.0
sentry: ^10.47.0

Kết quả kiểm toán:

  • Không có CVE đã biết trong các phụ thuộc trực tiếp
  • Helmet được cấu hình với CSP, HSTS, COEP, COOP
  • Bật Sentry profiling để theo dõi lỗi
  • Database adapter: @prisma/adapter-pg v7.7.0

⚠️ THẤP: Chiến lược khóa gói chưa rõ ràng (monorepo dùng workspace:*); đảm bảo pnpm-lock.yaml được commit

Mức độ nghiêm trọng: THẤP (phụ thuộc sạch)


5. KIỂM TOÁN BẢO MẬT

MẠNH: Kiểm soát bảo mật nhiều lớp

Xác thực biến môi trường (NGHIÊM TRỌNG)

// Được thực thi khi khởi động ứng dụng (main.ts)
- ALWAYS_REQUIRED: JWT_SECRET, JWT_REFRESH_SECRET
- PRODUCTION_ONLY: DATABASE_URL, CORS_ORIGINS, REDIS_HOST, KYC_ENCRYPTION_KEY
- MINIMUM_SECRET_LENGTH: 32 chars (256-bit equiv.)
- FORBIDDEN_VALUES: placeholder, test, default, change_me, xxx, etc.

Mức độ nghiêm trọng: THẤP (xác thực xuất sắc)

Xác thực & Phân quyền

  • Chiến lược JWT + refresh token (hết hạn 15 phút, đặt audience/issuer)
  • Passport.js guards: JwtAuthGuard, LocalAuthGuard, RolesGuard
  • Nhiều OAuth: Google, Zalo
  • Bí mật lấy qua ConfigService, không trực tiếp từ biến môi trường

Bảo vệ CSRF

  • Mẫu cookie double-submit (CsrfMiddleware trong shared)
  • Header X-CSRF-Token được xác thực trên các phương thức thay đổi trạng thái
  • Các endpoint health bị loại trừ để tránh ô nhiễm cookie

Làm sạch đầu vào

  • ValidationPipe toàn cục: whitelist, forbidNonWhitelisted, transform được bật
  • SanitizeInputMiddleware áp dụng cho tất cả các route (sử dụng sanitize-html)
  • Prisma dùng truy vấn tham số hóa (không phát hiện rủi ro SQL injection)
    • Chỉ tìm thấy template literal Prisma.sql với Prisma.join() (an toàn)

Giới hạn tốc độ

  • ThrottlerModule với ghi đè theo từng route:
    • mặc định: 60 req/60s
    • auth: 10 req/60s
    • payment-callback: 20 req/60s

Cấu hình CORS

  • Nguồn gốc được phép có thể cấu hình (bắt buộc trong sản xuất)
  • Credentials: true, Methods: GET/POST/PUT/PATCH/DELETE, maxAge: 86400

Header bảo mật (Helmet)

- Content-Security-Policy: 'self' + ngoại lệ CDN (có thể xem xét)
- HSTS: 31536000s, preload được bật
- X-Frame-Options: deny
- Chính sách Cross-Origin: COEP, COOP được bật
- Referrer-Policy: strict-origin-when-cross-origin

⚠️ TRUNG BÌNH: CSP cho phép 'unsafe-inline' cho scripts/styles

scriptSrc: ["'self'", "'unsafe-inline'", 'https://cdn.jsdelivr.net']

Khuyến nghị: Chuyển sang CSP dựa trên nonce trong môi trường sản xuất.

Bảo vệ dữ liệu

  • Dữ liệu KYC được mã hóa khi lưu trữ (mã hóa trường Prisma qua KYC_ENCRYPTION_KEY)
  • Xóa mềm: các trường deletedAt, deletionScheduledAt (lộ trình tuân thủ GDPR)
  • Quy trình xóa người dùng: RequestUserDeletion → 30 ngày ân hạn → ProcessScheduledDeletions

⚠️ THẤP: Không đề cập đến hệ số chi phí bcrypt; giả sử mặc định (10) là chấp nhận được

Mức độ nghiêm trọng: TRUNG BÌNH (cần xem xét chính sách CSP; ngoài ra khá mạnh)


6. CƠ SỞ DỮ LIỆU & SCHEMA

VỮNG CHẮC: Prisma 7.7 + PostgreSQL 16 + PostGIS

  • Tệp schema: /prisma/schema.prisma (có cấu trúc tốt)
  • Migration: 11 migration SQL được theo dõi (có thể thấy lịch sử phát triển)
  • Các bảng chính:
    • User (với xóa mềm, trạng thái KYC, vai trò: BUYER/SELLER/AGENT/ADMIN)
    • RefreshToken (dựa trên TTL, đánh chỉ mục theo userId)
    • OAuthAccount (nhà cung cấp Google, Zalo)
    • Listing, Property (với hình học PostGIS cho truy vấn địa lý)
    • Subscription, Payment, Transaction
    • Inquiry, Review, SavedSearch

Chiến lược đánh chỉ mục:

  • Chỉ mục cột đơn cho các truy vấn nóng (role, kycStatus, isActive, createdAt)
  • Chỉ mục tổng hợp (role + isActive + createdAt DESC) cho các truy vấn admin
  • Khóa ngoại với quy tắc cascade đã được kiểm tra

⚠️ THẤP: Không có quy tắc CASCADE/RESTRICT tường minh nào được hiển thị; xác minh việc xử lý dữ liệu mồ côi khi xóa

Mức độ nghiêm trọng: THẤP (schema được thiết kế tốt)


7. CÁC ENDPOINT & ROUTE API

TOÀN DIỆN: 105+ decorator route trên 16 module

Endpoint theo module:

  • Auth: Register, Login, RefreshToken, VerifyKyc, RequestUserDeletion, ExportUserData, GetProfile, OAuthCallbacks
  • Listings: CreateListing, UpdateListing, GetListing, ListListings, UpdateStatus, UploadMedia, DeleteMedia
  • Payments: CreatePayment, GetPaymentStatus, ListTransactions, HandleCallback, RefundPayment
  • Subscriptions: GetPlan, CreateSubscription, UpgradeSubscription, CancelSubscription, CheckQuota, GetBillingHistory
  • Search: FullTextSearch, GeoSearch, SavedSearches
  • Admin: UserModeration, Analytics Dashboard, PaymentReports
  • Notifications: GetHistory, UpdatePreferences
  • Reviews: CreateReview, ListReviews, UpdateReview
  • Agents: GetAgentProfile, ListAgents, GetAgentStats
  • Analytics: PriceAnalytics, MarketReports, MetricsExport
  • MCP: TransportController (truyền tải máy chủ Model Context Protocol)

Versioning: Tiền tố toàn cục /api/v1/ với các endpoint health bị loại trừ

Mức độ nghiêm trọng: THẤP (các route được tổ chức tốt)


8. CẤU HÌNH & QUẢN LÝ BIẾN MÔI TRƯỜNG

NGHIÊM NGẶT: Xác thực biến môi trường toàn diện

  • Vị trí xác thực: shared/infrastructure/env-validation.ts (gọi khi khởi động)
  • Xử lý lỗi: Ném ngoại lệ khi thiếu biến quan trọng (fail-fast)
  • Cảnh báo: Được ghi nhật ký cho các biến payment/storage tùy chọn nếu chưa đặt
  • Cổng thanh toán được hỗ trợ:
    • VNPay (VNPAY_TMN_CODE, VNPAY_HASH_SECRET)
    • MoMo (MOMO_PARTNER_CODE, MOMO_ACCESS_KEY, MOMO_SECRET_KEY)
    • ZaloPay (ZALOPAY_APP_ID, ZALOPAY_KEY1, ZALOPAY_KEY2)
  • OAuth được hỗ trợ: Google, Zalo
  • Lưu trữ: MinIO (MINIO_ACCESS_KEY, MINIO_SECRET_KEY, MINIO_ENDPOINT, MINIO_BUCKET)
  • Hạ tầng: PostgreSQL, Redis, Sentry, Typesense

Thiếu .env.example: ⚠️ TRUNG BÌNH - Không tìm thấy .env.example hoặc .env.sample; các nhà phát triển phải tự suy luận ra các biến cần thiết.

Mức độ nghiêm trọng: TRUNG BÌNH (xác thực mạnh, thiếu tài liệu)


9. BUILD, LINT & CHẤT LƯỢNG

CẬP NHẬT: ESLint + TypeScript với kiểm tra nghiêm ngặt

  • ESLint: Cấu hình cấp monorepo tại root (eslint.config.mjs)
  • TypeScript: tsc --noEmit để kiểm tra kiểu mà không emit
  • Build: NestJS CLI (nest build) xuất ra dist/
  • Scripts:
    • npm run lint - ESLint trên src/
    • npm run test - Kiểm thử đơn vị Vitest
    • npm run test:integration - Bộ kiểm thử tích hợp
    • npm run typecheck - Chỉ kiểm tra an toàn kiểu

⚠️ THẤP: Chưa cấu hình pre-commit hooks (có thể thêm qua Husky); CI/CD chưa được hiển thị

Mức độ nghiêm trọng: THẤP (công cụ vững chắc, CI/CD chưa rõ)


10. GIÁM SÁT & KHẢ NĂNG QUAN SÁT

TỐT: Sentry + Prometheus + Pino

  • Theo dõi lỗi: Tích hợp Sentry với profiling
  • Metrics: Prometheus client (độ trễ HTTP request, thanh toán đã xử lý, subscription đang hoạt động)
  • Ghi nhật ký: Pino với đầu ra JSON có cấu trúc (pino-pretty cho dev)
  • Kiểm tra sức khỏe: Module Terminus với các chỉ số Prisma + Redis

Module MCP: Kết nối với dịch vụ AI (URL cơ sở có thể cấu hình)

Mức độ nghiêm trọng: THẤP (khả năng quan sát vững chắc)


11. TÓM TẮT CÁC PHÁT HIỆN NGHIÊM TRỌNG

Vấn đề Mức độ Vị trí Biện pháp khắc phục
CSP cho phép scripts 'unsafe-inline' TRUNG BÌNH main.ts dòng 61 Dùng CSP dựa trên nonce với fallback dựa trên hash
Thiếu .env.example TRUNG BÌNH Thư mục gốc dự án Tạo .env.example với tất cả biến cần thiết
Không có kiểm thử e2e trong CI TRUNG BÌNH vitest.integration.config.ts Thêm bộ e2e vào pipeline
JSON.parse không có try-catch THẤP zalopay.service.ts Bọc trong trình xử lý lỗi (đã thực hiện, cần xác minh)
Không có quy tắc DELETE cascade tường minh THẤP schema.prisma Ghi tài liệu việc dọn dẹp dữ liệu mồ côi

ĐIỂM TỔNG KẾT: 8,5/10

Điểm mạnh:

Kiến trúc DDD mẫu mực với phân tách lớp đầy đủ
Phủ kiểm thử toàn diện (207 tệp kiểm thử, tỷ lệ 50% dòng lệnh)
Xác thực biến môi trường & quản lý bí mật mạnh mẽ
Bảo mật nhiều lớp (CSRF, giới hạn tốc độ, làm sạch đầu vào, CSP)
Đã triển khai tất cả module MVP + 6 module bổ sung
Chế độ strict TypeScript được thực thi
Khả năng quan sát Sentry + Prometheus
Mã nguồn sạch (không có any, không có console log)

Điểm yếu:

⚠️ Cần xem xét chính sách CSP (unsafe-inline)
⚠️ Thiếu tài liệu .env.example
⚠️ Không thấy bộ kiểm thử e2e
⚠️ Pipeline CI/CD chưa được ghi lại
⚠️ Chưa có pre-commit hooks

Khuyến nghị:

  1. Ưu tiên cao: Chuyển sang CSP dựa trên nonce; tạo .env.example
  2. Ưu tiên trung bình: Thêm kiểm thử e2e vào cấu hình Vitest; tích hợp vào CI
  3. Ưu tiên thấp: Thêm Husky pre-commit hooks; ghi tài liệu quy tắc cascade delete