# Web Layer - API Controllers **Module**: `openhis-application/web` **Role**: API endpoint layer - all REST controllers for frontend communication ## OVERVIEW 46 web modules serving REST APIs for all business functionality. ## STRUCTURE ``` web/ ├── [module-name]/ │ ├── controller/ # REST endpoints (@RestController) │ ├── dto/ # Data transfer objects │ ├── mapper/ # MyBatis mappers (if module-specific) │ └── appservice/ # Application service layer │ └── impl/ ``` ## WHERE TO LOOK | Task | Location | |------|----------| | API endpoints | `*/controller/*Controller.java` | | Request/Response schemas | `*/dto/*.java` | | Business logic orchestration | `*/appservice/*.java` | ## CONVENTIONS - Controllers: `@RestController`, `@RequestMapping("/module-name")` - Standard response: `AjaxResult` from core-common - DTO naming: `XxxRequest`, `XxxResponse`, `XxxDTO` - Service pattern: interface in `appservice/`, impl in `appservice/impl/` - API naming: `listXxx()`, `getXxx()`, `addXxx()`, `updateXxx()`, `deleteXxx()` ## ANTI-PATTERNS - Never put business logic in controllers - delegate to appservice - Never return raw entities - use DTOs - Never bypass `AjaxResult` wrapper - Never create module-specific mappers without justification