# DATA LAYER ABSTRACTION & DEMO MODE

[← Backend Architecture](./01-backend-architecture.md) | [Next: Authentication →](./03-authentication-authorization.md)

---

Hệ thống hỗ trợ **2 chế độ vận hành** thông qua **Configuration Flag**:

## Data Storage Modes

**Mode 1: Demo Mode (Development/Testing)**
- Sử dụng **JSON files** hoặc **In-memory storage** với cấu trúc tương tự MongoDB
- Dữ liệu demo được định nghĩa sẵn trong `data/demo/` folder
- Không cần MongoDB server
- Phù hợp cho development, testing, và demo
- Cấu trúc dữ liệu giống hệt MongoDB collections

**Mode 2: Production Mode (Self-hosted MongoDB)**
- Sử dụng **MongoDB** thực tế (Self-hosted hoặc MongoDB Atlas)
- Kết nối qua Mongoose
- Dữ liệu lưu trữ trong MongoDB database
- Phù hợp cho production environment

---

## Configuration Flag

**Environment Variable:**
```env
# .env file
DATA_MODE=demo  # hoặc 'mongodb'
# DATA_MODE=mongodb  # Cho production
```

**Configuration File:**
```typescript
// src/config/data.config.ts
export const DATA_CONFIG = {
  mode: process.env.DATA_MODE || 'demo', // 'demo' | 'mongodb'
  mongodb: {
    uri: process.env.MONGODB_URI || 'mongodb://localhost:27017/amom',
    options: {
      // MongoDB connection options
    }
  },
  demo: {
    dataPath: './data/demo', // Path to demo JSON files
    autoSave: false, // Auto-save changes to JSON files (optional)
  }
};
```

---

## Data Layer Abstraction Pattern

**Interface/Abstract Layer:**
```typescript
// src/data/IDataAdapter.ts
interface IDataAdapter {
  // CRUD Operations
  find<T>(collection: string, filter: any): Promise<T[]>;
  findOne<T>(collection: string, filter: any): Promise<T | null>;
  create<T>(collection: string, data: T): Promise<T>;
  update<T>(collection: string, filter: any, data: Partial<T>): Promise<T>;
  delete(collection: string, filter: any): Promise<boolean>;
  
  // Advanced Operations
  aggregate(collection: string, pipeline: any[]): Promise<any[]>;
  count(collection: string, filter: any): Promise<number>;
  
  // Connection
  connect(): Promise<void>;
  disconnect(): Promise<void>;
}
```

**Implementations:**
- `DemoDataAdapter`: Đọc/ghi JSON files, cấu trúc giống MongoDB
- `MongoDBAdapter`: Kết nối MongoDB thực tế qua Mongoose

**Usage:**
```typescript
// src/data/dataAdapter.ts
import { DATA_CONFIG } from '../config/data.config';
import { DemoDataAdapter } from './adapters/demo.adapter';
import { MongoDBAdapter } from './adapters/mongodb.adapter';

export const dataAdapter = DATA_CONFIG.mode === 'demo' 
  ? new DemoDataAdapter(DATA_CONFIG.demo)
  : new MongoDBAdapter(DATA_CONFIG.mongodb);
```

Chi tiết: [Data Adapter Implementation](../05-data/04-data-adapter-implementation.md)

---

## Migration Strategy

**Từ Demo sang MongoDB:**
1. Export demo data từ JSON files
2. Import vào MongoDB sử dụng `mongoimport` hoặc script
3. Chuyển đổi `DATA_MODE` từ `demo` sang `mongodb`
4. Restart application

---

## Benefits

✅ **Development**: Không cần setup MongoDB, dễ dàng test
✅ **Demo**: Có sẵn data demo, không cần database
✅ **Production**: Chỉ cần đổi flag, không cần thay đổi code
✅ **Consistency**: Cấu trúc dữ liệu giống nhau giữa 2 modes
✅ **Flexibility**: Dễ dàng switch giữa 2 modes

---

**Next**: [Authentication & Authorization](./03-authentication-authorization.md) | [Demo Data Structure](../05-data/03-demo-data-structure.md)
