# 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