# 7.Quy trình phối hợp & quản lý thay đổi các nhóm

### 7.1. Mục tiêu chương

<div id="bkmrk-">  
</div>Chương này quy định cách phối hợp giữa nhiều đơn vị phát triển nhằm:

- Tránh xung đột giữa FE, BE và Database
- Đảm bảo tích hợp ổn định
- Giữ tính tương thích giữa các module
- Kiểm soát các thay đổi ảnh hưởng hệ thống

### 7.2. Khái niệm / phạm vi áp dụng

<div id="bkmrk--1">  
</div>Áp dụng khi:

- Có nhiều đơn vị cùng phát triển
- FE và BE tách source
- Nhiều FE dùng chung BE
- BE tách thành nhiều service

Mọi thay đổi liên quan:

- API contract
- Entity/Database
- Auth
- Domain/CORS

đều phải thông qua Core Team.

### 7.3. Quy định chính

#### Nguyên tắc chung

- Dùng contract-first (OpenAPI là nguồn chuẩn)
- Mọi thay đổi API hoặc DB phải được kiểm soát
- Mọi thay đổi breaking phải qua Core Team

---

#### Trường hợp FE và BE khác source, dùng chung DB

Rủi ro:

- Sai contract API
- Response làm FE vỡ
- Migration xung đột

Quy định:

- BE thay đổi API/DB phải update OpenAPI
- Mọi thay đổi DB phải có migration
- Staging dùng DB chung

Quy trình:

1. FE tạo ticket: API CONTRACT ISSUE
2. BE/Core xác nhận
3. Fix backward compatible hoặc tạo API v2

---

#### Trường hợp FE và BE dùng DB riêng khi dev

Quy định:

- Có DB baseline chung
- Staging dùng DB chung

Quy trình:

1. Nếu staging lỗi → so version migration
2. Không cho merge nếu thiếu migration

---

#### Trường hợp nhiều FE dùng chung một BE

Quy định:

- Dùng IdP chung (WSO2/Keycloak)
- Mỗi FE là một OAuth client riêng
- Gọi API bằng JWT

Quy trình:

1. FE đăng ký client\_id
2. Core cấu hình redirectUri, scope
3. Core cấp quyền

---

#### Trường hợp FE chung source, BE nhiều service

Quy định:

- FE cấu hình baseURL theo service
- Auth dùng token chung
- CORS do Core Team quản lý

Quy trình:

1. Thêm service → tạo Integration Checklist
2. Core cấu hình CORS và token audience

---

#### Trường hợp thay đổi response làm FE vỡ

Quy định:

- Chỉ được thêm field (non-breaking)
- Không đổi kiểu dữ liệu
- Không rename field
- Breaking change phải tạo /api/v2

Quy trình:

1. Tạo BREAKING CHANGE REQUEST
2. Core duyệt
3. Thông báo FE

---

#### Trường hợp xung đột entity/model

Quy định:

- Entity dùng chung → coi là shared model
- Phải qua Data Model Change Request

Quy trình:

1. Partner đề xuất field + migration
2. Core review
3. Approve hoặc yêu cầu sửa

---

#### Trường hợp migration xung đột

Quy định:

- Không sửa migration đã merge
- Tạo migration mới để fix forward

Quy trình:

1. Rebase
2. Tạo migration mới
3. Test staging

---

#### Trường hợp seed/master data bị sửa

Quy định:

- Seed core do Core Team quản lý
- Partner chỉ được đề xuất

Quy trình:

1. Tạo MASTER DATA REQUEST
2. Core duyệt và triển khai

### 7.4. Quy trình triển khai tính năng nhiều tầng

<div id="bkmrk--11">  
</div>1. Tạo ticket Feature
2. Chốt API contract (OpenAPI)
3. Chốt entity/migration
4. BE implement
5. FE integrate
6. Test staging
7. Release

### 7.5.Ví dụ minh họa

<div id="bkmrk--12">  
</div>**1. bảng mô tả các môi trường hệ thống:**

