Skip to content

US-P04: Cấu hình kết nối hệ ngoài theo môi trường (env_systems) ​

Thuộc FS: 00-overview.md — Nền tảng dùng chung của cụm tool SAPP (as-built @ e77c47a) Phần chung (tổng quan, roles, flow tổng, related features, NFR, Open Questions, References) xem ở Overview. File này chỉ chứa nội dung riêng của US.

FieldValue
US IDUS-P04
Role thực hiệnR2 - Admin CMS (đăng nhập CMS, có quyền env_systems) — Fact từ code
PhaseAs-built (đã triển khai)
PriorityN/A — as-built
StatusDraft
NFR liên quanNFR-P-03, NFR-P-04 — xem Overview §5
OQ liên quanOQ-P-03, OQ-P-12, OQ-P-15, OQ-P-21 — xem Overview §6

Nguồn inventory: A-12.

1. US Statement ​

text
As a Admin CMS
I want nhập URL và credential của từng hệ ngoài (HubSpot, SAPP Ops, DB Ops, SAP service) cho từng môi trường prod / staging / dev
So that [Assumption] các tool SAPP gọi đúng hệ và đúng môi trường mà không phải sửa code hay khởi động lại dịch vụ

2. Dependencies & Definition Of Ready ​

N/A — đã triển khai (Mode B).

Dependency runtime: tài khoản CMS có quyền env_systems:*; giá trị credential thật do chủ hệ ngoài cung cấp.

3. Business Rules ​

IDRuleÁp dụng ởĐã cover bởi (AC)Nguồn code (Mode B/C)
BR-01Đọc / tạo / sửa / xoá biến môi trường yêu cầu đăng nhập CMS và quyền env_systems tương ứngM1, M2AC-M1.1, EC-M1.1be/apps/api/src/env-system/env-system.controller.ts:32-100
BR-02Mỗi biến là một cặp key (duy nhất, bắt buộc) – value (văn bản, không bắt buộc)M2AC-M2.1be/libs/database/src/lib/entities/env/env-system.entity.ts:4-12, fe/src/ui/components/cms/(env-systems)/create-form.tsx:15-30
BR-03Dịch vụ SAPP đọc giá trị tại thời điểm gọi — đổi giá trị có hiệu lực ngay ở lời gọi sau, không cần khởi động lạiMọi dịch vụAC-M2.2be/libs/modules/src/lib/env-system/env-system-map.common.service.ts:38-55
BR-04Mỗi hệ ngoài dùng một bộ key theo môi trường, tên key cố định trong code (bảng ở §4 M1 Fields). Tên key sai = coi như thiếuM1AC-M2.3be/libs/constants/src/lib/env-system/env-system.constants.ts:6-55
BR-05HubSpot: chỉ key ACCESS_TOKEN được đọc để gọi API; thiếu → lỗi 12001 "HubSpot access token is not configured for this environment"Key HubSpotAC-M2.3be/libs/modules/src/lib/hubspot/common.service.ts:47-58, be/libs/constants/src/lib/hubspot/hubspot.constants.ts:10-32
BR-06SAPP Ops (tự đăng nhập): cần đủ URL + username + password của môi trường; thiếu một → lỗi 13030 (US-P08)Key OpsAC-M2.3be/libs/modules/src/lib/sapp/sapp-auth.common.service.ts:58-84, be/libs/constants/src/lib/sapp/sapp-ops.constants.ts:17-36
BR-07SAPP Ops (bộ cũ, một bộ cho mọi môi trường): SAPP_BASE_API_URL + SAPP_API_TOKEN; token phải thay tay khi hết hạnKey Ops cũAC-M2.4be/libs/constants/src/lib/sapp/sapp.constants.ts:22-25, be/libs/modules/src/lib/sapp/common.service.ts:278-302
BR-08DB Ops (SQL runner): chỉ có bộ key DEV và STAGING; thiếu host / name / username / password → môi trường đó "chưa cấu hình"; PORT không bắt buộc, mặc định 5432 (US-P09)Key DB OpsAC-M2.5be/libs/constants/src/lib/sapp/sapp-26878-sql.constants.ts:281-307, be/libs/modules/src/lib/sapp/sapp-ops-sql.common.service.ts:83-104
BR-09SAP service: cần URL + client id + HMAC secret của môi trường (quét thủ công chỉ cần URL); thiếu → lỗi 13037 và log nêu tên key thiếu; staging không dùng lại key prod (US-P05)Key SAPAC-M2.3be/libs/modules/src/lib/sapp/sap-log.common.service.ts:79-113, :340-355
BR-10Giá trị đọc ra được bỏ khoảng trắng đầu/cuối (URL còn bỏ dấu / cuối) trước khi dùngMọi key SAP / Ops DBAC-M2.6be/libs/modules/src/lib/sapp/sap-log.common.service.ts:85-87, :108-110, be/libs/modules/src/lib/sapp/sapp-ops-sql.common.service.ts:91-94
BR-11Bảng quản trị hiện cột ID, Key, Value (che mặc định), Updated; tìm theo key; xoá phải xác nhận "Delete variable?"M1AC-M1.1, AC-M1.2fe/src/ui/pages/cms/(env-systems)/page.tsx:134-196

