# Nền tảng Microservices GoodGo

[![English](https://img.shields.io/badge/Language-English-blue.svg)](README.md) [![Tiếng Việt](https://img.shields.io/badge/Ngôn%20ngữ-Tiếng%20Việt-red.svg)](README.vi.md)

Nền tảng microservices cấp doanh nghiệp được xây dựng với các công nghệ hiện đại và thực tiễn tốt nhất.

## 🏗️ Kiến trúc

Monorepo này tuân theo mô hình kiến trúc microservices với:

- **Apps**: Các ứng dụng Frontend (Web + Mobile)
- **Services**: Các Backend microservices (Node.js/TypeScript)
- **Packages**: Các thư viện và tiện ích dùng chung
- **Infrastructure**: Traefik, Observability, Databases
- **Deployments**: Cấu hình riêng cho từng môi trường

## 📁 Cấu trúc Dự án

```
├── apps/                 # Ứng dụng Frontend
│   ├── web-admin/       # Web admin (Next.js)
│   ├── web-client/      # Web client (Next.js)
│   ├── app-admin/       # App admin (Flutter)
│   └── app-client/      # App client (Flutter)
├── services/            # Backend microservices
│   ├── iam-service/     # Dịch vụ IAM (Identity & Access Management) (Node.js)
│   └── _template/       # Template mẫu cho service mới
├── packages/            # Thư viện dùng chung
│   ├── auth-sdk/        # Tiện ích xác thực và guards
│   ├── config/          # Cấu hình chung
│   ├── http-client/     # API client chuẩn hóa
│   ├── logger/          # Logging tập trung (Winston)
│   ├── tracing/         # Cấu hình OpenTelemetry
│   └── types/           # Các kiểu dữ liệu TypeScript dùng chung
├── infra/               # Infrastructure as Code
│   ├── databases/       # Cấu hình Database (PostgreSQL/Neon, Redis)
│   ├── docker/          # File Docker compose
│   ├── observability/   # Stack giám sát (Prometheus, Grafana, Loki)
│   ├── secrets/         # Quản lý bảo mật
│   └── traefik/         # Cấu hình API Gateway
├── deployments/         # Cấu hình môi trường
│   ├── local/           # Thiết lập dev local
│   ├── staging/         # Môi trường Staging (Kubernetes)
│   └── production/      # Môi trường Production (Kubernetes)
├── scripts/             # Script tự động hóa (Song ngữ EN/VI)
│   ├── build/           # Script build
│   ├── db/              # Quản lý Database (backup, seed, migrate)
│   ├── deploy/          # Script deploy
│   ├── dev/             # Hỗ trợ Development
│   ├── setup/           # Khởi tạo dự án
│   └── utils/           # Script tiện ích
└── docs/                # Tài liệu
```

## ⚠️ Thay Đổi Quan Trọng (Breaking Changes)

### v1.0.0 - Di chuyển sang ES Modules (2026-01-07)

**BREAKING**: Tất cả shared packages hiện sử dụng ES modules thay vì CommonJS.

**Những gì đã thay đổi:**
- Đích compile của TypeScript đã đổi từ `commonjs` sang `ES2020`
- Tất cả packages (`@goodgo/types`, `@goodgo/http-client`, `@goodgo/logger`, `@goodgo/auth-sdk`, `@goodgo/tracing`) hiện xuất ra ES modules
- File `package.json` đã khai báo `"type": "module"`, giờ output TypeScript đã khớp

**Cần di chuyển code:**
Nếu bạn có code hiện tại đang import các packages này:

```typescript
// ✅ Cách này vẫn hoạt động (không cần thay đổi trong hầu hết trường hợp)
import { UserResponse } from '@goodgo/types';
import { createHttpClient } from '@goodgo/http-client';

// ⚠️ Nếu bạn đang dùng require() (CommonJS), bạn phải cập nhật:
// ❌ CŨ: const { UserResponse } = require('@goodgo/types');
// ✅ MỚI: import { UserResponse } from '@goodgo/types';
```

**Hành động cần thiết:**
1. Pull code mới nhất
2. Clean và rebuild: `pnpm -r --filter "./packages/*" run clean && pnpm build`
3. Cập nhật mọi câu lệnh `require()` (CommonJS) thành `import` (ES)

**Files đã thay đổi:**
- `packages/config/tsconfig/node.json` - Đổi `"module": "commonjs"` → `"module": "ES2020"`
- `packages/types/tsconfig.json` - Thêm `"moduleResolution": "node"`

Để biết thông tin chi tiết, xem [Hướng dẫn Di chuyển](docs/vi/guides/module-format-migration.md).

## 🚀 Bắt đầu

### Yêu cầu tiên quyết

- Node.js >= 20.0.0
- pnpm >= 8.0.0
- Docker & Docker Compose
- Tài khoản Neon (https://neon.tech) - cho PostgreSQL database

### Khởi tạo nhanh (1 Lệnh duy nhất)

Chúng tôi cung cấp script khởi tạo toàn diện để bạn bắt đầu nhanh chóng:

```bash
./scripts/setup/init-project.sh
```

Script này sẽ:
1.  Kiểm tra các yêu cầu tiên quyết
2.  Cài đặt dependencies
3.  Tạo Prisma clients
4.  Tạo các file `.env` cần thiết từ file mẫu

### Cài đặt thủ công

Nếu bạn muốn thiết lập thủ công:

```bash
# Cài đặt dependencies
pnpm install

# Tạo Prisma clients
pnpm prisma:generate

# Khởi động tất cả services (chế độ development)
./scripts/dev/start-all.sh
```

### Quy trình Development Local

1.  **Thiết lập Database**:
    ```bash
    ./scripts/db/setup-neon.sh
    # Làm theo hướng dẫn để cấu hình Neon URL của bạn
    ```

2.  **Khởi động Infrastructure**:
    ```bash
    # Khởi động Redis, Traefik, và Observability stack
    cd deployments/local
    docker-compose up -d
    ```

3.  **Chạy Migrations**:
    ```bash
    ./scripts/db/migrate.sh iam-service dev
    ```

4.  **Khởi động Services**:
    ```bash
    ./scripts/dev/start-all.sh
    # Hoặc khởi động service cụ thể:
    # ./scripts/dev/start-service.sh iam-service
    ```

## 🛠️ Các Script Hỗ trợ

Thư mục `scripts/` chứa các script tự động hóa song ngữ (Anh/Việt) giúp đơn giản hóa các tác vụ hàng ngày:

| Danh mục | Script | Mô tả |
|---|---|---|
| **Setup** | `init-project.sh` | Khởi tạo toàn bộ dự án |
| | `install-deps.sh` | Cài đặt dependencies |
| **Dev** | `start-all.sh` | Khởi động hạ tầng và tất cả services |
| | `start-service.sh` | Khởi động một service cụ thể |
| | `logs.sh` | Xem log của services hoặc docker containers |
| | `setup-env.sh` | Hỗ trợ thiết lập biến môi trường |
| **DB** | `migrate.sh` | Chạy Prisma migrations (dev/deploy) |
| | `seed.sh` | Seed data ban đầu cho database |
| | `backup.sh` | Backup database (hỗ trợ Neon) |
| | `setup-neon.sh` | Wizard cấu hình kết nối Neon DB |
| **Utils** | `create-service.sh` | Tạo microservice mới từ template |
| | `cleanup.sh` | Dọn dẹp file build và cache |
| **Build** | `build-all.sh` | Build toàn bộ monorepo |
| | `build-service.sh` | Build service cụ thể |
| **Deploy** | `deploy-staging.sh` | Deploy lên cluster staging |
| | `deploy-prod.sh` | Deploy lên cluster production |

## 🛠️ Công nghệ sử dụng

**Frontend:**
- Web: Next.js 14+ (App Router)
- Mobile: Flutter 3.x
- Styling: Tailwind CSS
- State: Zustand / Provider

**Backend:**
- Runtime: Node.js + TypeScript
- Framework: Express/NestJS (thông qua service template)
- ORM: Prisma
- Database: PostgreSQL (Neon Serverless), Redis (Caching/Queues)

**Infrastructure:**
- Gateway: Traefik
- Containerization: Docker
- Orchestration: Kubernetes
- Observability: Prometheus, Grafana, Loki, OpenTelemetry

**DevOps:**
- Build System: Turborepo
- Package Manager: PNPM Workspaces
- CI/CD: GitHub Actions

## 🌐 Tiêu chuẩn Code

### Comment Song ngữ
Để hỗ trợ đội ngũ đa dạng, chúng tôi tuân thủ tiêu chuẩn comment song ngữ (Anh & Việt) cho:
- Scripts
- Các logic phức tạp
- Public APIs
- Các file cấu hình

Ví dụ:
```bash
# EN: Verify Docker daemon is running
# VI: Xác minh Docker daemon đang chạy
```

### Quản lý Monorepo
- Sử dụng **Turborepo** cho quy trình build và caching.
- **PNPM Workspaces** quản lý dependencies giữa các apps và services.

## 📚 Tài liệu

- [Tổng quan Kiến trúc](docs/vi/architecture/system-design.md)
- [Tài liệu API](docs/vi/api/openapi/)
- [Hướng dẫn Phát triển](docs/vi/guides/development.md)
- [Hướng dẫn Deployment](docs/vi/guides/deployment.md)
- [Hướng dẫn Đóng góp](CONTRIBUTING.md)

## 🔐 Biến môi trường

**Quan trọng**: Không bao giờ commit file `.env`. Hãy sử dụng `.env.example` làm mẫu.

- **Dev**: `deployments/local/.env.local` (Dùng chung), `services/*/.env.local` (Riêng cho Service)
- **Staging/Prod**: Được quản lý qua Kubernetes Secrets

## 🤝 Đóng góp

Vui lòng đọc file [CONTRIBUTING.md](CONTRIBUTING.md) để biết chi tiết về quy tắc ứng xử và quy trình gửi pull requests của chúng tôi.

## 📄 Giấy phép

Dự án này được cấp phép theo Giấy phép MIT - xem file [LICENSE](LICENSE) để biết chi tiết.

## 👥 Nhóm phát triển

Được xây dựng với ❤️ bởi đội ngũ GoodGo