<table class="w-fit min-w-(--thread-content-width)" data-end="1244" data-start="953" id="bkmrk-env-fe-url-be-url-db"><thead data-end="990" data-start="953"><tr data-end="990" data-start="953"><th class="" data-col-size="sm" data-end="959" data-start="953">Env</th><th class="" data-col-size="sm" data-end="968" data-start="959">FE URL</th><th class="" data-col-size="sm" data-end="977" data-start="968">BE URL</th><th class="" data-col-size="sm" data-end="982" data-start="977">DB</th><th class="" data-col-size="sm" data-end="990" data-start="982">Auth</th></tr></thead><tbody data-end="1244" data-start="1029"><tr data-end="1099" data-start="1029"><td data-col-size="sm" data-end="1035" data-start="1029">dev</td><td data-col-size="sm" data-end="1059" data-start="1035"><a class="decorated-link cursor-pointer" data-end="1058" data-start="1037" rel="noopener" target="_new">http://localhost:4200<span aria-hidden="true" class="ms-0.5 inline-block align-middle leading-none"><svg aria-hidden="true" class="block h-[0.75em] w-[0.75em] stroke-current stroke-[0.75]" data-rtl-flip="" height="20" width="20" xmlns="http://www.w3.org/2000/svg"></svg></span></a></td><td data-col-size="sm" data-end="1083" data-start="1059"><a class="decorated-link cursor-pointer" data-end="1082" data-start="1061" rel="noopener" target="_new">http://localhost:8080<span aria-hidden="true" class="ms-0.5 inline-block align-middle leading-none"><svg aria-hidden="true" class="block h-[0.75em] w-[0.75em] stroke-current stroke-[0.75]" data-rtl-flip="" height="20" width="20" xmlns="http://www.w3.org/2000/svg"></svg></span></a></td><td data-col-size="sm" data-end="1091" data-start="1083">local</td><td data-col-size="sm" data-end="1099" data-start="1091">mock</td></tr><tr data-end="1182" data-start="1100"><td data-col-size="sm" data-end="1110" data-start="1100">staging</td><td data-col-size="sm" data-end="1135" data-start="1110"><a class="decorated-link cursor-pointer" data-end="1134" data-start="1112" rel="noopener" target="_new">https://staging.app.vn<span aria-hidden="true" class="ms-0.5 inline-block align-middle leading-none"><svg aria-hidden="true" class="block h-[0.75em] w-[0.75em] stroke-current stroke-[0.75]" data-rtl-flip="" height="20" width="20" xmlns="http://www.w3.org/2000/svg"></svg></span></a></td><td data-col-size="sm" data-end="1160" data-start="1135"><a class="decorated-link cursor-pointer" data-end="1159" data-start="1137" rel="noopener" target="_new">https://staging.api.vn<span aria-hidden="true" class="ms-0.5 inline-block align-middle leading-none"><svg aria-hidden="true" class="block h-[0.75em] w-[0.75em] stroke-current stroke-[0.75]" data-rtl-flip="" height="20" width="20" xmlns="http://www.w3.org/2000/svg"></svg></span></a></td><td data-col-size="sm" data-end="1169" data-start="1160">shared</td><td data-col-size="sm" data-end="1182" data-start="1169">WSO2 thật</td></tr><tr data-end="1244" data-start="1183"><td data-col-size="sm" data-end="1190" data-start="1183">prod</td><td data-col-size="sm" data-end="1207" data-start="1190">[https://app.vn<span aria-hidden="true" class="ms-0.5 inline-block align-middle leading-none"><svg aria-hidden="true" class="block h-[0.75em] w-[0.75em] stroke-current stroke-[0.75]" data-rtl-flip="" height="20" width="20" xmlns="http://www.w3.org/2000/svg"></svg></span>](https://app.vn/)</td><td data-col-size="sm" data-end="1224" data-start="1207"><a class="decorated-link cursor-pointer" data-end="1223" data-start="1209" rel="noopener" target="_new">https://api.vn<span aria-hidden="true" class="ms-0.5 inline-block align-middle leading-none"><svg aria-hidden="true" class="block h-[0.75em] w-[0.75em] stroke-current stroke-[0.75]" data-rtl-flip="" height="20" width="20" xmlns="http://www.w3.org/2000/svg"></svg></span></a></td><td data-col-size="sm" data-end="1231" data-start="1224">prod</td><td data-col-size="sm" data-end="1244" data-start="1231">WSO2 thật</td></tr></tbody></table>