⚠️ Observed (không phải BR): staging HubSpot dùng bộ key PROD (OQ-P-03); secret lưu dạng rõ (OQ-P-12); câu xác nhận xoá nói dịch vụ "fall back to their defaults" trong khi dịch vụ SAPP báo lỗi thiếu cấu hình (OQ-P-21).

4. Design ​

a. Mối liên hệ giữa các màn & User Flow ​

text
[/cms/env-systems  M1 "System Env"] ──Create/Edit──→ [M2 Form Key/Value] ──Submit──→ M1 (reload)
                                    └─Delete─→ xác nhận "Delete variable?" → M1
Giá trị → bảng env_systems (DB mind_keep) → mọi dịch vụ SAPP đọc lúc gọi (BR-03)

b. Chi tiết từng màn ​

Màn M1 - Danh sách biến môi trường ("System Env") ​

FieldValue
Figma frameN/A — as-built, không có Figma
Trigger vào mànAdmin mở /cms/env-systems
Mô tả ngắnBảng key/value dùng chung cho mọi tính năng của mind_keep; cụm SAPP chỉ dùng các key ở bảng Fields dưới
UI States ​
StateKhi nàoHiển thịFigma frame
Default / Has dataTải xongBảng "System Env"N/A
LoadingĐang tải (timeout 10 s)Trạng thái tải của bảng chungN/A
EmptyKhông có biếnBảng rỗngN/A
ErrorAPI lỗi"Failed to load env systems" + thông điệp; lỗi token → "Login again"N/A
DisabledN/A—N/A
Fields ​

Bộ key cụm SAPP đọc (Fact — be/libs/constants/src/lib/env-system/env-system.constants.ts:6-55):

Hệ ngoàiprodstagingdevGhi chú
HubSpot CRMSAPP_PROD_HUBSPOT_{API_URL,ACCESS_TOKEN,CLIENT_SERCET}⚠️ dùng lại bộ PRODSAPP_DEV_HUBSPOT_{…}Chỉ ACCESS_TOKEN được đọc (BR-05); tên key viết sai chính tả SERCET đúng như code
SAPP Ops (tự đăng nhập)SAPP_OPS_{API_URL,USERNAME,PASSWORD}_PROD…_STAGING…_DEVBR-06
SAPP Ops (bộ cũ)SAPP_BASE_API_URL, SAPP_API_TOKEN — một bộ, không theo môi trườngBR-07; dùng bởi FS 24395 (bulk product)
DB SAPP Ops— (không có key, cố ý)SAPP_OPS_DB_{HOST,PORT,NAME,USERNAME,PASSWORD}_STAGING…_DEVBR-08
SAP serviceSAPP_SAP_{API_URL,CLIENT_ID,HMAC_SECRET}_PROD…_STAGING…_DEVBR-09
Key riêng của FS nhómSAPP_PROD_ECONTRACT_DB_* (FS 20603), SAPP_LMS_API_URL_{DEV,STAGING} (FS 26297)Mô tả ở FS nhóm tương ứng

