# PROJECT STRUCTURE

[← Setup Instructions](./01-setup-instructions.md) | [Next: Configuration Guide →](./03-configuration-guide.md)

---

## Backend Project Structure (Node.js + Express + Data Abstraction)

```
backend/
├── src/
│   ├── config/
│   │   ├── data.config.ts       # Data mode configuration (DEMO/MONGODB)
│   │   ├── database.ts          # MongoDB connection (chỉ dùng khi mongodb mode)
│   │   ├── jwt.ts               # JWT config
│   │   └── env.ts               # Environment variables
│   ├── data/                    # Data Layer Abstraction
│   │   ├── IDataAdapter.ts      # Interface cho data adapter
│   │   ├── dataAdapter.ts       # Factory: tạo adapter dựa trên DATA_MODE
│   │   ├── adapters/
│   │   │   ├── demo.adapter.ts  # DemoDataAdapter: JSON files
│   │   │   └── mongodb.adapter.ts # MongoDBAdapter: Mongoose
│   │   └── types.ts             # Data types
│   ├── models/                  # Mongoose models (chỉ dùng khi mongodb mode)
│   │   ├── Company.ts
│   │   ├── Project.ts
│   │   ├── Asset.ts
│   │   ├── Ticket.ts
│   │   ├── WorkOrder.ts
│   │   ├── User.ts
│   │   └── ...
│   ├── routes/                  # API routes
│   │   ├── auth.routes.ts
│   │   ├── assets.routes.ts
│   │   ├── tickets.routes.ts
│   │   └── ...
│   ├── controllers/             # Business logic
│   │   ├── auth.controller.ts
│   │   ├── assets.controller.ts
│   │   └── ...
│   ├── middleware/              # Express middleware
│   │   ├── auth.middleware.ts
│   │   ├── rbac.middleware.ts
│   │   ├── error.middleware.ts
│   │   └── validation.middleware.ts
│   ├── services/                # Service layer (sử dụng dataAdapter)
│   │   ├── auth.service.ts
│   │   ├── asset.service.ts
│   │   └── ...
│   ├── utils/                   # Utilities
│   │   ├── logger.ts
│   │   ├── errors.ts
│   │   └── validators.ts
│   ├── types/                   # TypeScript types
│   │   └── index.ts
│   └── app.ts                   # Express app
├── data/                        # Demo Data (chỉ dùng khi demo mode)
│   └── demo/
│       ├── companies.json
│       ├── projects.json
│       ├── assets.json
│       ├── contracts.json
│       ├── tickets.json
│       ├── workOrders.json
│       ├── inventoryItems.json
│       ├── users.json
│       ├── roles.json
│       └── ...
├── scripts/                     # Utility scripts
│   └── migrate-demo-to-mongodb.ts # Script migrate từ demo sang MongoDB
├── package.json
├── tsconfig.json
└── .env                         # DATA_MODE=demo hoặc DATA_MODE=mongodb
```

---

## Frontend Project Structure (Vite + React/Vue)

```
frontend/
├── src/
│   ├── components/             # Reusable components
│   │   ├── common/
│   │   │   ├── Button.tsx
│   │   │   ├── Table.tsx
│   │   │   ├── Form.tsx
│   │   │   └── ...
│   │   └── layout/
│   │       ├── Header.tsx
│   │       ├── Sidebar.tsx
│   │       └── Footer.tsx
│   ├── pages/                   # Page components
│   │   ├── Dashboard/
│   │   ├── Assets/
│   │   ├── Tickets/
│   │   ├── WorkOrders/
│   │   └── ...
│   ├── store/                    # State management
│   │   ├── auth.store.ts
│   │   ├── assets.store.ts
│   │   └── ...
│   ├── services/                 # API services
│   │   ├── api.ts               # Axios instance
│   │   ├── auth.service.ts
│   │   ├── assets.service.ts
│   │   └── ...
│   ├── hooks/                    # Custom hooks (React)
│   │   └── useAuth.ts
│   ├── utils/                    # Utilities
│   │   ├── constants.ts
│   │   ├── helpers.ts
│   │   └── validators.ts
│   ├── types/                    # TypeScript types
│   │   └── index.ts
│   ├── router/                   # Routing
│   │   └── index.tsx
│   ├── App.tsx
│   └── main.tsx
├── package.json
├── vite.config.ts
├── tsconfig.json
└── .env
```

---

## Key Points

- **Data Layer Abstraction**: Tất cả business logic sử dụng `IDataAdapter`, không trực tiếp gọi Mongoose
- **Demo Mode**: Không cần MongoDB, chỉ cần JSON files trong `data/demo/`
- **MongoDB Mode**: Kết nối MongoDB thực tế, sử dụng Mongoose models
- **Configuration**: Chuyển đổi dễ dàng bằng cách đổi `DATA_MODE` trong `.env`

Chi tiết: [Data Layer Abstraction](../03-backend/02-data-layer-abstraction.md)

---

**Next**: [Configuration Guide](./03-configuration-guide.md)
