tinyqc/docs/architecture.md

283 lines
11 KiB
Markdown
Raw Normal View History

# Architecture Documentation - TinyQC
## Overview
TinyQC follows the **Model-View-Controller (MVC)** architectural pattern as defined by the CodeIgniter 4 framework. This document provides a detailed analysis of the application's architecture, components, and design patterns.
---
## Architecture Pattern
### MVC (Model-View-Controller)
```
┌─────────────────────────────────────────────────────────────────┐
│ HTTP Request │
└────────────────────────────┬────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ Front Controller │
│ (public/index.php) │
└────────────────────────────┬────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ Router │
│ (app/Config/Routes.php) │
└────────────────────────────┬────────────────────────────────────┘
┌────────────────────┼────────────────────┐
▼ ▼ ▼
┌───────────────┐ ┌───────────────┐ ┌───────────────┐
│ Controller │ │ Filter │ │ Middleware │
│ (Handles │ │ (Auth, │ │ (Pre/post │
│ request) │ │ CSRF) │ │ processing)│
└───────┬───────┘ └───────────────┘ └───────────────┘
│ │
▼ │
┌───────────────┐ │
│ Model │◄────────────────────────────────────┘
│ (Data & │ Business Logic
│ Business │
│ Logic) │
└───────┬───────┘
┌───────────────┐
│ View │
│ (Template) │
└───────┬───────┘
┌─────────────────────────────────────────────────────────────────┐
│ HTTP Response │
│ (HTML, JSON, Redirect) │
└─────────────────────────────────────────────────────────────────┘
```
---
## Component Details
### 1. Models Layer
The Models layer handles all data operations using CodeIgniter's Model class.
#### Base Model (`BaseModel.php`)
- Provides automatic camelCase/snake_case conversion
- Extends `CodeIgniter\Model` with custom functionality
- Standardized data handling across all models
#### Dictionary Models
| Model | Table | Purpose |
|-------|-------|---------|
| `DictDeptModel.php` | dict_dept | Department master data |
| `DictTestModel.php` | dict_test | Test/parameter master data |
| `DictControlModel.php` | dict_control | Control master data |
#### Entity Models
| Model | Table | Purpose |
|-------|-------|---------|
| `DeptModel.php` | dept | Department CRUD |
| `TestModel.php` | test | Test CRUD |
| `ControlModel.php` | control | Control CRUD |
| `ControlTestModel.php` | control_test | Control-test relationships |
#### Result Models
| Model | Table | Purpose |
|-------|-------|---------|
| `ResultModel.php` | results | Result data |
| `DailyResultModel.php` | daily_results | Daily QC entries |
| `MonthlyCommentModel.php` | monthly_comments | Monthly comments |
| `ResultCommentModel.php` | result_comments | Result annotations |
---
### 2. Controllers Layer
Controllers handle HTTP requests, interact with models, and return responses.
#### Page Controllers
| Controller | Base Class | Responsibilities |
|------------|------------|------------------|
| `BaseController.php` | `\CodeIgniter\BaseController` | Common controller setup |
| `Dashboard.php` | BaseController | Dashboard rendering |
| `Dept.php` | BaseController | Department management UI |
| `Test.php` | BaseController | Test management UI |
| `Control.php` | BaseController | Control management UI |
| `Entry.php` | BaseController | Entry forms (daily/monthly) |
| `Report.php` | BaseController | Report generation UI |
| `PageController.php` | BaseController | Generic page handling |
#### API Controllers
All API controllers extend base functionality and return JSON responses.
| Controller | Endpoints | Format |
|------------|-----------|--------|
| `DeptApiController.php` | GET/POST/PUT/DELETE /api/dept | JSON |
| `TestApiController.php` | GET/POST/PUT/DELETE /api/test | JSON |
| `ControlApiController.php` | GET/POST/PUT/DELETE /api/control | JSON |
| `EntryApiController.php` | POST /api/entry/* | JSON |
---
### 3. Views Layer
Views use PHP templates with TailwindCSS and DaisyUI for styling.
#### View Structure
```
app/Views/
├── layout/
│ └── form_layout.php # Main layout template
├── dashboard.php # Dashboard view
├── dept/
│ ├── index.php # Department list
│ └── dialog_form.php # Department form dialog
├── test/
│ ├── index.php # Test list
│ └── dialog_form.php # Test form dialog
├── control/
│ ├── index.php # Control list
│ └── dialog_form.php # Control form dialog
├── entry/
│ ├── daily.php # Daily entry form
│ └── monthly.php # Monthly entry form
├── report/
│ ├── index.php # Report selection
│ └── view.php # Report display
└── errors/ # Error page templates
```
#### Frontend Stack
- **TailwindCSS:** Utility-first CSS framework
- **Alpine.js:** Lightweight JavaScript framework
- **DaisyUI:** TailwindCSS component library
- **FontAwesome 7:** Icon library
---
## Data Architecture
### Database (SQL Server)
The application uses SQL Server as its primary database with the following schema pattern:
#### Core Tables
- `dict_dept` - Department dictionary
- `dict_test` - Test/parameter dictionary
- `dict_control` - Control dictionary
- `dept` - Department data
- `test` - Test data
- `control` - Control data
- `control_test` - Control-test relationships
#### Result Tables
- `results` - Result storage
- `daily_results` - Daily QC data
- `monthly_comments` - Monthly comments
- `result_comments` - Result annotations
#### Naming Convention
- Dictionary tables: `dict_*`
- Data tables: Singular lowercase
- Junction tables: `*_test` (noun-noun)
---
## API Design
### RESTful Endpoints
#### Department API (`/api/dept`)
| Method | Endpoint | Description |
|--------|----------|-------------|
| GET | /api/dept | List all departments |
| GET | /api/dept/:id | Get department by ID |
| POST | /api/dept | Create department |
| PUT | /api/dept/:id | Update department |
| DELETE | /api/dept/:id | Delete department |
#### Test API (`/api/test`)
| Method | Endpoint | Description |
|--------|----------|-------------|
| GET | /api/test | List all tests |
| GET | /api/test/:id | Get test by ID |
| POST | /api/test | Create test |
| PUT | /api/test/:id | Update test |
| DELETE | /api/test/:id | Delete test |
#### Control API (`/api/control`)
| Method | Endpoint | Description |
|--------|----------|-------------|
| GET | /api/control | List all controls |
| GET | /api/control/:id | Get control by ID |
| POST | /api/control | Create control |
| PUT | /api/control/:id | Update control |
| DELETE | /api/control/:id | Delete control |
#### Entry API (`/api/entry`)
| Method | Endpoint | Description |
|--------|----------|-------------|
| GET | /api/entry/controls | Get controls for entry |
| GET | /api/entry/tests | Get tests for entry |
| POST | /api/entry/daily | Save daily result |
| POST | /api/entry/monthly | Save monthly entry |
| POST | /api/entry/comment | Save comment |
---
## Configuration Management
### Environment Configuration
- File: `env` (copy to `.env`)
- Database settings in `app/Config/Database.php`
- Route definitions in `app/Config/Routes.php`
### Database Configuration
```php
database.default.hostname = localhost
database.default.port = 1433
database.default.database = tinyqc
database.default.username = sa
database.default.password = your_password
database.default.DBDriver = SQLSRV
```
---
## Development Workflow
### Code Organization
1. Models in `app/Models/` - Data access
2. Controllers in `app/Controllers/` - Request handling
3. Views in `app/Views/` - UI templates
4. Routes in `app/Config/Routes.php` - URL mapping
### Adding New Features
1. Create model in `app/Models/`
2. Create API controller in `app/Controllers/Api/`
3. Add routes in `app/Config/Routes.php`
4. Create views in `app/Views/[module]/`
5. Add menu item in layout if needed
---
## Security Considerations
- **Input Validation:** CodeIgniter 4 Validation library
- **CSRF Protection:** Built-in CodeIgniter CSRF filter
- **SQL Injection:** Parameterized queries via Query Builder
- **XSS Protection:** Output escaping in Views
- **Session Management:** CodeIgniter Session library
---
## Performance Considerations
- **Caching:** CodeIgniter 4 cache system available
- **Database:** SQL Server with optimized queries
- **Assets:** Static files served from `public/`
- **Debugbar:** Debug toolbar in development mode