Cột trên màn:

FieldRequiredTypeDefaultFormatValidationError MessageVisibilityDepends On
ID—Number————Always—
Key—Text (mono)————Always—
Value—Giá trị cheche———Always (che)—
Updated—Datetime————Always—
Filter / Search / Sort ​
LoạiTheo fieldKiểuDefaultNotes
Filter———Không có bộ lọc
SearchKeyfree-text—"Search by key…" (fe/src/ui/pages/cms/(env-systems)/page.tsx:139)
Sort——Mặc định của APIKhông có điều khiển
Pagination——10 / trang:64-67
Actions ​
A1 - Tạo / sửa biến ​
ItemDescription
Trigger"Create variable" hoặc sửa một dòng → M2
BehaviorPOST / PATCH /api/v1/env-systems. Ghi bảng env_systems — DB mind_keep. ⚠️ Ghi PROD (gián tiếp): sửa key …_PROD đổi đích gọi / credential của các thao tác prod ở mọi sub-tool
Success Result"Env system created/updated — The env system has been … successfully."

Error cases:

CaseExpected Handling
Key trùngLỗi từ BE (key unique)
Không có quyềnLỗi quyền CMS
A2 - Xoá biến ​
ItemDescription
TriggerXoá một dòng → xác nhận "Delete variable?" — "<key> will be deleted. Services that read it fall back to their defaults."
BehaviorDELETE /api/v1/env-systems/:id. Xoá dòng trong env_systems — DB mind_keep
Success Result"Env system deleted…"

Error cases:

CaseExpected Handling
Xoá một key SAPP đang dùngDịch vụ SAPP tương ứng báo lỗi "chưa cấu hình" ở lời gọi sau (BR-05…BR-09) — xem EC-M1.2
Acceptance Criteria của màn M1 &ZeroWidthSpace;
AC-M1.1 - Xem danh sách có che giá trị &ZeroWidthSpace;
gherkin
Given Admin có quyền env_systems:read
When mở /cms/env-systems
Then bảng "System Env" hiện ID, Key, Value (che), Updated

Maps to:

  • Business Rule: BR-01, BR-11
AC-M1.2 - Xoá có xác nhận &ZeroWidthSpace;
gherkin
Given Admin bấm xoá biến SAPP_SAP_API_URL_DEV
When xác nhận "Delete variable"
Then biến bị xoá và bảng tải lại

Maps to:

  • Business Rule: BR-11
Negative AC / Edge Cases của màn M1 &ZeroWidthSpace;
IDTình huốngHành vi mong đợi
EC-M1.1Phiên CMS hết hạn"Failed to load env systems" + "Login again"
EC-M1.2⚠️ Observed — Câu xác nhận xoá nói dịch vụ "fall back to their defaults"Dịch vụ SAPP không có giá trị mặc định: báo 12001 / 13030 / 13037 / "chưa cấu hình" (OQ-P-21)
EC-M1.3⚠️ Observed — Secret (mật khẩu Ops, DB, HMAC, token HubSpot) lưu dạng rõHành vi hiện tại (be/libs/database/src/lib/entities/env/env-system.entity.ts:10-11; OQ-P-12)

Màn M2 - Form biến môi trường &ZeroWidthSpace;

FieldValue
Figma frameN/A — as-built, không có Figma
Trigger vào màn"Create variable" / sửa dòng ở M1
Mô tả ngắnForm hai trường Key / Value
UI States &ZeroWidthSpace;
StateKhi nàoHiển thịFigma frame
DefaultMở formKey, Value (sửa thì điền sẵn)N/A
ErrorBE từ chốiHộp lỗiN/A
Loading / Empty / Has data / DisabledN/A — form—N/A
Fields &ZeroWidthSpace;
FieldRequiredTypeDefaultFormatValidationError MessageVisibilityDepends On
KeyYesText— ("Enter key")Tên key đúng như bảng M1Duy nhất (BR-02)Lỗi BEAlways—
ValueNoText— ("Enter value")URL / token / mật khẩu——AlwaysKey
Filter / Search / Sort &ZeroWidthSpace;

N/A — không phải màn List.

Actions &ZeroWidthSpace;
A1 - Submit &ZeroWidthSpace;
ItemDescription
TriggerBấm lưu
BehaviorNhư M1 A1
Success ResultGiá trị có hiệu lực ở lời gọi sau (BR-03)

Error cases:

CaseExpected Handling
Thiếu KeyForm không gửi
Acceptance Criteria của màn M2 &ZeroWidthSpace;
AC-M2.1 - Tạo biến &ZeroWidthSpace;
gherkin
Given Admin nhập Key "SAPP_OPS_DB_HOST_STAGING" và Value
When lưu
Then biến được tạo trong env_systems

Maps to:

  • Business Rule: BR-02
AC-M2.2 - Có hiệu lực không cần khởi động lại &ZeroWidthSpace;
gherkin
Given sub-tool 26878 đang báo lỗi 13037 trên staging
When Admin thêm đủ SAPP_SAP_API_URL_STAGING, SAPP_SAP_CLIENT_ID_STAGING, SAPP_SAP_HMAC_SECRET_STAGING
Then lần tra vết SAP tiếp theo trên staging chạy được, không cần khởi động lại API

Maps to:

  • Business Rule: BR-03, BR-09
AC-M2.3 - Thiếu key → lỗi theo hệ &ZeroWidthSpace;
gherkin
Given thiếu SAPP_DEV_HUBSPOT_ACCESS_TOKEN
When một sub-tool gọi HubSpot dev
Then nhận lỗi 12001 "HubSpot access token is not configured for this environment"
And thiếu key Ops tự đăng nhập thì lỗi 13030, thiếu key SAP thì lỗi 13037

Maps to:

  • Business Rule: BR-04, BR-05, BR-06, BR-09
AC-M2.4 - Bộ Ops cũ không theo môi trường &ZeroWidthSpace;
gherkin
Given SAPP_BASE_API_URL trỏ tới một môi trường Ops
When sub-tool dùng bộ cũ (bulk product 24395) chạy
Then mọi lời gọi đi tới đúng URL đó bất kể người dùng chọn môi trường nào

Maps to:

  • Business Rule: BR-07
AC-M2.5 - DB Ops chỉ dev/staging, PORT mặc định &ZeroWidthSpace;
gherkin
Given có đủ SAPP_OPS_DB_HOST_DEV, _NAME_DEV, _USERNAME_DEV, _PASSWORD_DEV nhưng không có _PORT_DEV
When hỏi trạng thái SQL trên dev
Then configured = true và kết nối dùng cổng 5432
And không có key nào khiến prod "configured"

Maps to:

  • Business Rule: BR-08
AC-M2.6 - Khoảng trắng thừa &ZeroWidthSpace;
gherkin
Given SAPP_SAP_API_URL_DEV = " https://sap.example/ "
When dịch vụ SAP đọc
Then dùng "https://sap.example"

Maps to:

  • Business Rule: BR-10
Negative AC / Edge Cases của màn M2 &ZeroWidthSpace;
IDTình huốngHành vi mong đợi
EC-M2.1Gõ sai tên key (vd SAPP_OPS_DB_HOST_STG)Lưu được, nhưng dịch vụ coi như thiếu key (BR-04)
EC-M2.2⚠️ Observed — Đặt key HubSpot cho "staging"Không có key staging: staging luôn dùng token PROD (be/libs/constants/src/lib/hubspot/hubspot.constants.ts:19-26; NFR-P-03, OQ-P-03)

5. Cross-feature AC &ZeroWidthSpace;

AC-X.1 - Mọi FS nhóm phụ thuộc cấu hình này &ZeroWidthSpace;

gherkin
Given một key của hệ ngoài bị thiếu cho môi trường X
When bất kỳ sub-tool nào (HubSpot, 20603, 24395, 23954, 26878, 26297) gọi hệ đó trên X
Then sub-tool nhận lỗi "chưa cấu hình" tương ứng của hệ đó

Maps to:

  • REL-01…REL-06 (Be Affected - 6 FS nhóm tool)