# 📝 **Documents Management System Version 1.4.5: āđāļ™āļ§āļ—āļēāļ‡āļāļēāļĢāļžāļąāļ’āļ™āļē FullStackJS** **āļŠāļ–āļēāļ™āļ°:** FINAL GUIDELINE Rev.05 **āļ§āļąāļ™āļ—āļĩāđˆ:** 2025-11-29 **āļ­āđ‰āļēāļ‡āļ­āļīāļ‡:** Requirements Specification v1.4.4 **Classification:** Internal Technical Documentation ## 🧠 **1. āļ›āļĢāļąāļŠāļāļēāļ—āļąāđˆāļ§āđ„āļ› (General Philosophy)** āđāļ™āļ§āļ—āļēāļ‡āļ›āļāļīāļšāļąāļ•āļīāļ—āļĩāđˆāļ”āļĩāļ—āļĩāđˆāļŠāļļāļ”āđāļšāļšāļ„āļĢāļšāļ§āļ‡āļˆāļĢāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļžāļąāļ’āļ™āļē NestJS Backend, NextJS Frontend āđāļĨāļ° Tailwind-based UI/UX āđƒāļ™āļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄ TypeScript āļĄāļļāđˆāļ‡āđ€āļ™āđ‰āļ™āļ—āļĩāđˆ **"Data Integrity First"** (āļ„āļ§āļēāļĄāļ–āļđāļāļ•āđ‰āļ­āļ‡āļ‚āļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ•āđ‰āļ­āļ‡āļĄāļēāļāđˆāļ­āļ™) āļ•āļēāļĄāļ”āđ‰āļ§āļĒ Security āđāļĨāļ° UX - **āļ„āļ§āļēāļĄāļŠāļąāļ”āđ€āļˆāļ™ (clarity), āļ„āļ§āļēāļĄāļ‡āđˆāļēāļĒāđƒāļ™āļāļēāļĢāļšāļģāļĢāļļāļ‡āļĢāļąāļāļĐāļē (maintainability), āļ„āļ§āļēāļĄāļŠāļ­āļ”āļ„āļĨāđ‰āļ­āļ‡āļāļąāļ™ (consistency) āđāļĨāļ° āļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āđ„āļ”āđ‰ (accessibility)** āļ•āļĨāļ­āļ”āļ—āļąāđ‰āļ‡āļŠāđāļ•āđ‡āļ - **Strict Typing:** āđƒāļŠāđ‰ TypeScript āļ­āļĒāđˆāļēāļ‡āđ€āļ„āļĢāđˆāļ‡āļ„āļĢāļąāļ” āļŦāđ‰āļēāļĄ `any` - **Consistency:** āđƒāļŠāđ‰āļ āļēāļĐāļēāļ­āļąāļ‡āļāļĪāļĐāđƒāļ™ Code / āļ āļēāļĐāļēāđ„āļ—āļĒāđƒāļ™ Comment - **Resilience:** āļĢāļ°āļšāļšāļ•āđ‰āļ­āļ‡āļ—āļ™āļ—āļēāļ™āļ•āđˆāļ­ Network Failure āđāļĨāļ° Race Condition ## ⚙ïļ **2. āđāļ™āļ§āļ—āļēāļ‡āļ—āļąāđˆāļ§āđ„āļ›āļŠāļģāļŦāļĢāļąāļš TypeScript** ### **2.1 āļŦāļĨāļąāļāļāļēāļĢāļžāļ·āđ‰āļ™āļāļēāļ™** - āđƒāļŠāđ‰ **āļ āļēāļĐāļēāļ­āļąāļ‡āļāļĪāļĐ** āļŠāļģāļŦāļĢāļąāļšāđ‚āļ„āđ‰āļ” - āđƒāļŠāđ‰ **āļ āļēāļĐāļēāđ„āļ—āļĒ** āļŠāļģāļŦāļĢāļąāļš comment āđāļĨāļ°āđ€āļ­āļāļŠāļēāļĢāļ—āļąāđ‰āļ‡āļŦāļĄāļ” - āļāļģāļŦāļ™āļ”āđ„āļ—āļ›āđŒ (type) āļ­āļĒāđˆāļēāļ‡āļŠāļąāļ”āđ€āļˆāļ™āļŠāļģāļŦāļĢāļąāļšāļ•āļąāļ§āđāļ›āļĢ, āļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒ āđāļĨāļ°āļ„āđˆāļēāļ—āļĩāđˆāļŠāđˆāļ‡āļāļĨāļąāļš (return values) āļ—āļąāđ‰āļ‡āļŦāļĄāļ” - āļŦāļĨāļĩāļāđ€āļĨāļĩāđˆāļĒāļ‡āļāļēāļĢāđƒāļŠāđ‰ any; āđƒāļŦāđ‰āļŠāļĢāđ‰āļēāļ‡āđ„āļ—āļ›āđŒ (types) āļŦāļĢāļ·āļ­āļ­āļīāļ™āđ€āļ—āļ­āļĢāđŒāđ€āļŸāļ‹ (interfaces) āļ—āļĩāđˆāļāļģāļŦāļ™āļ”āđ€āļ­āļ‡ - āđƒāļŠāđ‰ **JSDoc** āļŠāļģāļŦāļĢāļąāļšāļ„āļĨāļēāļŠ (classes) āđāļĨāļ°āđ€āļĄāļ˜āļ­āļ” (methods) āļ—āļĩāđˆāđ€āļ›āđ‡āļ™ public - āļŠāđˆāļ‡āļ­āļ­āļ (Export) **āļŠāļąāļāļĨāļąāļāļĐāļ“āđŒāļŦāļĨāļąāļ (main symbol) āđ€āļžāļĩāļĒāļ‡āļŦāļ™āļķāđˆāļ‡āđ€āļ”āļĩāļĒāļ§** āļ•āđˆāļ­āđ„āļŸāļĨāđŒ - āļŦāļĨāļĩāļāđ€āļĨāļĩāđˆāļĒāļ‡āļšāļĢāļĢāļ—āļąāļ”āļ§āđˆāļēāļ‡āļ āļēāļĒāđƒāļ™āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ - āļĢāļ°āļšāļļ // File: path/filename āđƒāļ™āļšāļĢāļĢāļ—āļąāļ”āđāļĢāļāļ‚āļ­āļ‡āļ—āļļāļāđ„āļŸāļĨāđŒ - āļĢāļ°āļšāļļ // āļšāļąāļ™āļ—āļķāļāļāļēāļĢāđāļāđ‰āđ„āļ‚, āļŦāļēāļāļĄāļĩāļāļēāļĢāđāļāđ‰āđ„āļ‚āđ€āļžāļīāđˆāļĄāđƒāļ™āļ­āļ™āļēāļ„āļ• āđƒāļŦāđ‰āđ€āļžāļīāđˆāļĄāļšāļąāļ™āļ—āļķāļ ### **2.2 Configuration & Secrets Management** - **Production/Staging:** - āđƒāļŠāđ‰ Docker secrets āļŦāļĢāļ·āļ­ environment variables āļ—āļĩāđˆ inject āļœāđˆāļēāļ™ CI/CD - āļžāļīāļˆāļēāļĢāļ“āļē Hashicorp Vault āļŦāļĢāļ·āļ­ AWS Secrets Manager āļŠāļģāļŦāļĢāļąāļš production - āļŦāđ‰āļēāļĄāđƒāļŠāđˆ Secrets (Password, Keys) āđƒāļ™ `docker-compose.yml` āļŦāļĨāļąāļ - **Development:** - āđƒāļŠāđ‰ `docker-compose.override.yml` (gitignored) āļŠāļģāļŦāļĢāļąāļš local secrets - āđ„āļŸāļĨāđŒ `docker-compose.yml` āļŦāļĨāļąāļāđƒāļŠāđ‰āļ„āđˆāļē dummy/placeholder - **Validation:** - āđƒāļŠāđ‰ `joi` āļŦāļĢāļ·āļ­ `zod` āđƒāļ™āļāļēāļĢ Validate Environment Variables āļ•āļ­āļ™ Start App āļŦāļēāļāļ‚āļēāļ”āļ•āļąāļ§āđāļ›āļĢāļŠāļģāļ„āļąāļāđƒāļŦāđ‰ Throw Error āļ—āļąāļ™āļ—āļĩ ### **2.3 Idempotency (āļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ–āđƒāļ™āļāļēāļĢāļ—āļģāļ‹āđ‰āļģāđ„āļ”āđ‰)** - āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ—āļĩāđˆāļŠāļģāļ„āļąāļ (Create Document, Approve, Transactional) **āļ•āđ‰āļ­āļ‡** āļ­āļ­āļāđāļšāļšāđƒāļŦāđ‰āđ€āļ›āđ‡āļ™ Idempotent - Client **āļ•āđ‰āļ­āļ‡** āļŠāđˆāļ‡ Header `Idempotency-Key` (UUID) āļĄāļēāļāļąāļš Request - Server **āļ•āđ‰āļ­āļ‡** āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ§āđˆāļē Key āļ™āļĩāđ‰āđ€āļ„āļĒāļ–āļđāļāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļŠāļģāđ€āļĢāđ‡āļˆāđ„āļ›āđāļĨāđ‰āļ§āļŦāļĢāļ·āļ­āđ„āļĄāđˆ āļ–āđ‰āļēāđƒāļŠāđˆ āđƒāļŦāđ‰āļ„āļ·āļ™āļ„āđˆāļēāđ€āļ”āļīāļĄāđ‚āļ”āļĒāđ„āļĄāđˆāļ—āļģāļ‹āđ‰āļģ ### **2.4 āļ‚āđ‰āļ­āļ•āļāļĨāļ‡āđƒāļ™āļāļēāļĢāļ•āļąāđ‰āļ‡āļŠāļ·āđˆāļ­ (Naming Conventions)** | Entity (āļŠāļīāđˆāļ‡āļ—āļĩāđˆāļ•āļąāđ‰āļ‡āļŠāļ·āđˆāļ­) | Convention (āļĢāļđāļ›āđāļšāļš) | Example (āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡) | | :----------------------- | :------------------ | :--------------------------------- | | Classes | PascalCase | UserService | | Property | snake_case | user_id | | Variables & Functions | camelCase | getUserInfo | | Files & Folders | kebab-case | user-service.ts | | Environment Variables | UPPERCASE | DATABASE_URL | | Booleans | Verb + Noun | isActive, canDelete, hasPermission | āđƒāļŠāđ‰āļ„āļģāđ€āļ•āđ‡āļĄ â€” āđ„āļĄāđˆāđƒāļŠāđ‰āļ­āļąāļāļĐāļĢāļĒāđˆāļ­ â€” āļĒāļāđ€āļ§āđ‰āļ™āļ„āļģāļĄāļēāļ•āļĢāļāļēāļ™ (āđ€āļŠāđˆāļ™ API, URL, req, res, err, ctx) ### ðŸ§Đ**2.5 āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ (Functions)** - āđ€āļ‚āļĩāļĒāļ™āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āđƒāļŦāđ‰āļŠāļąāđ‰āļ™ āđāļĨāļ°āļ—āļģ **āļŦāļ™āđ‰āļēāļ—āļĩāđˆāđ€āļžāļĩāļĒāļ‡āļ­āļĒāđˆāļēāļ‡āđ€āļ”āļĩāļĒāļ§** (single-purpose) (\< 20 āļšāļĢāļĢāļ—āļąāļ”) - āđƒāļŠāđ‰ **early returns** āđ€āļžāļ·āđˆāļ­āļĨāļ”āļāļēāļĢāļ‹āđ‰āļ­āļ™ (nesting) āļ‚āļ­āļ‡āđ‚āļ„āđ‰āļ” - āđƒāļŠāđ‰ **map**, **filter**, **reduce** āđāļ—āļ™āļāļēāļĢāđƒāļŠāđ‰ loops āđ€āļĄāļ·āđˆāļ­āđ€āļŦāļĄāļēāļ°āļŠāļĄ - āļ„āļ§āļĢāđƒāļŠāđ‰ **arrow functions** āļŠāļģāļŦāļĢāļąāļšāļ•āļĢāļĢāļāļ°āļŠāļąāđ‰āļ™āđ†, āđāļĨāļ°āđƒāļŠāđ‰ **named functions** āđƒāļ™āļāļĢāļ“āļĩāļ­āļ·āđˆāļ™ - āđƒāļŠāđ‰ **default parameters** āđāļ—āļ™āļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāļ„āđˆāļē null - āļˆāļąāļ”āļāļĨāļļāđˆāļĄāļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļŦāļĨāļēāļĒāļ•āļąāļ§āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āļ­āđ‡āļ­āļšāđ€āļˆāļāļ•āđŒāđ€āļ”āļĩāļĒāļ§ (RO-RO pattern) - āļŠāđˆāļ‡āļ„āđˆāļēāļāļĨāļąāļš (Return) āđ€āļ›āđ‡āļ™āļ­āđ‡āļ­āļšāđ€āļˆāļāļ•āđŒāļ—āļĩāđˆāļĄāļĩāđ„āļ—āļ›āđŒāļāļģāļŦāļ™āļ” (typed objects) āđ„āļĄāđˆāđƒāļŠāđˆāļ„āđˆāļēāļžāļ·āđ‰āļ™āļāļēāļ™ (primitives) - āļĢāļąāļāļĐāļēāļĢāļ°āļ”āļąāļšāļ‚āļ­āļ‡āļŠāļīāđˆāļ‡āļ—āļĩāđˆāđ€āļ›āđ‡āļ™āļ™āļēāļĄāļ˜āļĢāļĢāļĄ (abstraction level) āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™āļĢāļ°āļ”āļąāļšāđ€āļ”āļĩāļĒāļ§āđƒāļ™āđāļ•āđˆāļĨāļ°āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ ### ðŸ§ą**2.6 āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļ‚āđ‰āļ­āļĄāļđāļĨ (Data Handling)** - āļŦāđˆāļ­āļŦāļļāđ‰āļĄāļ‚āđ‰āļ­āļĄāļđāļĨ (Encapsulate) āđƒāļ™āđ„āļ—āļ›āđŒāđāļšāļšāļœāļŠāļĄ (composite types) - āđƒāļŠāđ‰ **immutability** (āļāļēāļĢāđ„āļĄāđˆāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āļ„āđˆāļē) āļ”āđ‰āļ§āļĒ readonly āđāļĨāļ° as const - āļ—āļģāļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāļ„āļ§āļēāļĄāļ–āļđāļāļ•āđ‰āļ­āļ‡āļ‚āļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ (Validations) āđƒāļ™āļ„āļĨāļēāļŠāļŦāļĢāļ·āļ­ DTOs āđ„āļĄāđˆāđƒāļŠāđˆāļ āļēāļĒāđƒāļ™āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ—āļēāļ‡āļ˜āļļāļĢāļāļīāļˆ - āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ„āļ§āļēāļĄāļ–āļđāļāļ•āđ‰āļ­āļ‡āļ‚āļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđ‚āļ”āļĒāđƒāļŠāđ‰ DTOs āļ—āļĩāđˆāļĄāļĩāđ„āļ—āļ›āđŒāļāļģāļŦāļ™āļ”āđ€āļŠāļĄāļ­ ### 🧰**2.7 āļ„āļĨāļēāļŠ (Classes)** - āļ›āļāļīāļšāļąāļ•āļīāļ•āļēāļĄāļŦāļĨāļąāļāļāļēāļĢ **SOLID** - āļ„āļ§āļĢāđƒāļŠāđ‰ **composition āļĄāļēāļāļāļ§āđˆāļē inheritance** (Prefer composition over inheritance) - āļāļģāļŦāļ™āļ” **interfaces** āļŠāļģāļŦāļĢāļąāļšāļŠāļąāļāļāļē (contracts) - āđƒāļŦāđ‰āļ„āļĨāļēāļŠāļĄāļļāđˆāļ‡āđ€āļ™āđ‰āļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āđ€āļ‰āļžāļēāļ°āļ­āļĒāđˆāļēāļ‡āđāļĨāļ°āļĄāļĩāļ‚āļ™āļēāļ”āđ€āļĨāđ‡āļ (\< 200 āļšāļĢāļĢāļ—āļąāļ”, \< 10 āđ€āļĄāļ˜āļ­āļ”, \< 10 properties) ### ðŸšĻ**2.8 āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļ‚āđ‰āļ­āļœāļīāļ”āļžāļĨāļēāļ” (Error Handling)** - āđƒāļŠāđ‰ Exceptions āļŠāļģāļŦāļĢāļąāļšāļ‚āđ‰āļ­āļœāļīāļ”āļžāļĨāļēāļ”āļ—āļĩāđˆāđ„āļĄāđˆāļ„āļēāļ”āļ„āļīāļ” - āļ”āļąāļāļˆāļąāļš (Catch) āļ‚āđ‰āļ­āļœāļīāļ”āļžāļĨāļēāļ”āđ€āļžāļ·āđˆāļ­āđāļāđ‰āđ„āļ‚āļŦāļĢāļ·āļ­āđ€āļžāļīāđˆāļĄāļšāļĢāļīāļšāļ— (context) āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™; āļŦāļēāļāđ„āļĄāđˆāđ€āļŠāđˆāļ™āļ™āļąāđ‰āļ™ āđƒāļŦāđ‰āđƒāļŠāđ‰ global error handlers - āļĢāļ°āļšāļļāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ‚āđ‰āļ­āļœāļīāļ”āļžāļĨāļēāļ” (error messages) āļ—āļĩāđˆāļĄāļĩāļ„āļ§āļēāļĄāļŦāļĄāļēāļĒāđ€āļŠāļĄāļ­ ### 🧊**2.9 āļāļēāļĢāļ—āļ”āļŠāļ­āļš (āļ—āļąāđˆāļ§āđ„āļ›) (Testing (General))** - āđƒāļŠāđ‰āļĢāļđāļ›āđāļšāļš **Arrange–Act–Assert** - āđƒāļŠāđ‰āļŠāļ·āđˆāļ­āļ•āļąāļ§āđāļ›āļĢāđƒāļ™āļāļēāļĢāļ—āļ”āļŠāļ­āļšāļ—āļĩāđˆāļŠāļ·āđˆāļ­āļ„āļ§āļēāļĄāļŦāļĄāļēāļĒ (inputData, expectedOutput) - āđ€āļ‚āļĩāļĒāļ™ **unit tests** āļŠāļģāļŦāļĢāļąāļš public methods āļ—āļąāđ‰āļ‡āļŦāļĄāļ” - āļˆāļģāļĨāļ­āļ‡ (Mock) āļāļēāļĢāļžāļķāđˆāļ‡āļžāļēāļ āļēāļĒāļ™āļ­āļ (external dependencies) - āđ€āļžāļīāđˆāļĄ **acceptance tests** āļ•āđˆāļ­āđ‚āļĄāļ”āļđāļĨāđ‚āļ”āļĒāđƒāļŠāđ‰āļĢāļđāļ›āđāļšāļš Given–When-Then ### **Testing Strategy āđ‚āļ”āļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”** - **Test Pyramid Structure** /\ / \ E2E Tests (10%) /\_**\_\ Integration Tests (20%) / \ Unit Tests (70%) /**\_\_\*\*\*\*\ - **Testing Tools Stack** ```typescript // Backend Testing Stack const backendTesting = { unit: ['Jest', 'ts-jest', '@nestjs/testing'], integration: ['Supertest', 'Testcontainers', 'Jest'], e2e: ['Supertest', 'Jest', 'Database Seeds'], security: ['Jest', 'Custom Security Test Helpers'], performance: ['Jest', 'autocannon', 'artillery'], }; // Frontend Testing Stack const frontendTesting = { unit: ['Vitest', 'React Testing Library'], integration: ['React Testing Library', 'MSW'], e2e: ['Playwright', 'Jest'], visual: ['Playwright', 'Loki'], }; ``` - **Test Data Management** ```typescript // Test Data Factories interface TestDataFactory { createUser(overrides?: Partial): User; createCorrespondence(overrides?: Partial): Correspondence; createRoutingTemplate(overrides?: Partial): RoutingTemplate; } // Test Scenarios const testScenarios = { happyPath: 'Normal workflow execution', edgeCases: 'Boundary conditions and limits', errorConditions: 'Error handling and recovery', security: 'Authentication and authorization', performance: 'Load and stress conditions', }; ``` ## 🏗ïļ **3. āđāļšāđ‡āļāđ€āļ­āļ™āļ”āđŒ (NestJS) - Implementation Details** ### **3.1 āļŦāļĨāļąāļāļāļēāļĢ** - **āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāđāļšāļšāđ‚āļĄāļ”āļđāļĨāļēāļĢāđŒ (Modular architecture)**: - āļŦāļ™āļķāđˆāļ‡āđ‚āļĄāļ”āļđāļĨāļ•āđˆāļ­āļŦāļ™āļķāđˆāļ‡āđ‚āļ”āđ€āļĄāļ™ - āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āđāļšāļš Controller → Service → Repository (Model) - API-First: āļĄāļļāđˆāļ‡āđ€āļ™āđ‰āļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ API āļ—āļĩāđˆāļĄāļĩāļ„āļļāļ“āļ āļēāļžāļŠāļđāļ‡ āļĄāļĩāđ€āļ­āļāļŠāļēāļĢāļ›āļĢāļ°āļāļ­āļš (Swagger) āļ—āļĩāđˆāļŠāļąāļ”āđ€āļˆāļ™āļŠāļģāļŦāļĢāļąāļš Frontend Team - DTOs āļ—āļĩāđˆāļ•āļĢāļ§āļˆāļŠāļ­āļšāļ„āļ§āļēāļĄāļ–āļđāļāļ•āđ‰āļ­āļ‡āļ”āđ‰āļ§āļĒ **class-validator** - āđƒāļŠāđ‰ **MikroORM** (āļŦāļĢāļ·āļ­ TypeORM/Prisma) āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ„āļ‡āļ­āļĒāļđāđˆāļ‚āļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ (persistence) āļ‹āļķāđˆāļ‡āļŠāļ­āļ”āļ„āļĨāđ‰āļ­āļ‡āļāļąāļšāļŠāļ„āļĩāļĄāļē MariaDB - āļŦāđˆāļ­āļŦāļļāđ‰āļĄāđ‚āļ„āđ‰āļ”āļ—āļĩāđˆāđƒāļŠāđ‰āļ‹āđ‰āļģāđ„āļ”āđ‰āđ„āļ§āđ‰āđƒāļ™ **common module** (@app/common): - Configs, decorators, DTOs, guards, interceptors, notifications, shared services, types, validators ### **3.2 Database & Data Modeling (MariaDB + TypeORM)** #### **3.2.1 Optimistic Locking & Versioning** āđ€āļžāļ·āđˆāļ­āļ›āđ‰āļ­āļ‡āļāļąāļ™ Race Condition āđƒāļ™āļāļēāļĢāđāļāđ‰āđ„āļ‚āļ‚āđ‰āļ­āļĄāļđāļĨāļžāļĢāđ‰āļ­āļĄāļāļąāļ™ (āđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ°āļāļēāļĢāļĢāļąāļ™āđ€āļĨāļ‚āļ—āļĩāđˆāđ€āļ­āļāļŠāļēāļĢ) āđƒāļŦāđ‰āđ€āļžāļīāđˆāļĄ Column `@VersionColumn()` āđƒāļ™ Entity āļ—āļĩāđˆāļŠāļģāļ„āļąāļ ```typescript @Entity() export class DocumentCounter { // ... fields @Column() last_number: number; @VersionColumn() // āđ€āļžāļīāđˆāļĄ Versioning version: number; } ``` #### **3.2.2 Virtual Columns for JSON Performance** āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāđ€āļĢāļēāđƒāļŠāđ‰ MariaDB 10.11 āđāļĨāļ°āļĄāļĩāļāļēāļĢāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨ JSON (Details) āđƒāļŦāđ‰āđƒāļŠāđ‰ **Generated Columns (Virtual)** āļŠāļģāļŦāļĢāļąāļš Field āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡ Search/Sort āļšāđˆāļ­āļĒāđ† āđāļĨāļ°āļ—āļģ Index āļšāļ™ Virtual Column āļ™āļąāđ‰āļ™ ```sql -- āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡ SQL Migration ALTER TABLE correspondence_revisions ADD COLUMN ref_project_id INT GENERATED ALWAYS AS (JSON_UNQUOTE(JSON_EXTRACT(details, '$.projectId'))) VIRTUAL; CREATE INDEX idx_ref_project_id ON correspondence_revisions(ref_project_id); ``` #### **3.2.3 Partitioning Strategy** - āļŠāļģāļŦāļĢāļąāļšāļ•āļēāļĢāļēāļ‡ `audit_logs` āđāļĨāļ° `notifications` āđƒāļŦāđ‰āđ€āļ•āļĢāļĩāļĒāļĄāļ­āļ­āļāđāļšāļš Entity āđƒāļŦāđ‰āļĢāļ­āļ‡āļĢāļąāļš Partitioning (āđ€āļŠāđˆāļ™ āđāļĒāļāļ•āļēāļĄāļ›āļĩ) āđ‚āļ”āļĒāđƒāļŠāđ‰ Raw SQL Migration āđƒāļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļ•āļēāļĢāļēāļ‡ - Automated Partition Maintenance: āļ•āđ‰āļ­āļ‡āļĄāļĩ Cron Job (Scheduled Task) āđ€āļžāļ·āđˆāļ­āļ•āļĢāļ§āļˆāļŠāļ­āļšāđāļĨāļ°āļŠāļĢāđ‰āļēāļ‡ Partition āļŠāļģāļŦāļĢāļąāļšāļ›āļĩ/āđ€āļ”āļ·āļ­āļ™āļ–āļąāļ”āđ„āļ›āļĨāđˆāļ§āļ‡āļŦāļ™āđ‰āļē (Pre-create partitions) āļ­āļĒāđˆāļēāļ‡āļ™āđ‰āļ­āļĒ 1 āđ€āļ”āļ·āļ­āļ™ āđ€āļžāļ·āđˆāļ­āļ›āđ‰āļ­āļ‡āļāļąāļ™ Insert Error āđ€āļĄāļ·āđˆāļ­āļ‚āļķāđ‰āļ™āļŠāđˆāļ§āļ‡āđ€āļ§āļĨāļēāđƒāļŦāļĄāđˆ ### **3.3 File Storage Service (Two-Phase Storage)** āļ›āļĢāļąāļšāļ›āļĢāļļāļ‡ Service āļˆāļąāļ”āļāļēāļĢāđ„āļŸāļĨāđŒāđƒāļŦāđ‰āļĢāļ­āļ‡āļĢāļąāļš Transactional Integrity 1. **Upload (Phase 1):** - āļĢāļąāļšāđ„āļŸāļĨāđŒ → Scan Virus (ClamAV) → Save āļĨāļ‡āđ‚āļŸāļĨāđ€āļ”āļ­āļĢāđŒ `temp/` - Return `temp_id` āđāļĨāļ° Metadata āļāļĨāļąāļšāđ„āļ›āđƒāļŦāđ‰ Client 2. **Commit (Phase 2):** - āđ€āļĄāļ·āđˆāļ­ Business Logic (āđ€āļŠāđˆāļ™ Create Correspondence) āļ—āļģāļ‡āļēāļ™āļŠāļģāđ€āļĢāđ‡āļˆ - Service āļˆāļ°āļĒāđ‰āļēāļĒāđ„āļŸāļĨāđŒāļˆāļēāļ `temp/` āđ„āļ›āļĒāļąāļ‡ `permanent/{YYYY}/{MM}/` - Update path āđƒāļ™ Database - āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ™āļĩāđ‰āļ•āđ‰āļ­āļ‡āļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ•āđ‰ Database Transaction āđ€āļ”āļĩāļĒāļ§āļāļąāļ™ (āļ–āđ‰āļē DB Fail, āđ„āļŸāļĨāđŒāļˆāļ°āļ„āđ‰āļēāļ‡āļ—āļĩāđˆ Temp āđāļĨāļ°āļ–āļđāļāļĨāļšāđ‚āļ”āļĒ Cron Job) 3. **Cleanup:** - āļĄāļĩ Cron Job āļĨāļšāđ„āļŸāļĨāđŒāđƒāļ™ temp/ āļ—āļĩāđˆāļ„āđ‰āļēāļ‡āđ€āļāļīāļ™ 24 āļŠāļĄ. (Orphan Files) āđ‚āļ”āļĒāļ•āđ‰āļ­āļ‡āļ•āļĢāļ§āļˆāļŠāļ­āļšāđ€āļ‡āļ·āđˆāļ­āļ™āđ„āļ‚āļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒāđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄ: - āđ„āļŸāļĨāđŒāļ•āđ‰āļ­āļ‡āļĄāļĩ created_at āđ€āļāļīāļ™ 24 āļŠāļąāđˆāļ§āđ‚āļĄāļ‡ - āđ„āļŸāļĨāđŒāļ•āđ‰āļ­āļ‡āđ„āļĄāđˆāļ­āļĒāļđāđˆāđƒāļ™āļŠāļ–āļēāļ™āļ° 'Locked' āļŦāļĢāļ·āļ­āļāļģāļĨāļąāļ‡āļ–āļđāļ Process āļ­āļĒāļđāđˆ (āļ•āļĢāļ§āļˆāļŠāļ­āļšāļˆāļēāļ Lock flag āļŦāļĢāļ·āļ­ Transaction ID āļ–āđ‰āļēāļĄāļĩ) ### **3.4 Document Numbering (Double-Lock Mechanism)** āļāļēāļĢāļ­āļ­āļāđ€āļĨāļ‚āļ—āļĩāđˆāđ€āļ­āļāļŠāļēāļĢāļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰āļāļĨāđ„āļāļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒ 2 āļŠāļąāđ‰āļ™: 1. **Layer 1 (Redis Lock):** āđƒāļŠāđ‰ `redlock` āđ€āļžāļ·āđˆāļ­ Block āđ„āļĄāđˆāđƒāļŦāđ‰ Process āļ­āļ·āđˆāļ™āđ€āļ‚āđ‰āļēāļĄāļēāļĒāļļāđˆāļ‡āļāļąāļš Counter āļ‚āļ­āļ‡ Project/Type āļ™āļąāđ‰āļ™āđ† āļŠāļąāđˆāļ§āļ„āļĢāļēāļ§ 2. **Layer 2 (Optimistic Lock):** āļ•āļ­āļ™ Update Database āđƒāļŦāđ‰āđ€āļŠāđ‡āļ„ `version` āļ–āđ‰āļē version āđ€āļ›āļĨāļĩāđˆāļĒāļ™ (āđāļŠāļ”āļ‡āļ§āđˆāļē Redis Lock āļŦāļĨāļļāļ”āļŦāļĢāļ·āļ­āļĄāļĩāļ„āļ™āđāļ—āļĢāļ) āđƒāļŦāđ‰ Throw Error āđāļĨāļ° Retry āđƒāļŦāļĄāđˆ ### **3.5 Unified Workflow Engine** Unified Workflow Engine (Core Architecture) - āļĢāļ°āļšāļšāđƒāļŠāđ‰ Workflow Engine āđ€āļ›āđ‡āļ™āļŦāļąāļ§āđƒāļˆāļŦāļĨāļąāļāđƒāļ™āļāļēāļĢāļ‚āļąāļšāđ€āļ„āļĨāļ·āđˆāļ­āļ™ State āļ‚āļ­āļ‡āđ€āļ­āļāļŠāļēāļĢ: - DSL Based: Logic āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ­āļĒāļđāđˆāļ—āļĩāđˆ workflow_definitions.dsl - Instance Based: āļŠāļ–āļēāļ™āļ°āļ›āļąāļˆāļˆāļļāļšāļąāļ™āļ­āļĒāļđāđˆāļ—āļĩāđˆ workflow_instances - Module Integration: - CorrespondenceModule -> āđ€āļĢāļĩāļĒāļ WorkflowEngine - RfaModule -> āđ€āļĢāļĩāļĒāļ WorkflowEngine - CirculationModule -> āđ€āļĢāļĩāļĒāļ WorkflowEngine - āļŦāđ‰āļēāļĄ āļŠāļĢāđ‰āļēāļ‡āļ•āļēāļĢāļēāļ‡ Routing āđāļĒāļ (āđ€āļŠāđˆāļ™ rfa_workflows āļŦāļĢāļ·āļ­ correspondence_routings) āļ­āļĩāļāļ•āđˆāļ­āđ„āļ› - Boot-time Validation: - āđ€āļĄāļ·āđˆāļ­ Application Start (Backend Boot), āļĢāļ°āļšāļšāļ•āđ‰āļ­āļ‡āļ—āļģāļāļēāļĢ Validate Workflow DSL Definitions āļ—āļąāđ‰āļ‡āļŦāļĄāļ” āļ§āđˆāļē Syntax āļ–āļđāļāļ•āđ‰āļ­āļ‡āđāļĨāļ° State Transitions āđ€āļŠāļ·āđˆāļ­āļĄāđ‚āļĒāļ‡āļāļąāļ™āļŠāļĄāļšāļđāļĢāļ“āđŒ āļŦāļēāļāļžāļšāļ‚āđ‰āļ­āļœāļīāļ”āļžāļĨāļēāļ”āđƒāļŦāđ‰ Alert āļŦāļĢāļ·āļ­ Block Startup (āđƒāļ™ Development Mode) āđ€āļžāļ·āđˆāļ­āļ›āđ‰āļ­āļ‡āļāļąāļ™ Runtime Error ### **3.6 āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļŦāļĨāļąāļ (Core Functionalities)** - Global **filters** āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļˆāļąāļ”āļāļēāļĢ exception - **Middlewares** āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļˆāļąāļ”āļāļēāļĢ request - **Guards** āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ­āļ™āļļāļāļēāļ• (permissions) āđāļĨāļ° RBAC - **Interceptors** āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāđāļ›āļĨāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ response āđāļĨāļ°āļāļēāļĢāļšāļąāļ™āļ—āļķāļ log ### **3.7 āļ‚āđ‰āļ­āļˆāļģāļāļąāļ”āđƒāļ™āļāļēāļĢ Deploy (QNAP Container Station)** - **āļŦāđ‰āļēāļĄāđƒāļŠāđ‰āđ„āļŸāļĨāđŒ .env** āđƒāļ™āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļē Environment Variables [cite: 2.1] ### **3.8 āļ‚āđ‰āļ­āļˆāļģāļāļąāļ”āļ”āđ‰āļēāļ™āļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒ (Security Constraints):** - **File Upload Security:** āļ•āđ‰āļ­āļ‡āļĄāļĩ virus scanning (ClamAV), file type validation (white-list), āđāļĨāļ° file size limits (50MB) - **Input Validation:** āļ•āđ‰āļ­āļ‡āļ›āđ‰āļ­āļ‡āļāļąāļ™ OWASP Top 10 vulnerabilities (SQL Injection, XSS, CSRF) - **Rate Limiting:** āļ•āđ‰āļ­āļ‡ implement rate limiting āļ•āļēāļĄ strategy āļ—āļĩāđˆāļāļģāļŦāļ™āļ” - **Secrets Management:** āļ•āđ‰āļ­āļ‡āļĄāļĩ mechanism āļŠāļģāļŦāļĢāļąāļšāļˆāļąāļ”āļāļēāļĢ sensitive secrets āļ­āļĒāđˆāļēāļ‡āļ›āļĨāļ­āļ”āļ āļąāļĒ āđāļĄāđ‰āļˆāļ°āđƒāļŠāđ‰ docker-compose.yml ### **3.9 āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āđ‚āļĄāļ”āļđāļĨāļ•āļēāļĄāđ‚āļ”āđ€āļĄāļ™ (Domain-Driven Module Structure)** āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļŠāļ­āļ”āļ„āļĨāđ‰āļ­āļ‡āļāļąāļšāļŠāļ„āļĩāļĄāļē SQL (LCBP3-DMS) āđ€āļĢāļēāļˆāļ°āđƒāļŠāđ‰āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āđ‚āļĄāļ”āļđāļĨāđāļšāļš **Domain-Driven (āđāļšāđˆāļ‡āļ•āļēāļĄāļ‚āļ­āļšāđ€āļ‚āļ•āļ˜āļļāļĢāļāļīāļˆ)** āđāļ—āļ™āļāļēāļĢāđāļšāđˆāļ‡āļ•āļēāļĄāļŸāļąāļ‡āļāđŒāļŠāļąāļ™: #### 3.9.1 **CommonModule:** - āđ€āļāđ‡āļš Services āļ—āļĩāđˆāđƒāļŠāđ‰āļĢāđˆāļ§āļĄāļāļąāļ™ āđ€āļŠāđˆāļ™ DatabaseModule, FileStorageService (āļˆāļąāļ”āļāļēāļĢāđ„āļŸāļĨāđŒāđƒāļ™ QNAP), AuditLogService, NotificationService - āļˆāļąāļ”āļāļēāļĢ audit_logs - NotificationService āļ•āđ‰āļ­āļ‡āļĢāļ­āļ‡āļĢāļąāļš Triggers āļ—āļĩāđˆāļĢāļ°āļšāļļāđƒāļ™ Requirement 6.7 [cite: 6.7] #### 3.9.2 **AuthModule:** - āļˆāļąāļ”āļāļēāļĢāļ°āļāļēāļĢāļĒāļ·āļ™āļĒāļąāļ™āļ•āļąāļ§āļ•āļ™ (JWT, Guards) - **(āļŠāļģāļ„āļąāļ)** āļ•āđ‰āļ­āļ‡āļĢāļąāļšāļœāļīāļ”āļŠāļ­āļšāļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāļŠāļīāļ—āļ˜āļīāđŒ **4 āļĢāļ°āļ”āļąāļš** [cite: 4.2]: āļŠāļīāļ—āļ˜āļīāđŒāļĢāļ°āļ”āļąāļšāļĢāļ°āļšāļš (Global Role), āļŠāļīāļ—āļ˜āļīāđŒāļĢāļ°āļ”āļąāļšāļ­āļ‡āļāļĢāļ“āđŒ (Organization Role), āļŠāļīāļ—āļ˜āļīāđŒāļĢāļ°āļ”āļąāļšāđ‚āļ›āļĢāđ€āļˆāļāļ•āđŒ (Project Role), āđāļĨāļ° āļŠāļīāļ—āļ˜āļīāđŒāļĢāļ°āļ”āļąāļšāļŠāļąāļāļāļē (Contract Role) - **(āļŠāļģāļ„āļąāļ)** āļ•āđ‰āļ­āļ‡āļĄāļĩ API āļŠāļģāļŦāļĢāļąāļš **Admin Panel** āđ€āļžāļ·āđˆāļ­: - āļŠāļĢāđ‰āļēāļ‡āđāļĨāļ°āļˆāļąāļ”āļāļēāļĢ Role āđāļĨāļ°āļāļēāļĢāļˆāļąāļšāļ„āļđāđˆ Permission āđāļšāļšāđ„āļ”āļ™āļēāļĄāļīāļ [cite: 4.3] - āđƒāļŦāđ‰ Superadmin āļŠāļĢāđ‰āļēāļ‡ Organizations āđāļĨāļ°āļāļģāļŦāļ™āļ” Org Admin āđ„āļ”āđ‰ [cite: 4.6] - āđƒāļŦāđ‰ Superadmin/Admin āļˆāļąāļ”āļāļēāļĢ document_number_formats (āļĢāļđāļ›āđāļšāļšāđ€āļĨāļ‚āļ—āļĩāđˆāđ€āļ­āļāļŠāļēāļĢ), document_number_counters (Running Number) [cite: 3.10] #### 3.9.3 **UserModule:** - āļˆāļąāļ”āļāļēāļĢ users, roles, permissions, global_default_roles, role_permissions, user_roles, user_project_roles - **(āļŠāļģāļ„āļąāļ)** āļ•āđ‰āļ­āļ‡āļĄāļĩ API āļŠāļģāļŦāļĢāļąāļš **Admin Panel** āđ€āļžāļ·āđˆāļ­: - āļŠāļĢāđ‰āļēāļ‡āđāļĨāļ°āļˆāļąāļ”āļāļēāļĢ Role āđāļĨāļ°āļāļēāļĢāļˆāļąāļšāļ„āļđāđˆ Permission āđāļšāļšāđ„āļ”āļ™āļēāļĄāļīāļ [cite: 4.3] #### 3.9.4 **ProjectModule:** - āļˆāļąāļ”āļāļēāļĢ projects, organizations, contracts, project_parties, contract_parties #### 3.9.5 **MasterModule:** - āļˆāļąāļ”āļāļēāļĢ master data (correspondence_types, rfa_types, rfa_status_codes, rfa_approve_codes, circulation_status_codes, correspondence_types, correspondence_status, tags) [cite: 4.5] #### 3.9.6 **CorrespondenceModule (āđ‚āļĄāļ”āļđāļĨāļĻāļđāļ™āļĒāđŒāļāļĨāļēāļ‡):** - āļˆāļąāļ”āļāļēāļĢ correspondences, correspondence_revisions, correspondence_tags - **(āļŠāļģāļ„āļąāļ)** Service āļ™āļĩāđ‰āļ•āđ‰āļ­āļ‡ Inject DocumentNumberingService āđ€āļžāļ·āđˆāļ­āļ‚āļ­āđ€āļĨāļ‚āļ—āļĩāđˆāđ€āļ­āļāļŠāļēāļĢāđƒāļŦāļĄāđˆāļāđˆāļ­āļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ - **(āļŠāļģāļ„āļąāļ)** āļ•āļĢāļĢāļāļ°āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡/āļ­āļąāļ›āđ€āļ”āļ• Revision āļˆāļ°āļ­āļĒāļđāđˆāđƒāļ™ Service āļ™āļĩāđ‰ - āļˆāļąāļ”āļāļēāļĢ correspondence_attachments (āļ•āļēāļĢāļēāļ‡āđ€āļŠāļ·āđˆāļ­āļĄāđ„āļŸāļĨāđŒāđāļ™āļš) - āļĢāļąāļšāļœāļīāļ”āļŠāļ­āļš Routing **Correspondence WorkflowService** āđ€āļ›āđ‡āļ™ Adapter āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļš Engine āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļŠāđˆāļ‡āļ•āđˆāļ­āđ€āļ­āļāļŠāļēāļĢāļ—āļąāđˆāļ§āđ„āļ›āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļ­āļ‡āļ„āđŒāļāļĢ #### 3.9.7 **RfaModule:** - āļˆāļąāļ”āļāļēāļĢ rfas, rfa_revisions, rfa_items - āļĢāļąāļšāļœāļīāļ”āļŠāļ­āļšāđ€āļ§āļīāļĢāđŒāļāđ‚āļŸāļĨāļ§āđŒ **"RFA WorkflowService"** āđ€āļ›āđ‡āļ™ Adapter āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļš Engine āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ­āļ™āļļāļĄāļąāļ•āļīāđ€āļ­āļāļŠāļēāļĢāļ—āļēāļ‡āđ€āļ—āļ„āļ™āļīāļ„ #### 3.9.8 **DrawingModule:** - āļˆāļąāļ”āļāļēāļĢ shop_drawings, shop_drawing_revisions, contract_drawings, contract_drawing_volumes, contract_drawing_cats, contract_drawing_sub_cats, shop_drawing_main_categories, shop_drawing_sub_categories, contract_drawing_subcat_cat_maps, shop_drawing_revision_contract_refs - āļˆāļąāļ”āļāļēāļĢ shop_drawing_revision_attachments āđāļĨāļ° contract_drawing_attachments(āļ•āļēāļĢāļēāļ‡āđ€āļŠāļ·āđˆāļ­āļĄāđ„āļŸāļĨāđŒāđāļ™āļš) #### 3.9.9 **CirculationModule:** - āļˆāļąāļ”āļāļēāļĢ circulations, circulation_templates, circulation_assignees - āļˆāļąāļ”āļāļēāļĢ circulation_attachments (āļ•āļēāļĢāļēāļ‡āđ€āļŠāļ·āđˆāļ­āļĄāđ„āļŸāļĨāđŒāđāļ™āļš) - āļĢāļąāļšāļœāļīāļ”āļŠāļ­āļšāđ€āļ§āļīāļĢāđŒāļāđ‚āļŸāļĨāļ§āđŒ **"Circulations WorkflowService"** āđ€āļ›āđ‡āļ™ Adapter āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļš Engine āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāđ€āļ§āļĩāļĒāļ™āđ€āļ­āļāļŠāļēāļĢ **āļ āļēāļĒāđƒāļ™āļ­āļ‡āļ„āđŒāļāļĢ** #### 3.9.10 **TransmittalModule:** - āļˆāļąāļ”āļāļēāļĢ transmittals āđāļĨāļ° transmittal_items #### 3.9.11 **SearchModule:** - āđƒāļŦāđ‰āļšāļĢāļīāļāļēāļĢāļ„āđ‰āļ™āļŦāļēāļ‚āļąāđ‰āļ™āļŠāļđāļ‡ (Advanced Search) [cite: 6.2] āđ‚āļ”āļĒāđƒāļŠāđ‰ **Elasticsearch** āđ€āļžāļ·āđˆāļ­āļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāļ„āđ‰āļ™āļŦāļēāđāļšāļš Full-text āļˆāļēāļāļŠāļ·āđˆāļ­āđ€āļĢāļ·āđˆāļ­āļ‡, āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”, āđ€āļĨāļ‚āļ—āļĩāđˆāđ€āļ­āļāļŠāļēāļĢ, āļ›āļĢāļ°āđ€āļ āļ—, āļ§āļąāļ™āļ—āļĩāđˆ, āđāļĨāļ° Tags - āļĢāļ°āļšāļšāļˆāļ°āđƒāļŠāđ‰ Elasticsearch Engine āđƒāļ™āļāļēāļĢāļˆāļąāļ”āļ—āļģāļ”āļąāļŠāļ™āļĩāđ€āļžāļ·āđˆāļ­āļāļēāļĢāļ„āđ‰āļ™āļŦāļēāļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļŠāļīāļ‡āļĨāļķāļāļˆāļēāļāđ€āļ™āļ·āđ‰āļ­āļŦāļēāļ‚āļ­āļ‡āđ€āļ­āļāļŠāļēāļĢ āđ‚āļ”āļĒāļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļ°āļ–āļđāļāļŠāđˆāļ‡āđ„āļ›āļ—āļģāļ”āļąāļŠāļ™āļĩāļˆāļēāļ Backend (NestJS) āļ—āļļāļāļ„āļĢāļąāđ‰āļ‡āļ—āļĩāđˆāļĄāļĩāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļŦāļĢāļ·āļ­āđāļāđ‰āđ„āļ‚āđ€āļ­āļāļŠāļēāļĢ #### 3.9.12 **DocumentNumberingModule:** - **āļŠāļ–āļēāļ™āļ°:** āđ€āļ›āđ‡āļ™ Module āļ āļēāļĒāđƒāļ™ (Internal Module) āđ„āļĄāđˆāđ€āļ›āļīāļ” API āļŠāļđāđˆāļ āļēāļĒāļ™āļ­āļ - **āļŦāļ™āđ‰āļēāļ—āļĩāđˆ:** āđƒāļŦāđ‰āļšāļĢāļīāļāļēāļĢ `DocumentNumberingService` āđāļšāļš **Token-Based Generator** - **Logic āđƒāļŦāļĄāđˆ (v1.4.4):** - āļĢāļąāļš Context: `{ projectId, orgId, typeId, disciplineId?, subTypeId?, year }` - āļ”āļķāļ‡ Template āļˆāļēāļ DB - Parse Template āđ€āļžāļ·āđˆāļ­āļŦāļēāļ§āđˆāļēāļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰ Key āđƒāļ”āļšāđ‰āļēāļ‡āđƒāļ™āļāļēāļĢāļ—āļģ Grouping Counter (āđ€āļŠāđˆāļ™ āļ–āđ‰āļē Template āļĄāļĩ `{DISCIPLINE}` āđƒāļŦāđ‰āđƒāļŠāđ‰ `discipline_id` āđƒāļ™āļāļēāļĢ query counter) - āđƒāļŠāđ‰ **Double-Lock Mechanism** (Redis + Optimistic DB Lock) āđƒāļ™āļāļēāļĢāļ”āļķāļ‡āđāļĨāļ°āļ­āļąāļžāđ€āļ”āļ—āļ„āđˆāļē `last_number` - Lock Timeout: āļāļēāļĢ Acquire Redis Lock āļ•āđ‰āļ­āļ‡āļāļģāļŦāļ™āļ” TTL (Time-to-Live) āļ—āļĩāđˆāļŠāļąāđ‰āļ™āđāļĨāļ°āđ€āļŦāļĄāļēāļ°āļŠāļĄ (āđ€āļŠāđˆāļ™ 2-5 āļ§āļīāļ™āļēāļ—āļĩ) āđ€āļžāļ·āđˆāļ­āļ›āđ‰āļ­āļ‡āļāļąāļ™ Deadlock āļāļĢāļ“āļĩ Service Crash āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļ—āļģāļ‡āļēāļ™ - Retry Logic: āļ•āđ‰āļ­āļ‡āļĄāļĩ Retry mechanism āđāļšāļš Exponential Backoff (āđāļ™āļ°āļ™āļģ 3-5 āļ„āļĢāļąāđ‰āļ‡) āļŦāļēāļāđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ– Acquire Lock āđ„āļ”āđ‰ - **Features:** - Application-level locking āđ€āļžāļ·āđˆāļ­āļ›āđ‰āļ­āļ‡āļāļąāļ™ race condition - Retry mechanism āļ”āđ‰āļ§āļĒ exponential backoff - Fallback mechanism āđ€āļĄāļ·āđˆāļ­āļāļēāļĢāļ‚āļ­āđ€āļĨāļ‚āļĨāđ‰āļĄāđ€āļŦāļĨāļ§ - Audit log āļ—āļļāļāļ„āļĢāļąāđ‰āļ‡āļ—āļĩāđˆāļĄāļĩāļāļēāļĢ generate āđ€āļĨāļ‚āļ—āļĩāđˆāđ€āļ­āļāļŠāļēāļĢāđƒāļŦāļĄāđˆ #### 3.9.13 **CorrespondenceRoutingModule:** - **āļŠāļ–āļēāļ™āļ°:** āđ‚āļĄāļ”āļđāļĨāļŦāļĨāļąāļāļŠāļģāļŦāļĢāļąāļšāļˆāļąāļ”āļāļēāļĢāļāļēāļĢāļŠāđˆāļ‡āļ•āđˆāļ­āđ€āļ­āļāļŠāļēāļĢ - **āļŦāļ™āđ‰āļēāļ—āļĩāđˆ:** āļˆāļąāļ”āļāļēāļĢāđāļĄāđˆāđāļšāļšāļāļēāļĢāļŠāđˆāļ‡āļ•āđˆāļ­āđāļĨāļ°āļāļēāļĢāļŠāđˆāļ‡āļ•āđˆāļ­āļˆāļĢāļīāļ‡ - **Entities:** - CorrespondenceRoutingTemplate - CorrespondenceRoutingTemplateStep - CorrespondenceRouting - **Features:** - āļŠāļĢāđ‰āļēāļ‡āđāļĨāļ°āļˆāļąāļ”āļāļēāļĢāđāļĄāđˆāđāļšāļšāļāļēāļĢāļŠāđˆāļ‡āļ•āđˆāļ­ - āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāļŠāđˆāļ‡āļ•āđˆāļ­āđ€āļ­āļāļŠāļēāļĢāļ•āļēāļĄāđāļĄāđˆāđāļšāļš - āļ•āļīāļ”āļ•āļēāļĄāļŠāļ–āļēāļ™āļ°āļāļēāļĢāļŠāđˆāļ‡āļ•āđˆāļ­ - āļ„āļģāļ™āļ§āļ“āļ§āļąāļ™āļ„āļĢāļšāļāļģāļŦāļ™āļ”āļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļī - āļŠāđˆāļ‡āļāļēāļĢāđāļˆāđ‰āļ‡āđ€āļ•āļ·āļ­āļ™āđ€āļĄāļ·āđˆāļ­āļĄāļĩāļāļēāļĢāļŠāđˆāļ‡āļ•āđˆāļ­āđƒāļŦāļĄāđˆ #### 3.9.14 WorkflowEngineModule (New Core) - Entities: WorkflowDefinition, WorkflowInstance, WorkflowHistory - Services: WorkflowEngineService, WorkflowDslService, WorkflowEventService - Responsibility: āļˆāļąāļ”āļāļēāļĢ State Machine, Validate DSL, Execute Transitions #### 3.9.15 **JsonSchemaModule:** - **āļŠāļ–āļēāļ™āļ°:** Internal Module āļŠāļģāļŦāļĢāļąāļšāļˆāļąāļ”āļāļēāļĢ JSON schemas - **āļŦāļ™āđ‰āļēāļ—āļĩāđˆ:** Validate, transform, āđāļĨāļ° manage JSON data structures - **Features:** - JSON schema validation āļ”āđ‰āļ§āļĒ AJV - Schema versioning āđāļĨāļ° migration - Dynamic schema generation - Data transformation āđāļĨāļ° sanitization #### 3.9.16 **DetailsService:** - **āļŠāļ–āļēāļ™āļ°:** Shared Service āļŠāļģāļŦāļĢāļąāļšāļˆāļąāļ”āļāļēāļĢ details fields - **āļŦāļ™āđ‰āļēāļ—āļĩāđˆ:** Centralized service āļŠāļģāļŦāļĢāļąāļš JSON details operations - **Methods:** - validateDetails(type: string, data: any): ValidationResult - transformDetails(input: any, targetVersion: string): any - sanitizeDetails(data: any): any - getDefaultDetails(type: string): any ### **3.10 āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļĢāļ°āļšāļš (System Architecture)** āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āđ‚āļĄāļ”āļđāļĨ (Module Structure) āļ­āđ‰āļēāļ‡āļ–āļķāļ‡ Backend Development Plan v1.4.5 ### **3.11 āļāļĨāļĒāļļāļ—āļ˜āđŒāļ„āļ§āļēāļĄāļ—āļ™āļ—āļēāļ™āđāļĨāļ°āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļ‚āđ‰āļ­āļœāļīāļ”āļžāļĨāļēāļ” (Resilience & Error Handling Strategy)** - **Circuit Breaker Pattern:** āđƒāļŠāđ‰āļŠāļģāļŦāļĢāļąāļš external service calls (Email, LINE, Elasticsearch) - **Retry Mechanism:** āļ”āđ‰āļ§āļĒ exponential backoff āļŠāļģāļŦāļĢāļąāļš transient failures - **Fallback Strategies:** Graceful degradation āđ€āļĄāļ·āđˆāļ­āļšāļĢāļīāļāļēāļĢāļ āļēāļĒāļ™āļ­āļāļĨāđ‰āļĄāđ€āļŦāļĨāļ§ - **Error Handling:** Error messages āļ•āđ‰āļ­āļ‡āđ„āļĄāđˆāđ€āļ›āļīāļ”āđ€āļœāļĒāļ‚āđ‰āļ­āļĄāļđāļĨ sensitive - **Monitoring:** Centralized error monitoring āđāļĨāļ° alerting system ### **3.12 FileStorageService (āļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđƒāļŦāļĄāđˆ):** - **Virus Scanning:** Integrate ClamAV āļŠāļģāļŦāļĢāļąāļš scan āđ„āļŸāļĨāđŒāļ—āļĩāđˆāļ­āļąāļ›āđ‚āļŦāļĨāļ”āļ—āļąāđ‰āļ‡āļŦāļĄāļ” - **File Type Validation:** āđƒāļŠāđ‰ white-list approach (PDF, DWG, DOCX, XLSX, ZIP) - **File Size Limits:** 50MB āļ•āđˆāļ­āđ„āļŸāļĨāđŒ - **Security Measures:** - āđ€āļāđ‡āļšāđ„āļŸāļĨāđŒāļ™āļ­āļ web root - Download āļœāđˆāļēāļ™ authenticated endpoint āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™ - Download links āļĄāļĩ expiration time (24 āļŠāļąāđˆāļ§āđ‚āļĄāļ‡) - File integrity checks (checksum) - Access control checks āļāđˆāļ­āļ™āļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ” ### **3.13 āđ€āđ€āļ—āļ„āđ‚āļ™āđ‚āļĨāļĒāļĩāļ—āļĩāđˆāđƒāļŠāđ‰ (Technology Stack)** | āļŠāđˆāļ§āļ™ | Library/Tool | āļŦāļĄāļēāļĒāđ€āļŦāļ•āļļ | | ----------------------- | ---------------------------------------------------- | -------------------------------------------- | | **Framework** | `@nestjs/core`, `@nestjs/common` | Core Framework | | **Language** | `TypeScript` | āđƒāļŠāđ‰ TypeScript āļ—āļąāđ‰āļ‡āļĢāļ°āļšāļš | | **Database** | `MariaDB 10.11` | āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļŦāļĨāļąāļ | | **ORM** | `@nestjs/typeorm`, `typeorm` | 🗃ïļāļˆāļąāļ”āļāļēāļĢāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āđāļĨāļ° Query āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ | | **Validation** | `class-validator`, `class-transformer` | ðŸ“Ķāļ•āļĢāļ§āļˆāļŠāļ­āļšāđāļĨāļ°āđāļ›āļĨāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™ DTO | | **Auth** | `@nestjs/jwt`, `@nestjs/passport`, `passport-jwt` | 🔐āļāļēāļĢāļĒāļ·āļ™āļĒāļąāļ™āļ•āļąāļ§āļ•āļ™āļ”āđ‰āļ§āļĒ JWT | | **Authorization** | `casl` | 🔐āļˆāļąāļ”āļāļēāļĢāļŠāļīāļ—āļ˜āļīāđŒāđāļšāļš RBAC | | **File Upload** | `multer` | 📁āļˆāļąāļ”āļāļēāļĢāļāļēāļĢāļ­āļąāļ›āđ‚āļŦāļĨāļ”āđ„āļŸāļĨāđŒ | | **Search** | `@nestjs/elasticsearch` | 🔍āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ„āđ‰āļ™āļŦāļēāļ‚āļąāđ‰āļ™āļŠāļđāļ‡ | | **Notification** | `nodemailer` | 📎āļŠāđˆāļ‡āļ­āļĩāđ€āļĄāļĨāđāļˆāđ‰āļ‡āđ€āļ•āļ·āļ­āļ™ | | **Scheduling** | `@nestjs/schedule` | 📎āļŠāļģāļŦāļĢāļąāļš Cron Jobs (āđ€āļŠāđˆāļ™ āđāļˆāđ‰āļ‡āđ€āļ•āļ·āļ­āļ™ Deadline) | | **Logging** | `winston` | 📊āļšāļąāļ™āļ—āļķāļ Log āļ—āļĩāđˆāļĄāļĩāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļž | | **Testing** | `@nestjs/testing`, `jest`, `supertest` | 🧊āļ—āļ”āļŠāļ­āļš Unit, Integration āđāļĨāļ° E2E | | **Documentation** | `@nestjs/swagger` | 🌐āļŠāļĢāđ‰āļēāļ‡ API Documentation āļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļī | | **Security** | `helmet`, `rate-limiter-flexible` | ðŸ›Ąïļāđ€āļžāļīāđˆāļĄāļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒāđƒāļŦāđ‰ API | | **Resilience** | `@nestjs/circuit-breaker` | 🔄 Circuit breaker pattern | | **Caching** | `@nestjs/cache-manager`, `cache-manager-redis-store` | ðŸ’ū Distributed caching | | **Security** | `helmet`, `csurf`, `rate-limiter-flexible` | ðŸ›Ąïļ Security enhancements | | **Validation** | `class-validator`, `class-transformer` | ✅ Input validation | | **Monitoring** | `@nestjs/monitoring`, `winston` | 📊 Application monitoring | | **File Processing** | `clamscan` | ðŸĶ  Virus scanning | | **Cryptography** | `bcrypt`, `crypto` | 🔐 Password hashing āđāļĨāļ° checksums | | **JSON Validation** | `ajv`, `ajv-formats` | ðŸŽŊ JSON schema validation | | **JSON Processing** | `jsonpath`, `json-schema-ref-parser` | 🔧 JSON manipulation | | **Data Transformation** | `class-transformer` | 🔄 Object transformation | | **Compression** | `compression` | ðŸ“Ķ JSON compression | ### **3.14 Security Testing:** - **Penetration Testing:** āļ—āļ”āļŠāļ­āļš OWASP Top 10 vulnerabilities - **Security Audit:** Review code āļŠāļģāļŦāļĢāļąāļš security flaws - **Virus Scanning Test:** āļ—āļ”āļŠāļ­āļš file upload security - **Rate Limiting Test:** āļ—āļ”āļŠāļ­āļš rate limiting functionality ### **3.15 Performance Testing:** - **Load Testing:** āļ—āļ”āļŠāļ­āļšāļ”āđ‰āļ§āļĒ realistic workloads - **Stress Testing:** āļŦāļē breaking points āļ‚āļ­āļ‡āļĢāļ°āļšāļš - **Endurance Testing:** āļ—āļ”āļŠāļ­āļšāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ•āđˆāļ­āđ€āļ™āļ·āđˆāļ­āļ‡āđ€āļ›āđ‡āļ™āđ€āļ§āļĨāļēāļ™āļēāļ™ ### 🗄ïļ**3.16 Backend State Management** Backend (NestJS) āļ„āļ§āļĢāđ€āļ›āđ‡āļ™ **Stateless** (āđ„āļĄāđˆāđ€āļāđ‡āļšāļŠāļ–āļēāļ™āļ°) "State" āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļˆāļ°āļ–āļđāļāļˆāļąāļ”āđ€āļāđ‡āļšāđƒāļ™ MariaDB - **Request-Scoped State (āļŠāļ–āļēāļ™āļ°āļ āļēāļĒāđƒāļ™ Request āđ€āļ”āļĩāļĒāļ§):** - **āļ›āļąāļāļŦāļē:** āļˆāļ°āļŠāđˆāļ‡āļ•āđˆāļ­āļ‚āđ‰āļ­āļĄāļđāļĨ (āđ€āļŠāđˆāļ™ User āļ—āļĩāđˆāļĨāđ‡āļ­āļāļ­āļīāļ™) āļĢāļ°āļŦāļ§āđˆāļēāļ‡ Guard āđāļĨāļ° Service āđƒāļ™ Request āđ€āļ”āļĩāļĒāļ§āļāļąāļ™āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āđ„āļĢ? - **āļ§āļīāļ˜āļĩāđāļāđ‰:** āđƒāļŠāđ‰ **Request-Scoped Providers** āļ‚āļ­āļ‡ NestJS (āđ€āļŠāđˆāļ™ AuthContextService) āđ€āļžāļ·āđˆāļ­āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨ User āļ›āļąāļˆāļˆāļļāļšāļąāļ™āļ—āļĩāđˆāđ„āļ”āđ‰āļˆāļēāļ AuthGuard āđāļĨāļ°āđƒāļŦāđ‰ Service āļ­āļ·āđˆāļ™ Inject āđ„āļ›āđƒāļŠāđ‰ - **Application-Scoped State (āļāļēāļĢ Caching):** - **āļ›āļąāļāļŦāļē:** āļ‚āđ‰āļ­āļĄāļđāļĨ Master (āđ€āļŠāđˆāļ™ roles, permissions, organizations) āļ–āļđāļāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļšāđˆāļ­āļĒ - **āļ§āļīāļ˜āļĩāđāļāđ‰:** āđƒāļŠāđ‰ **Caching** (āđ€āļŠāđˆāļ™ @nestjs/cache-manager) āđ€āļžāļ·āđˆāļ­ Caching āļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰ āđāļĨāļ°āļĨāļ”āļ āļēāļĢāļ° Database ### **3.17 Caching Strategy (āļ•āļēāļĄāļ‚āđ‰āļ­ 6.4.2):** - **Master Data Cache:** Roles, Permissions, Organizations (TTL: 1 hour) - **User Session Cache:** User permissions āđāļĨāļ° profile (TTL: 30 minutes) - **Search Result Cache:** Frequently searched queries (TTL: 15 minutes) - **File Metadata Cache:** Attachment metadata (TTL: 1 hour) - **Cache Invalidation:** Clear cache on update/delete operations ### **3.18 āļāļēāļĢāđ„āļŦāļĨāļ‚āļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ (Data Flow)** #### **3.18.1 Main Flow:** 1. Request: āļœāđˆāļēāļ™ Nginx Proxy Manager -> NestJS Controller 2. **Rate Limiting:** RateLimitGuard āļ•āļĢāļ§āļˆāļŠāļ­āļš request limits 3. **Input Validation:** Validation Pipe āļ•āļĢāļ§āļˆāļŠāļ­āļšāđāļĨāļ° sanitize inputs 4. Authentication: JWT Guard āļ•āļĢāļ§āļˆāļŠāļ­āļš Token āđāļĨāļ°āļ”āļķāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ User 5. Authorization: RBAC Guard āļ•āļĢāļ§āļˆāļŠāļ­āļšāļŠāļīāļ—āļ˜āļīāđŒ 6. **Security Checks:** Virus scanning (āļŠāļģāļŦāļĢāļąāļš file upload), XSS protection 7. Business Logic: Service Layer āļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ•āļĢāļĢāļāļ°āļ—āļēāļ‡āļ˜āļļāļĢāļāļīāļˆ 8. **Resilience:** Circuit breaker āđāļĨāļ° retry logic āļŠāļģāļŦāļĢāļąāļš external calls 9. Data Access: Repository Layer āļ•āļīāļ”āļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ 10. **Caching:** Cache frequently accessed data 11. **Audit Log:** āļšāļąāļ™āļ—āļķāļāļāļēāļĢāļāļĢāļ°āļ—āļģāļŠāļģāļ„āļąāļ 12. Response: āļŠāđˆāļ‡āļāļĨāļąāļšāđ„āļ›āļĒāļąāļ‡ Frontend #### **3.18.2 Workflow Data Flow:** 1. User āļŠāļĢāđ‰āļēāļ‡āđ€āļ­āļāļŠāļēāļĢ â†’ āđ€āļĨāļ·āļ­āļ routing template 2. System āļŠāļĢāđ‰āļēāļ‡ routing instances āļ•āļēāļĄ template 3. āļŠāļģāļŦāļĢāļąāļšāđāļ•āđˆāļĨāļ° routing step: - āļāļģāļŦāļ™āļ” due date (āļˆāļēāļ expected_days) - āļŠāđˆāļ‡ notification āđ„āļ›āļĒāļąāļ‡āļ­āļ‡āļ„āđŒāļāļĢāļœāļđāđ‰āļĢāļąāļš - āļ­āļąāļžāđ€āļ”āļ—āļŠāļ–āļēāļ™āļ°āđ€āļ›āđ‡āļ™ SENT 4. āđ€āļĄāļ·āđˆāļ­āļ­āļ‡āļ„āđŒāļāļĢāļœāļđāđ‰āļĢāļąāļšāļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢ: - āļ­āļąāļžāđ€āļ”āļ—āļŠāļ–āļēāļ™āļ°āđ€āļ›āđ‡āļ™ ACTIONED/FORWARDED/REPLIED - āļšāļąāļ™āļ—āļķāļ processed_by āđāļĨāļ° processed_at - āļŠāđˆāļ‡ notification āđ„āļ›āļĒāļąāļ‡āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ•āđˆāļ­āđ„āļ› (āļ–āđ‰āļēāļĄāļĩ) 5. āđ€āļĄāļ·āđˆāļ­āļ„āļĢāļšāļ—āļļāļāļ‚āļąāđ‰āļ™āļ•āļ­āļ™ â†’ āļ­āļąāļžāđ€āļ”āļ—āļŠāļ–āļēāļ™āļ°āđ€āļ­āļāļŠāļēāļĢāđ€āļ›āđ‡āļ™ COMPLETED #### **3.18.3 JSON Details Processing Flow:** 1. **Receive Request** → Get JSON data from client 2. **Schema Validation** → Validate against predefined schema 3. **Data Sanitization** → Sanitize and transform data 4. **Version Check** → Handle schema version compatibility 5. **Storage** → Store validated JSON in database 6. **Retrieval** → Retrieve and transform on demand ### 📊**3.19 Monitoring & Observability (āļ•āļēāļĄāļ‚āđ‰āļ­ 6.8)** #### **Application Monitoring:** - **Health Checks:** `/health` endpoint āļŠāļģāļŦāļĢāļąāļš load balancer - **Metrics Collection:** Response times, error rates, throughput - **Distributed Tracing:** āļŠāļģāļŦāļĢāļąāļš request tracing across services - **Log Aggregation:** Structured logging āļ”āđ‰āļ§āļĒ JSON format - **Alerting:** āļŠāļģāļŦāļĢāļąāļš critical errors āđāļĨāļ° performance degradation #### **Business Metrics:** - āļˆāļģāļ™āļ§āļ™ documents created āļ•āđˆāļ­āļ§āļąāļ™ - Workflow completion rates - User activity metrics - System utilization rates - Search query performance #### **Performance Targets:** - API Response Time: - Simple CRUD: < 100ms - Complex Search: < 500ms - File Processing: < 2s - File Upload Performance: < 30 seconds āļŠāļģāļŦāļĢāļąāļšāđ„āļŸāļĨāđŒ 50MB - Cache Hit Ratio: > 80% ### **3.20 Logging Strategy for QNAP Environment** āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļĢāļ°āļšāļšāļĢāļąāļ™āļšāļ™ QNAP Container Station āļ‹āļķāđˆāļ‡āļ­āļēāļˆāļĄāļĩāļ‚āđ‰āļ­āļˆāļģāļāļąāļ”āđ€āļĢāļ·āđˆāļ­āļ‡ Disk I/O āđāļĨāļ° Storage: - Log Levels: āđƒāļŦāđ‰āļāļģāļŦāļ™āļ” Log Level āļ‚āļ­āļ‡ Production āđ€āļ›āđ‡āļ™ WARN āļŦāļĢāļ·āļ­ ERROR āđ€āļ›āđ‡āļ™āļŦāļĨāļąāļ - Info Logs: āđƒāļŠāđ‰ INFO āđ€āļ‰āļžāļēāļ° Flow āļ—āļĩāđˆāļŠāļģāļ„āļąāļāļ—āļēāļ‡āļ˜āļļāļĢāļāļīāļˆāđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™ (āđ€āļŠāđˆāļ™ Workflow State Change, Login Success/Fail, File Upload Commit) - Console Logging: āļŦāļĨāļĩāļāđ€āļĨāļĩāđˆāļĒāļ‡ console.log āļ›āļĢāļīāļĄāļēāļ“āļĄāļēāļ (Verbose) āđƒāļŦāđ‰āđƒāļŠāđ‰ Winston Logger āļ—āļĩāđˆ Config āđƒāļŦāđ‰āļˆāļąāļ”āļāļēāļĢ Rotation āđāļĨāļ° Format āđ„āļ”āđ‰āļ”āļĩāļāļ§āđˆāļē - Disable Debug: āļ›āļīāļ” Debug Log āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđƒāļ™ Production Mode ## ðŸ–Ĩïļ **4. āļŸāļĢāļ­āļ™āļ•āđŒāđ€āļ­āļ™āļ”āđŒ (Next.js) - Implementation Details** ### **4.1 State Management & Offline Support** #### **4.1.1 Auto-Save Drafts** āđƒāļŠāđ‰ **React Hook Form** āļĢāđˆāļ§āļĄāļāļąāļš **persist** mechanism āļŠāļģāļŦāļĢāļąāļšāļŸāļ­āļĢāđŒāļĄāļ—āļĩāđˆāļĄāļĩāļ‚āļ™āļēāļ”āđƒāļŦāļāđˆ (āđ€āļŠāđˆāļ™ RFA, Correspondence): ```typescript // hooks/useAutoSaveForm.ts export const useAutoSaveForm = (formKey: string, defaultValues: any) => { const { register, watch, setValue } = useForm({ defaultValues }); // Auto-save āđ€āļĄāļ·āđˆāļ­ form āđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡ useEffect(() => { const subscription = watch((value) => { localStorage.setItem(`draft-${formKey}`, JSON.stringify(value)); }); return () => subscription.unsubscribe(); }, [watch, formKey]); // Load draft āđ€āļĄāļ·āđˆāļ­ component mount useEffect(() => { const draft = localStorage.getItem(`draft-${formKey}`); if (draft) { const parsed = JSON.parse(draft); Object.keys(parsed).forEach((key) => { setValue(key, parsed[key]); }); } }, [formKey, setValue]); return { register }; }; ``` #### **4.1.2 Silent Refresh Strategy** āđƒāļŠāđ‰ React Query āļŠāļģāļŦāļĢāļąāļšāļˆāļąāļ”āļāļēāļĢ token refresh āļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļī ```typescript // lib/api/client.ts const apiClient = axios.create({ baseURL: process.env.NEXT_PUBLIC_API_URL, }); // React Query āļˆāļ°āļˆāļąāļ”āļāļēāļĢ token refresh āļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļīāļœāđˆāļēāļ™ interceptors ``` ### **4.2 Dynamic Form Generator** āđ€āļžāļ·āđˆāļ­āļĢāļ­āļ‡āļĢāļąāļš JSON Schema āļŦāļĨāļēāļāļŦāļĨāļēāļĒāļĢāļđāļ›āđāļšāļš āđƒāļŦāđ‰āļŠāļĢāđ‰āļēāļ‡ Component āļāļĨāļēāļ‡āļ—āļĩāđˆāļĢāļąāļš Schema āđāļĨāđ‰āļ§ Gen Form āļ­āļ­āļāļĄāļē (āļĨāļ”āļāļēāļĢāđāļāđ‰ Code āļšāđˆāļ­āļĒāđ†) - **Libraries:** āđāļ™āļ°āļ™āļģ `react-jsonschema-form` āļŦāļĢāļ·āļ­āļŠāļĢāđ‰āļēāļ‡ Wrapper āļšāļ™ `react-hook-form` āļ—āļĩāđˆ Recursively render field āļ•āļēāļĄ Type - **Validation:** āđƒāļŠāđ‰ `ajv` āļ—āļĩāđˆāļāļąāđˆāļ‡ Client āđ€āļžāļ·āđˆāļ­ Validate JSON āļāđˆāļ­āļ™ Submit - Schema Dependencies: āļ•āļąāļ§ Generator āļ•āđ‰āļ­āļ‡āļĢāļ­āļ‡āļĢāļąāļš dependencies keyword āļ‚āļ­āļ‡ JSON Schema (āļŦāļĢāļ·āļ­ ui:schema logic) āđ€āļžāļ·āđˆāļ­āļĢāļ­āļ‡āļĢāļąāļšāđ€āļ‡āļ·āđˆāļ­āļ™āđ„āļ‚āļ‹āļąāļšāļ‹āđ‰āļ­āļ™ āđ€āļŠāđˆāļ™ "āļ–āđ‰āļēāđ€āļĨāļ·āļ­āļāļ›āļĢāļ°āđ€āļ āļ—āđ€āļ­āļāļŠāļēāļĢāđ€āļ›āđ‡āļ™ 'Shop Drawing' āđƒāļŦāđ‰āđāļŠāļ”āļ‡ Dropdown āđ€āļĨāļ·āļ­āļ 'Main Category' āđ€āļžāļīāđˆāļĄāļ‚āļķāđ‰āļ™āļĄāļē" (Conditional Rendering) ### **4.3 Mobile Responsiveness (Card View)** āļ•āļēāļĢāļēāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ (`DataTable`) āļ•āđ‰āļ­āļ‡āļĄāļĩāļ„āļ§āļēāļĄāļ‰āļĨāļēāļ”āđƒāļ™āļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨ: - **Desktop:** āđāļŠāļ”āļ‡āđ€āļ›āđ‡āļ™ Table āļ›āļāļ•āļī - **Mobile:** āđāļ›āļĨāļ‡āđ€āļ›āđ‡āļ™ **Card View** āđ‚āļ”āļĒāļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļī (āļ‹āđˆāļ­āļ™ Header, āđāļŠāļ”āļ‡ Label āļ„āļđāđˆ Value āđƒāļ™āđāļ•āđˆāļĨāļ° Card) ```tsx // components/ui/responsive-table.tsx
{/* Desktop View */}
{data.map((item) => ( {/* Mobile View: Render cells as list items */} ))}
``` ### **4.4 Optimistic Updates** āđƒāļŠāđ‰āļ„āļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļ–āļ‚āļ­āļ‡ **TanStack Query** (`onMutate`) āđ€āļžāļ·āđˆāļ­āļ­āļąāļ›āđ€āļ”āļ• UI āļ—āļąāļ™āļ—āļĩ (āđ€āļŠāđˆāļ™ āđ€āļ›āļĨāļĩāđˆāļĒāļ™āļŠāļ–āļēāļ™āļ°āļˆāļēāļ "āļĢāļ­āļ­āđˆāļēāļ™" āđ€āļ›āđ‡āļ™ "āļ­āđˆāļēāļ™āđāļĨāđ‰āļ§") āđāļĨāđ‰āļ§āļ„āđˆāļ­āļĒāļŠāđˆāļ‡ Request āđ„āļ› Server āļ–āđ‰āļē Failed āļ„āđˆāļ­āļĒ Rollback ### **4.5 āđāļ™āļ§āļ—āļēāļ‡āļāļēāļĢāļžāļąāļ’āļ™āļēāđ‚āļ„āđ‰āļ” (Code Implementation Guidelines)** - āđƒāļŠāđ‰ **early returns** āđ€āļžāļ·āđˆāļ­āļ„āļ§āļēāļĄāļŠāļąāļ”āđ€āļˆāļ™ - āđƒāļŠāđ‰āļ„āļĨāļēāļŠāļ‚āļ­āļ‡ **TailwindCSS** āđƒāļ™āļāļēāļĢāļāļģāļŦāļ™āļ”āļŠāđ„āļ•āļĨāđŒāđ€āļŠāļĄāļ­ - āļ„āļ§āļĢāđƒāļŠāđ‰ class: syntax āđāļšāļšāļĄāļĩāđ€āļ‡āļ·āđˆāļ­āļ™āđ„āļ‚ (āļŦāļĢāļ·āļ­ utility clsx) āļĄāļēāļāļāļ§āđˆāļēāļāļēāļĢāđƒāļŠāđ‰ ternary operators āđƒāļ™ class strings - āđƒāļŠāđ‰ **const arrow functions** āļŠāļģāļŦāļĢāļąāļš components āđāļĨāļ° handlers - Event handlers āđƒāļŦāđ‰āļ‚āļķāđ‰āļ™āļ•āđ‰āļ™āļ”āđ‰āļ§āļĒ handle... (āđ€āļŠāđˆāļ™ handleClick, handleSubmit) - āļĢāļ§āļĄāđāļ­āļ•āļ—āļĢāļīāļšāļīāļ§āļ•āđŒāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡ (accessibility) āļ”āđ‰āļ§āļĒ: tabIndex="0", aria-label, onKeyDown, āļŊāļĨāļŊ - āļ•āļĢāļ§āļˆāļŠāļ­āļšāđƒāļŦāđ‰āđāļ™āđˆāđƒāļˆāļ§āđˆāļēāđ‚āļ„āđ‰āļ”āļ—āļąāđ‰āļ‡āļŦāļĄāļ” **āļŠāļĄāļšāļđāļĢāļ“āđŒ**, **āļœāđˆāļēāļ™āļāļēāļĢāļ—āļ”āļŠāļ­āļš**, āđāļĨāļ° **āđ„āļĄāđˆāļ‹āđ‰āļģāļ‹āđ‰āļ­āļ™ (DRY)** - āļ•āđ‰āļ­āļ‡ import āđ‚āļĄāļ”āļđāļĨāļ—āļĩāđˆāļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰āļ­āļĒāđˆāļēāļ‡āļŠāļąāļ”āđ€āļˆāļ™āđ€āļŠāļĄāļ­ ### **4.6 UI/UX āļ”āđ‰āļ§āļĒ React** - āđƒāļŠāđ‰ **semantic HTML** - āđƒāļŠāđ‰āļ„āļĨāļēāļŠāļ‚āļ­āļ‡ **Tailwind** āļ—āļĩāđˆāļĢāļ­āļ‡āļĢāļąāļš responsive (sm:, md:, lg:) - āļĢāļąāļāļĐāļēāļĨāļģāļ”āļąāļšāļŠāļąāđ‰āļ™āļ‚āļ­āļ‡āļāļēāļĢāļĄāļ­āļ‡āđ€āļŦāđ‡āļ™ (visual hierarchy) āļ”āđ‰āļ§āļĒāļāļēāļĢāđƒāļŠāđ‰ typography āđāļĨāļ° spacing - āđƒāļŠāđ‰ **Shadcn** components (Button, Input, Card, āļŊāļĨāļŊ) āđ€āļžāļ·āđˆāļ­ UI āļ—āļĩāđˆāļŠāļ­āļ”āļ„āļĨāđ‰āļ­āļ‡āļāļąāļ™ - āļ—āļģāđƒāļŦāđ‰ components āļĄāļĩāļ‚āļ™āļēāļ”āđ€āļĨāđ‡āļāđāļĨāļ°āļĄāļļāđˆāļ‡āđ€āļ™āđ‰āļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āđ€āļ‰āļžāļēāļ°āļ­āļĒāđˆāļēāļ‡ - āđƒāļŠāđ‰ utility classes āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļˆāļąāļ”āļŠāđ„āļ•āļĨāđŒāļ­āļĒāđˆāļēāļ‡āļĢāļ§āļ”āđ€āļĢāđ‡āļ§ (spacing, colors, text, āļŊāļĨāļŊ) - āļ•āļĢāļ§āļˆāļŠāļ­āļšāđƒāļŦāđ‰āđāļ™āđˆāđƒāļˆāļ§āđˆāļēāļŠāļ­āļ”āļ„āļĨāđ‰āļ­āļ‡āļāļąāļš **ARIA** āđāļĨāļ°āđƒāļŠāđ‰ semantic markup ### **4.7 āļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāļŸāļ­āļĢāđŒāļĄāđāļĨāļ°āļ‚āđ‰āļ­āļœāļīāļ”āļžāļĨāļēāļ” (Form Validation & Errors)** - āđƒāļŠāđ‰āđ„āļĨāļšāļĢāļēāļĢāļĩāļāļąāđˆāļ‡ client āđ€āļŠāđˆāļ™ zod āđāļĨāļ° react-hook-form - āđāļŠāļ”āļ‡āļ‚āđ‰āļ­āļœāļīāļ”āļžāļĨāļēāļ”āļ”āđ‰āļ§āļĒ **alert components** āļŦāļĢāļ·āļ­āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ inline - āļ•āđ‰āļ­āļ‡āļĄāļĩ labels, placeholders, āđāļĨāļ°āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ feedback ### **4.8 Error Handling & Resilience (Frontend)** #### **4.8.1 Global Error Handling with React Query** āđƒāļŠāđ‰ **React Query** Error Boundaries āļŠāļģāļŦāļĢāļąāļšāļˆāļąāļ”āļāļēāļĢ errors āđāļšāļšāļĢāļ§āļĄāļĻāļđāļ™āļĒāđŒ: ```typescript // app/providers.tsx export function QueryProvider({ children }: { children: React.ReactNode }) { const queryClient = new QueryClient({ defaultOptions: { queries: { retry: 1, staleTime: 5 * 60 * 1000, // 5 minutes }, mutations: { onError: (error) => { // Global mutation error handling toast.error('Operation failed'); }, }, }, }); return ( {children} ); } ``` ### **🧊4.9 Frontend Testing** āđ€āļĢāļēāļˆāļ°āđƒāļŠāđ‰ **React Testing Library (RTL)** āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ—āļ”āļŠāļ­āļš Component āđāļĨāļ° **Playwright** āļŠāļģāļŦāļĢāļąāļš E2E: - **Unit Tests (āļāļēāļĢāļ—āļ”āļŠāļ­āļšāļŦāļ™āđˆāļ§āļĒāļĒāđˆāļ­āļĒ):** - **āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­:** Vitest + RTL - **āđ€āļ›āđ‰āļēāļŦāļĄāļēāļĒ:** āļ—āļ”āļŠāļ­āļš Component āļ‚āļ™āļēāļ”āđ€āļĨāđ‡āļ (āđ€āļŠāđˆāļ™ Buttons, Inputs) āļŦāļĢāļ·āļ­ Utility functions - **Integration Tests (āļāļēāļĢāļ—āļ”āļŠāļ­āļšāļāļēāļĢāļšāļđāļĢāļ“āļēāļāļēāļĢ):** - **āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­:** RTL + **Mock Service Worker (MSW)** - **āđ€āļ›āđ‰āļēāļŦāļĄāļēāļĒ:** āļ—āļ”āļŠāļ­āļšāļ§āđˆāļē Component āļŦāļĢāļ·āļ­ Page āļ—āļģāļ‡āļēāļ™āļāļąāļš API (āļ—āļĩāđˆāļˆāļģāļĨāļ­āļ‡āļ‚āļķāđ‰āļ™) āđ„āļ”āđ‰āļ–āļđāļāļ•āđ‰āļ­āļ‡ - **āđ€āļ—āļ„āļ™āļīāļ„:** āđƒāļŠāđ‰ MSW āđ€āļžāļ·āđˆāļ­āļˆāļģāļĨāļ­āļ‡ NestJS API āđāļĨāļ°āļ—āļ”āļŠāļ­āļšāļ§āđˆāļē Component āđāļŠāļ”āļ‡āļœāļĨāļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļģāļĨāļ­āļ‡āđ„āļ”āđ‰āļ–āļđāļāļ•āđ‰āļ­āļ‡āļŦāļĢāļ·āļ­āđ„āļĄāđˆ (āđ€āļŠāđˆāļ™ āļ—āļ”āļŠāļ­āļšāļŦāļ™āđ‰āļē Dashboard [cite: 5.3] āļ—āļĩāđˆāļ”āļķāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļēāļ v_user_tasks) - **E2E (End-to-End) Tests:** - **āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­:** **Playwright** - **āđ€āļ›āđ‰āļēāļŦāļĄāļēāļĒ:** āļ—āļ”āļŠāļ­āļš User Flow āļ—āļąāđ‰āļ‡āļĢāļ°āļšāļšāđ‚āļ”āļĒāļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļī (āđ€āļŠāđˆāļ™ āļĨāđ‡āļ­āļāļ­āļīāļ™ -> āļŠāļĢāđ‰āļēāļ‡ RFA -> āļ•āļĢāļ§āļˆāļŠāļ­āļš Workflow Visualization [cite: 5.6]) ### **🗄ïļ4.10 Frontend State Management (āļ›āļĢāļąāļšāļ›āļĢāļļāļ‡)** ### 🗄ïļ4.10 Frontend State Management (āļ›āļĢāļąāļšāļ›āļĢāļļāļ‡) āļŠāļģāļŦāļĢāļąāļš Next.js App Router āđ€āļĢāļēāļˆāļ°āđƒāļŠāđ‰ State Management āđāļšāļš Simplified āđ‚āļ”āļĒāđāļšāđˆāļ‡āđ€āļ›āđ‡āļ™ 3 āļĢāļ°āļ”āļąāļšāļŦāļĨāļąāļ: - 4.10.āđ…. **Server State (āļŠāļ–āļēāļ™āļ°āļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļēāļāđ€āļ‹āļīāļĢāđŒāļŸāđ€āļ§āļ­āļĢāđŒ)** - **āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­:** **TanStack Query (React Query)** - **āđƒāļŠāđ‰āđ€āļĄāļ·āđˆāļ­:** āļˆāļąāļ”āļāļēāļĢāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļ”āļķāļ‡āļĄāļēāļˆāļēāļ NestJS API āļ—āļąāđ‰āļ‡āļŦāļĄāļ” - **āļ„āļĢāļ­āļšāļ„āļĨāļļāļĄ:** āļĢāļēāļĒāļāļēāļĢ correspondences, rfas, drawings, users, permissions - **āļ›āļĢāļ°āđ‚āļĒāļŠāļ™āđŒ:** āļˆāļąāļ”āļāļēāļĢ Caching, Re-fetching, Background Sync āļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļī - 4.10.2. **Form State (āļŠāļ–āļēāļ™āļ°āļ‚āļ­āļ‡āļŸāļ­āļĢāđŒāļĄ):** - **āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­:** **React Hook Form** + **Zod** (āļŠāļģāļŦāļĢāļąāļš validation) - **āđƒāļŠāđ‰āđ€āļĄāļ·āđˆāļ­:** āļˆāļąāļ”āļāļēāļĢāļŸāļ­āļĢāđŒāļĄāļ—āļĩāđˆāļ‹āļąāļšāļ‹āđ‰āļ­āļ™āļ—āļąāđ‰āļ‡āļŦāļĄāļ” - **āļ„āļĢāļ­āļšāļ„āļĨāļļāļĄ:** āļŸāļ­āļĢāđŒāļĄāļŠāļĢāđ‰āļēāļ‡/āđāļāđ‰āđ„āļ‚ RFA, Correspondence, Circulation - **āļĢāļ§āļĄāļŸāļĩāđ€āļˆāļ­āļĢāđŒ:** Auto-save drafts āļĨāļ‡ LocalStorage - 4.10.3. **UI State (āļŠāļ–āļēāļ™āļ° UI āļŠāļąāđˆāļ§āļ„āļĢāļēāļ§):** - **āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­:** **useState**, **useReducer** (āđƒāļ™ Component) - **āđƒāļŠāđ‰āđ€āļĄāļ·āđˆāļ­:** āļˆāļąāļ”āļāļēāļĢāļŠāļ–āļēāļ™āļ°āđ€āļ‰āļžāļēāļ° Component - **āļ„āļĢāļ­āļšāļ„āļĨāļļāļĄ:** Modal āđ€āļ›āļīāļ”/āļ›āļīāļ”, Dropdown state, Loading states - **āļĒāļāđ€āļĨāļīāļāļāļēāļĢāđƒāļŠāđ‰:** - ❌ Zustand (āđ„āļĄāđˆāļˆāļģāđ€āļ›āđ‡āļ™ āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāđƒāļŠāđ‰ React Query āđāļĨāļ° React Hook Form) - ❌ Context API āļŠāļģāļŦāļĢāļąāļš Server State (āđƒāļŠāđ‰ React Query āđāļ—āļ™) - **āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡ Implementation:** ```typescript // āđƒāļŠāđ‰ React Query āļŠāļģāļŦāļĢāļąāļš data fetching const { data: correspondences, isLoading } = useQuery({ queryKey: ['correspondences', projectId], queryFn: () => api.getCorrespondences(projectId), }); // āđƒāļŠāđ‰ React Hook Form āļŠāļģāļŦāļĢāļąāļš forms const { register, handleSubmit, formState: { errors }, } = useForm({ resolver: zodResolver(correspondenceSchema), }); ``` ### 4.11 State Management Best Practices #### **4.11.1 āļŦāļĨāļąāļāļāļēāļĢāļžāļ·āđ‰āļ™āļāļēāļ™:** - **Server State ≠ Client State:** āđāļĒāļ state āļ•āļēāļĄāđāļŦāļĨāđˆāļ‡āļ—āļĩāđˆāļĄāļēāđƒāļŦāđ‰āļŠāļąāļ”āđ€āļˆāļ™ - **āđƒāļŠāđ‰ Tools āđƒāļŦāđ‰āļ–āļđāļāļŦāļ™āđ‰āļēāļ—āļĩāđˆ:** āđāļ•āđˆāļĨāļ° tool āđƒāļŠāđ‰āđāļāđ‰āļ›āļąāļāļŦāļēāļ—āļĩāđˆāđ€āļ‰āļžāļēāļ°āđ€āļˆāļēāļ°āļˆāļ‡ - **Avoid Over-engineering:** āđ€āļĢāļīāđˆāļĄāļˆāļēāļ useState āļāđˆāļ­āļ™ āđāļĨāđ‰āļ§āļ„āđˆāļ­āļĒāļ‚āļĒāļēāļĒāļ•āļēāļĄāļ„āļ§āļēāļĄāļˆāļģāđ€āļ›āđ‡āļ™ #### **4.11.2 Decision Framework:** - **Server State:** āđƒāļŠāđ‰ React Query āļŦāļĢāļ·āļ­ SWR - **Form State:** āđƒāļŠāđ‰ React Hook Form āļŦāļĢāļ·āļ­ Formik - **UI State:** āđƒāļŠāđ‰ useState/useReducer - **Global App State:** āđƒāļŠāđ‰ React Query āļŦāļĢāļ·āļ­ Context API #### **4.11.3 Performance Considerations:** - āđƒāļŠāđ‰ `useMemo` āđāļĨāļ° `useCallback` āļŠāļģāļŦāļĢāļąāļš expensive computations - āđƒāļŠāđ‰ React Query's `select` option āļŠāļģāļŦāļĢāļąāļš derived data - āļŦāļĨāļĩāļāđ€āļĨāļĩāđˆāļĒāļ‡ unnecessary re-renders āļ”āđ‰āļ§āļĒ proper dependency arrays ## 🔐 **5. Security & Access Control (Full Stack Integration)** ### **5.1 CASL Integration (Shared Ability)** - **Backend:** āđƒāļŠāđ‰ CASL āļāļģāļŦāļ™āļ” Permission Rule - **Frontend:** āđƒāļŦāđ‰āļ”āļķāļ‡ Rule (JSON) āļˆāļēāļ Backend āļĄāļē Load āđƒāļŠāđˆ `@casl/react` āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰ Logic āļāļēāļĢ Show/Hide āļ›āļļāđˆāļĄ āļ•āļĢāļ‡āļāļąāļ™ 100% ### **5.2 Maintenance Mode** āđ€āļžāļīāđˆāļĄ Middleware (āļ—āļąāđ‰āļ‡ NestJS āđāļĨāļ° Next.js) āđ€āļžāļ·āđˆāļ­āļ•āļĢāļ§āļˆāļŠāļ­āļš Flag āđƒāļ™ Redis: - āļ–āđ‰āļē `MAINTENANCE_MODE = true` - **API:** Return `503 Service Unavailable` (āļĒāļāđ€āļ§āđ‰āļ™ Admin IP) - **Frontend:** Redirect āđ„āļ›āļŦāļ™āđ‰āļē `/maintenance` ### **5.3 Idempotency Client** āļŠāļĢāđ‰āļēāļ‡ Axios Interceptor āđ€āļžāļ·āđˆāļ­ Generate `Idempotency-Key` āļŠāļģāļŦāļĢāļąāļš POST/PUT/DELETE requests āļ—āļļāļāļ„āļĢāļąāđ‰āļ‡ ```typescript // lib/api/client.ts import { v4 as uuidv4 } from 'uuid'; apiClient.interceptors.request.use((config) => { if (['post', 'put', 'delete'].includes(config.method)) { config.headers['Idempotency-Key'] = uuidv4(); } return config; }); ``` ### **5.4 RBAC āđāļĨāļ°āļāļēāļĢāļ„āļ§āļšāļ„āļļāļĄāļŠāļīāļ—āļ˜āļīāđŒ (RBAC & Permission Control)** āđƒāļŠāđ‰ Decorators āđ€āļžāļ·āđˆāļ­āļšāļąāļ‡āļ„āļąāļšāđƒāļŠāđ‰āļŠāļīāļ—āļ˜āļīāđŒāļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡ āđ‚āļ”āļĒāļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļŠāļīāļ—āļ˜āļīāđŒāļˆāļēāļāļ•āļēāļĢāļēāļ‡ permissions ```typescript @RequirePermission('rfas.respond') // āļ•āđ‰āļ­āļ‡āļ•āļĢāļ‡āļāļąāļš 'permission_code' @Put(':id') updateRFA(@Param('id') id: string) { return this.rfaService.update(id); } ``` #### **5.4.1 Roles (āļšāļ—āļšāļēāļ—)** - **Superadmin**: āđ„āļĄāđˆāļĄāļĩāļ‚āđ‰āļ­āļˆāļģāļāļąāļ”āđƒāļ”āđ† [cite: 4.3] - **Admin**: āļĄāļĩāļŠāļīāļ—āļ˜āļīāđŒāđ€āļ•āđ‡āļĄāļ—āļĩāđˆāđƒāļ™āļ­āļ‡āļ„āđŒāļāļĢ [cite: 4.3] - **Document Control**: āđ€āļžāļīāđˆāļĄ/āđāļāđ‰āđ„āļ‚/āļĨāļš āđ€āļ­āļāļŠāļēāļĢāđƒāļ™āļ­āļ‡āļ„āđŒāļāļĢ [cite: 4.3] - **Editor**: āļŠāļēāļĄāļēāļĢāļ– āđ€āļžāļīāđˆāļĄ/āđāļāđ‰āđ„āļ‚ āđ€āļ­āļāļŠāļēāļĢāļ—āļĩāđˆāļāļģāļŦāļ™āļ” [cite: 4.3] - **Viewer**: āļŠāļēāļĄāļēāļĢāļ–āļ”āļđ āđ€āļ­āļāļŠāļēāļĢ [cite: 4.3] #### **5.4.2 āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡ Permissions (āļˆāļēāļāļ•āļēāļĢāļēāļ‡ permissions)** - rfas.view, rfas.create, rfas.respond, rfas.delete - drawings.view, drawings.upload, drawings.delete - corr.view, corr.manage - transmittals.manage - cirs.manage - project_parties.manage āļāļēāļĢāļˆāļąāļšāļ„āļđāđˆāļĢāļ°āļŦāļ§āđˆāļēāļ‡ roles āđāļĨāļ° permissions **āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™** āļˆāļ°āļ–āļđāļ seed āļœāđˆāļēāļ™āļŠāļ„āļĢāļīāļ›āļ•āđŒ (āļ”āļąāļ‡āļ—āļĩāđˆāđ€āļŦāđ‡āļ™āđƒāļ™āđ„āļŸāļĨāđŒ SQL)**āļ­āļĒāđˆāļēāļ‡āđ„āļĢāļāđ‡āļ•āļēāļĄ AuthModule/UserModule āļ•āđ‰āļ­āļ‡āļĄāļĩ API āļŠāļģāļŦāļĢāļąāļš Admin āđ€āļžāļ·āđˆāļ­āļŠāļĢāđ‰āļēāļ‡ Role āđƒāļŦāļĄāđˆāđāļĨāļ°āļāļģāļŦāļ™āļ”āļŠāļīāļ—āļ˜āļīāđŒ (Permissions) āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāđ„āļ”āđ‰āđƒāļ™āļ āļēāļĒāļŦāļĨāļąāļ‡** [cite: 4.3] ## 📊 **6. Notification & Background Jobs** ### **6.1 Digest Notification** āļŦāđ‰āļēāļĄāļŠāđˆāļ‡ Email āļ—āļąāļ™āļ—āļĩāļ—āļĩāđˆāđ€āļāļīāļ” Event āđƒāļŦāđ‰: 1. Push Event āļĨāļ‡ Queue (Redis/BullMQ) 2. āļĄāļĩ Processor āļĢāļ­āđ€āļ§āļĨāļē (āđ€āļŠāđˆāļ™ 5 āļ™āļēāļ—āļĩ) āđ€āļžāļ·āđˆāļ­ Group Events āļ—āļĩāđˆāļ„āļĨāđ‰āļēāļĒāļāļąāļ™ (āđ€āļŠāđˆāļ™ "āļ„āļļāļ“āļĄāļĩāđ€āļ­āļāļŠāļēāļĢāļĢāļ­āļ­āļ™āļļāļĄāļąāļ•āļī 5 āļ‰āļšāļąāļš") 3. āļŠāđˆāļ‡ Email āđ€āļ”āļĩāļĒāļ§ (Digest) āđ€āļžāļ·āđˆāļ­āļĨāļ” Spam ## 🔗 **7. āđāļ™āļ§āļ—āļēāļ‡āļāļēāļĢāļšāļđāļĢāļ“āļēāļāļēāļĢ Full Stack (Full Stack Integration Guidelines)** | Aspect (āđāļ‡āđˆāļĄāļļāļĄ) | Backend (NestJS) | Frontend (NextJS) | UI Layer (Tailwind/Shadcn) | | :------------------------- | :------------------------- | :----------------------------- | :------------------------------------- | | API | REST / GraphQL Controllers | API hooks āļœāđˆāļēāļ™ fetch/axios/SWR | Components āļ—āļĩāđˆāļĢāļąāļšāļ‚āđ‰āļ­āļĄāļđāļĨ | | Validation (āļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļš) | class-validator DTOs | zod / react-hook-form | āļŠāļ–āļēāļ™āļ°āļ‚āļ­āļ‡āļŸāļ­āļĢāđŒāļĄ/input āđƒāļ™ Shadcn | | Auth (āļāļēāļĢāļĒāļ·āļ™āļĒāļąāļ™āļ•āļąāļ§āļ•āļ™) | Guards, JWT | NextAuth / cookies | āļŠāļ–āļēāļ™āļ° UI āļ‚āļ­āļ‡ Auth (loading, signed in) | | Errors (āļ‚āđ‰āļ­āļœāļīāļ”āļžāļĨāļēāļ”) | Global filters | Toasts / modals | Alerts / āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ feedback | | Testing (āļāļēāļĢāļ—āļ”āļŠāļ­āļš) | Jest (unit/e2e) | Vitest / Playwright | Visual regression | | Styles (āļŠāđ„āļ•āļĨāđŒ) | Scoped modules (āļ–āđ‰āļēāļˆāļģāđ€āļ›āđ‡āļ™) | Tailwind / Shadcn | Tailwind utilities | | Accessibility (āļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡) | Guards + filters | ARIA attributes | Semantic HTML | ## 🗂ïļ **8. āļ‚āđ‰āļ­āļ•āļāļĨāļ‡āđ€āļ‰āļžāļēāļ°āļŠāļģāļŦāļĢāļąāļš DMS (LCBP3-DMS)** āļŠāđˆāļ§āļ™āļ™āļĩāđ‰āļ‚āļĒāļēāļĒāđāļ™āļ§āļ—āļēāļ‡ FullStackJS āļ—āļąāđˆāļ§āđ„āļ›āļŠāļģāļŦāļĢāļąāļšāđ‚āļ›āļĢāđ€āļˆāļāļ•āđŒ **LCBP3-DMS** āđ‚āļ”āļĒāļĄāļļāđˆāļ‡āđ€āļ™āđ‰āļ™āđ„āļ›āļ—āļĩāđˆāđ€āļ§āļīāļĢāđŒāļāđ‚āļŸāļĨāļ§āđŒāļāļēāļĢāļ­āļ™āļļāļĄāļąāļ•āļīāđ€āļ­āļāļŠāļēāļĢ (Correspondence, RFA, Drawing, Contract, Transmittal, Circulation) ### ðŸ§ū**8.1 āļĄāļēāļ•āļĢāļāļēāļ™ AuditLog (AuditLog Standard)** āļšāļąāļ™āļ—āļķāļāļāļēāļĢāļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢ CRUD āđāļĨāļ°āļāļēāļĢāļˆāļąāļšāļ„āļđāđˆāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļĨāļ‡āđƒāļ™āļ•āļēāļĢāļēāļ‡ audit_logs | Field (āļŸāļīāļĨāļ”āđŒ) | Type (āļˆāļēāļ SQL) | Description (āļ„āļģāļ­āļ˜āļīāļšāļēāļĒ) | | :------------ | :------------- | :----------------------------------------------- | | audit_id | BIGINT | Primary Key | | user_id | INT | āļœāļđāđ‰āđƒāļŠāđ‰āļ—āļĩāđˆāļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢ (FK -> users) | | action | VARCHAR(100) | rfa.create, correspondence.update, login.success | | entity_type | VARCHAR(50) | āļŠāļ·āđˆāļ­āļ•āļēāļĢāļēāļ‡/āđ‚āļĄāļ”āļđāļĨ āđ€āļŠāđˆāļ™ 'rfa', 'correspondence' | | entity_id | VARCHAR(50) | Primary ID āļ‚āļ­āļ‡āļĢāļ°āđ€āļšāļĩāļĒāļ™āļ—āļĩāđˆāđ„āļ”āđ‰āļĢāļąāļšāļœāļĨāļāļĢāļ°āļ—āļš | | details_json | JSON | āļ‚āđ‰āļ­āļĄāļđāļĨāļšāļĢāļīāļšāļ— (āđ€āļŠāđˆāļ™ āļŸāļīāļĨāļ”āđŒāļ—āļĩāđˆāļĄāļĩāļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡) | | ip_address | VARCHAR(45) | IP address āļ‚āļ­āļ‡āļœāļđāđ‰āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢ | | user_agent | VARCHAR(255) | User Agent āļ‚āļ­āļ‡āļœāļđāđ‰āļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢ | | created_at | TIMESTAMP | Timestamp (UTC) | ### 📂**8.2 āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāđ„āļŸāļĨāđŒ (File Handling)** #### **8.2.1 āļĄāļēāļ•āļĢāļāļēāļ™āļāļēāļĢāļ­āļąāļ›āđ‚āļŦāļĨāļ”āđ„āļŸāļĨāđŒ (File Upload Standard)** - **Security-First Approach:** āļāļēāļĢāļ­āļąāļ›āđ‚āļŦāļĨāļ”āđ„āļŸāļĨāđŒāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļˆāļ°āļ–āļđāļāļˆāļąāļ”āļāļēāļĢāđ‚āļ”āļĒ FileStorageService āļ—āļĩāđˆāļĄāļĩ security measures āļ„āļĢāļšāļ–āđ‰āļ§āļ™ - āđ„āļŸāļĨāđŒāļˆāļ°āļ–āļđāļāđ€āļŠāļ·āđˆāļ­āļĄāđ‚āļĒāļ‡āđ„āļ›āļĒāļąāļ‡ Entity āļ—āļĩāđˆāļ–āļđāļāļ•āđ‰āļ­āļ‡āļœāđˆāļēāļ™ **āļ•āļēāļĢāļēāļ‡āđ€āļŠāļ·āđˆāļ­āļĄ (Junction Tables)** āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™: - correspondence_attachments (āđ€āļŠāļ·āđˆāļ­āļĄ Correspondence āļāļąāļš Attachments) - circulation_attachments (āđ€āļŠāļ·āđˆāļ­āļĄ Circulation āļāļąāļš Attachments) - shop_drawing_revision_attachments (āđ€āļŠāļ·āđˆāļ­āļĄ Shop Drawing Revision āļāļąāļš Attachments) - contract_drawing_attachments (āđ€āļŠāļ·āđˆāļ­āļĄ Contract Drawing āļāļąāļš Attachments) - āđ€āļŠāđ‰āļ™āļ—āļēāļ‡āļˆāļąāļ”āđ€āļāđ‡āļšāđ„āļŸāļĨāđŒ (Upload path): āļ­āđ‰āļēāļ‡āļ­āļīāļ‡āļˆāļēāļ Requirement 2.1 āļ„āļ·āļ­ /share/dms-data [cite: 2.1] āđ‚āļ”āļĒ FileStorageService āļˆāļ°āļŠāļĢāđ‰āļēāļ‡āđ‚āļŸāļĨāđ€āļ”āļ­āļĢāđŒāļĒāđˆāļ­āļĒāđāļšāļšāļĢāļ§āļĄāļĻāļđāļ™āļĒāđŒ (āđ€āļŠāđˆāļ™ /share/dms-data/uploads/{YYYY}/{MM}/[stored_filename]) - āļ›āļĢāļ°āđ€āļ āļ—āđ„āļŸāļĨāđŒāļ—āļĩāđˆāļ­āļ™āļļāļāļēāļ•: pdf, dwg, docx, xlsx, zip (āļœāđˆāļēāļ™ white-list validation) - āļ‚āļ™āļēāļ”āļŠāļđāļ‡āļŠāļļāļ”: **50 MB** - āļˆāļąāļ”āđ€āļāđ‡āļšāļ™āļ­āļ webroot - āđƒāļŦāđ‰āļšāļĢāļīāļāļēāļĢāđ„āļŸāļĨāđŒāļœāđˆāļēāļ™ endpoint āļ—āļĩāđˆāļ›āļĨāļ­āļ”āļ āļąāļĒ /files/:attachment_id/download #### **8.2.2 Security Controls āļŠāļģāļŦāļĢāļąāļš File Access:** āļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āđ„āļŸāļĨāđŒāđ„āļĄāđˆāđƒāļŠāđˆāļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āđ‚āļ”āļĒāļ•āļĢāļ‡ endpoint /files/:attachment_id/download āļˆāļ°āļ•āđ‰āļ­āļ‡: 1. āļ„āđ‰āļ™āļŦāļēāļĢāļ°āđ€āļšāļĩāļĒāļ™ attachment 2. āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ§āđˆāļē attachment_id āļ™āļĩāđ‰ āđ€āļŠāļ·āđˆāļ­āļĄāđ‚āļĒāļ‡āļāļąāļš Entity āđƒāļ” (āđ€āļŠāđˆāļ™ correspondence, circulation, shop_drawing_revision, contract_drawing) āļœāđˆāļēāļ™āļ•āļēāļĢāļēāļ‡āđ€āļŠāļ·āđˆāļ­āļĄ 3. āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ§āđˆāļēāļœāļđāđ‰āđƒāļŠāđ‰āļĄāļĩāļŠāļīāļ—āļ˜āļīāđŒ (permission) āđƒāļ™āļāļēāļĢāļ”āļđ Entity āļ•āđ‰āļ™āļ—āļēāļ‡āļ™āļąāđ‰āļ™āđ† āļŦāļĢāļ·āļ­āđ„āļĄāđˆ 4. āļ•āļĢāļ§āļˆāļŠāļ­āļš download token expiration (24 āļŠāļąāđˆāļ§āđ‚āļĄāļ‡) 5. āļšāļąāļ™āļ—āļķāļ audit log āļāļēāļĢāļ”āļēāļ§āļ™āđŒāđ‚āļŦāļĨāļ” ### 🔟**8.3 āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāđ€āļĨāļ‚āļ—āļĩāđˆāđ€āļ­āļāļŠāļēāļĢ (Document Numbering) [cite: 3.10]** - **āđ€āļ›āđ‰āļēāļŦāļĄāļēāļĒ:** āļŠāļĢāđ‰āļēāļ‡āđ€āļĨāļ‚āļ—āļĩāđˆāđ€āļ­āļāļŠāļēāļĢ (āđ€āļŠāđˆāļ™ correspondence_number) āđ‚āļ”āļĒāļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļī āļ•āļēāļĄāļĢāļđāļ›āđāļšāļšāļ—āļĩāđˆāļāļģāļŦāļ™āļ” - **āļ•āļĢāļĢāļāļ°āļāļēāļĢāļ™āļąāļš:** āļāļēāļĢāļ™āļąāļš Running number (SEQ) āļˆāļ°āļ™āļąāļšāđāļĒāļāļ•āļēāļĄ Key: **Project + Originator Organization + Document Type + Year** - **āļ•āļēāļĢāļēāļ‡ SQL (Updated):** - `document_number_formats`: āđ€āļāđ‡āļš Template String (āđ€āļŠāđˆāļ™ `{CONTRACT}-{TYPE}-{DISCIPLINE}-{SEQ:4}`) - `document_number_counters`: **Primary Key āđ€āļ›āļĨāļĩāđˆāļĒāļ™āđ€āļ›āđ‡āļ™ Composite Key āđƒāļŦāļĄāđˆ:** `(project_id, originator_id, type_id, discipline_id, current_year)` āđ€āļžāļ·āđˆāļ­āļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāļĢāļąāļ™āđ€āļĨāļ‚āđāļĒāļāļ•āļēāļĄāļŠāļēāļ‚āļē - **āļāļēāļĢāļ—āļģāļ‡āļēāļ™:** - Service āļ•āđ‰āļ­āļ‡āļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢ Resolve Token āļžāļīāđ€āļĻāļĐ āđ€āļŠāđˆāļ™ `{SUBTYPE_NUM}` āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āđ„āļ› Join āļāļąāļšāļ•āļēāļĢāļēāļ‡ `correspondence_sub_types` - DocumentNumberingModule āļˆāļ°āđƒāļŦāđ‰āļšāļĢāļīāļāļēāļĢ DocumentNumberingService - āđ€āļĄāļ·āđˆāļ­ CorrespondenceModule āļ•āđ‰āļ­āļ‡āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ€āļ­āļāļŠāļēāļĢāđƒāļŦāļĄāđˆ, āļĄāļąāļ™āļˆāļ°āđ€āļĢāļĩāļĒāļ documentNumberingService.generateNextNumber(...) - Service āļ™āļĩāđ‰āļˆāļ°āđƒāļŠāđ‰ **Redis distributed locking** āđāļ—āļ™ stored procedure āļ‹āļķāđˆāļ‡āļˆāļ°āļˆāļąāļ”āļāļēāļĢ Database Transaction āđāļĨāļ° Row Locking āļ āļēāļĒāđƒāļ™ Application Layer āđ€āļžāļ·āđˆāļ­āļĢāļąāļšāļ›āļĢāļ°āļāļąāļ™āļāļēāļĢāļ›āđ‰āļ­āļ‡āļāļąāļ™ Race Condition - āļĄāļĩ retry mechanism āđāļĨāļ° fallback strategies ### 📊**8.4 āļāļēāļĢāļĢāļēāļĒāļ‡āļēāļ™āđāļĨāļ°āļāļēāļĢāļŠāđˆāļ‡āļ­āļ­āļ (Reporting & Exports)** #### **8.4.1 āļ§āļīāļ§āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļĢāļēāļĒāļ‡āļēāļ™ (Reporting Views) (āļˆāļēāļ SQL)** āļāļēāļĢāļĢāļēāļĒāļ‡āļēāļ™āļ„āļ§āļĢāļŠāļĢāđ‰āļēāļ‡āļ‚āļķāđ‰āļ™āļˆāļēāļ Views āļ—āļĩāđˆāļāļģāļŦāļ™āļ”āđ„āļ§āđ‰āļĨāđˆāļ§āļ‡āļŦāļ™āđ‰āļēāđƒāļ™āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļ›āđ‡āļ™āļŦāļĨāļąāļ: - v_current_correspondences: āļŠāļģāļŦāļĢāļąāļš revision āļ›āļąāļˆāļˆāļļāļšāļąāļ™āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ‚āļ­āļ‡āđ€āļ­āļāļŠāļēāļĢāļ—āļĩāđˆāđ„āļĄāđˆāđƒāļŠāđˆ RFA - v_current_rfas: āļŠāļģāļŦāļĢāļąāļš revision āļ›āļąāļˆāļˆāļļāļšāļąāļ™āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ‚āļ­āļ‡ RFA āđāļĨāļ°āļ‚āđ‰āļ­āļĄāļđāļĨ master - v_contract_parties_all: āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāļ„āļ§āļēāļĄāļŠāļąāļĄāļžāļąāļ™āļ˜āđŒāļ‚āļ­āļ‡ project/contract/organization - v_user_tasks: āļŠāļģāļŦāļĢāļąāļš Dashboard "āļ‡āļēāļ™āļ‚āļ­āļ‡āļ‰āļąāļ™" - v_audit_log_details: āļŠāļģāļŦāļĢāļąāļš Activity Feed Views āđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰āļ—āļģāļŦāļ™āđ‰āļēāļ—āļĩāđˆāđ€āļ›āđ‡āļ™āđāļŦāļĨāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļŦāļĨāļąāļāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļĢāļēāļĒāļ‡āļēāļ™āļāļąāđˆāļ‡āđ€āļ‹āļīāļĢāđŒāļŸāđ€āļ§āļ­āļĢāđŒāđāļĨāļ°āļāļēāļĢāļŠāđˆāļ‡āļ­āļ­āļāļ‚āđ‰āļ­āļĄāļđāļĨ #### **8.4.2 āļāļŽāļāļēāļĢāļŠāđˆāļ‡āļ­āļ­āļ (Export Rules)** - Export formats: CSV, Excel, PDF. - āļˆāļąāļ”āđ€āļ•āļĢāļĩāļĒāļĄāļĄāļļāļĄāļĄāļ­āļ‡āļŠāļģāļŦāļĢāļąāļšāļžāļīāļĄāļžāđŒ (Print view). - āļĢāļ§āļĄāļĨāļīāļ‡āļāđŒāđ„āļ›āļĒāļąāļ‡āļ•āđ‰āļ™āļ—āļēāļ‡ (āđ€āļŠāđˆāļ™ /rfas/:id). ## ðŸ§Ū **9. āļŸāļĢāļ­āļ™āļ•āđŒāđ€āļ­āļ™āļ”āđŒ: āļĢāļđāļ›āđāļšāļš DataTable āđāļĨāļ°āļŸāļ­āļĢāđŒāļĄ (Frontend: DataTable & Form Patterns)** ### **9.1 DataTable (Server‑Side)** - Endpoint: /api/{module}?page=1&pageSize=20&sort=...&filter=... - āļ•āđ‰āļ­āļ‡āļĢāļ­āļ‡āļĢāļąāļš: āļāļēāļĢāđāļšāđˆāļ‡āļŦāļ™āđ‰āļē (pagination), āļāļēāļĢāđ€āļĢāļĩāļĒāļ‡āļĨāļģāļ”āļąāļš (sorting), āļāļēāļĢāļ„āđ‰āļ™āļŦāļē (search), āļāļēāļĢāļāļĢāļ­āļ‡ (filters) - āđāļŠāļ”āļ‡ revision āļĨāđˆāļēāļŠāļļāļ”āđāļšāļš inline āđ€āļŠāļĄāļ­ (āļŠāļģāļŦāļĢāļąāļš RFA/Drawing) ### **9.2 āļĄāļēāļ•āļĢāļāļēāļ™āļŸāļ­āļĢāđŒāļĄ (Form Standards)** - āđƒāļŠāđ‰ **React Hook Form** āđ€āļ›āđ‡āļ™āļĄāļēāļ•āļĢāļāļēāļ™āļŠāļģāļŦāļĢāļąāļšāļŸāļ­āļĢāđŒāļĄāļ—āļąāđ‰āļ‡āļŦāļĄāļ” - āđƒāļŠāđ‰ **Zod** āļŠāļģāļŦāļĢāļąāļš schema validation āļ—āļąāđ‰āļ‡āļāļąāđˆāļ‡ client āđāļĨāļ° server - āļ•āđ‰āļ­āļ‡āļĄāļĩāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ Dropdowns āđāļšāļšāļ‚āļķāđ‰āļ™āļ•āđˆāļ­āļāļąāļ™ (Dependent dropdowns) (āļ•āļēāļĄāļ—āļĩāđˆāļŠāļ„āļĩāļĄāļēāļĢāļ­āļ‡āļĢāļąāļš) āļ”āđ‰āļ§āļĒ React Query āļŠāļģāļŦāļĢāļąāļš data fetching āđāļĨāļ° React Hook Form āļŠāļģāļŦāļĢāļąāļš state management: - Project → Contract Drawing Volumes - Contract Drawing Category → Sub-Category - RFA (āļ›āļĢāļ°āđ€āļ āļ— Shop Drawing) → Shop Drawing Revisions āļ—āļĩāđˆāđ€āļŠāļ·āđˆāļ­āļĄāđ‚āļĒāļ‡āđ„āļ”āđ‰ - **File Upload Security:** āļ•āđ‰āļ­āļ‡āļĢāļ­āļ‡āļĢāļąāļš **Multi-file upload (Drag-and-Drop)** āļ”āđ‰āļ§āļĒ React Hook Form integration [cite: 5.7] āļžāļĢāđ‰āļ­āļĄ virus scanning feedback - **File Type Indicators:** UI āļ•āđ‰āļ­āļ‡āļ­āļ™āļļāļāļēāļ•āđƒāļŦāđ‰āļœāļđāđ‰āđƒāļŠāđ‰āļāļģāļŦāļ™āļ”āļ§āđˆāļēāđ„āļŸāļĨāđŒāđƒāļ”āđ€āļ›āđ‡āļ™ **"āđ€āļ­āļāļŠāļēāļĢāļŦāļĨāļąāļ"** āļŦāļĢāļ·āļ­ "āđ€āļ­āļāļŠāļēāļĢāđāļ™āļšāļ›āļĢāļ°āļāļ­āļš" [cite: 5.7] āļžāļĢāđ‰āļ­āļĄāđāļŠāļ”āļ‡ file type icons - **Security Feedback:** āđāļŠāļ”āļ‡ security warnings āļŠāļģāļŦāļĢāļąāļš file types āļ—āļĩāđˆāđ€āļŠāļĩāđˆāļĒāļ‡āļŦāļĢāļ·āļ­ files āļ—āļĩāđˆ fail virus scan - āļŠāđˆāļ‡ (Submit) āļœāđˆāļēāļ™ API āļžāļĢāđ‰āļ­āļĄ feedback āđāļšāļš toast ### **9.3 āļ‚āđ‰āļ­āļāļģāļŦāļ™āļ” Component āđ€āļ‰āļžāļēāļ° (Specific UI Requirements)** - **Dashboard - My Tasks:** āļ•āđ‰āļ­āļ‡āļžāļąāļ’āļ™āļē Component āļ•āļēāļĢāļēāļ‡ "āļ‡āļēāļ™āļ‚āļ­āļ‡āļ‰āļąāļ™" (My Tasks)āļ‹āļķāđˆāļ‡āļ”āļķāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ‡āļēāļ™āļ—āļĩāđˆāļœāļđāđ‰āđƒāļŠāđ‰āļĨāđ‡āļ­āļāļ­āļīāļ™āļ­āļĒāļđāđˆāļ•āđ‰āļ­āļ‡āļĢāļąāļšāļœāļīāļ”āļŠāļ­āļš (Main/Action) āļˆāļēāļ v_user_tasks [cite: 5.3] - **Workflow Visualization:** āļ•āđ‰āļ­āļ‡āļžāļąāļ’āļ™āļē Component āļŠāļģāļŦāļĢāļąāļšāđāļŠāļ”āļ‡āļœāļĨ Workflow (āđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ° RFA)āļ—āļĩāđˆāđāļŠāļ”āļ‡āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđ€āļ›āđ‡āļ™āļĨāļģāļ”āļąāļš āđ‚āļ”āļĒāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ›āļąāļˆāļˆāļļāļšāļąāļ™ (active) āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™āļ—āļĩāđˆāļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāđ„āļ”āđ‰ āđāļĨāļ°āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļ­āļ·āđˆāļ™āđ€āļ›āđ‡āļ™ disabled [cite: 5.6] āļ•āđ‰āļ­āļ‡āļĄāļĩāļ•āļĢāļĢāļāļ°āļŠāļģāļŦāļĢāļąāļš Admin āđƒāļ™āļāļēāļĢ override āļŦāļĢāļ·āļ­āļĒāđ‰āļ­āļ™āļāļĨāļąāļšāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āđ„āļ”āđ‰ [cite: 5.6] - **Admin Panel:** āļ•āđ‰āļ­āļ‡āļĄāļĩāļŦāļ™āđ‰āļē UI āļŠāļģāļŦāļĢāļąāļš Superadmin/Admin āđ€āļžāļ·āđˆāļ­āļˆāļąāļ”āļāļēāļĢāļ‚āđ‰āļ­āļĄāļđāļĨāļŦāļĨāļąāļ (Master Data [cite: 4.5]), āļāļēāļĢāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āđƒāļŠāđ‰āļ‡āļēāļ™ (Onboarding [cite: 4.6]), āđāļĨāļ° **āļĢāļđāļ›āđāļšāļšāđ€āļĨāļ‚āļ—āļĩāđˆāđ€āļ­āļāļŠāļēāļĢ (Numbering Formats [cite: 3.10])** - **Security Dashboard:** āđāļŠāļ”āļ‡ security metrics āđāļĨāļ° audit logs āļŠāļģāļŦāļĢāļąāļš administrators ## 🧭 **10. āđāļ”āļŠāļšāļ­āļĢāđŒāļ”āđāļĨāļ°āļŸāļĩāļ”āļāļīāļˆāļāļĢāļĢāļĄ (Dashboard & Activity Feed)** ### **10.1 āļāļēāļĢāđŒāļ”āļšāļ™āđāļ”āļŠāļšāļ­āļĢāđŒāļ” (Dashboard Cards)** - āđāļŠāļ”āļ‡ Correspondences, RFAs, Circulations, Shop Drawing Revision āļĨāđˆāļēāļŠāļļāļ” - āļĢāļ§āļĄāļŠāļĢāļļāļ› KPI (āđ€āļŠāđˆāļ™ "RFAs āļ—āļĩāđˆāļĢāļ­āļāļēāļĢāļ­āļ™āļļāļĄāļąāļ•āļī", "Shop Drawing āļ—āļĩāđˆāļĢāļ­āļāļēāļĢāļ­āļ™āļļāļĄāļąāļ•āļī") [cite: 5.3] - āļĢāļ§āļĄāļĨāļīāļ‡āļāđŒāļ”āđˆāļ§āļ™āđ„āļ›āļĒāļąāļ‡āđ‚āļĄāļ”āļđāļĨāļ•āđˆāļēāļ‡āđ† - **Security Metrics:** āđāļŠāļ”āļ‡āļˆāļģāļ™āļ§āļ™ files scanned, security incidents, failed login attempts ### **10.2 āļŸāļĩāļ”āļāļīāļˆāļāļĢāļĢāļĄ (Activity Feed)** - āđāļŠāļ”āļ‡āļĢāļēāļĒāļāļēāļĢ v_audit_log_details āļĨāđˆāļēāļŠāļļāļ” (10 āļĢāļēāļĒāļāļēāļĢ) āļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡āļāļąāļšāļœāļđāđ‰āđƒāļŠāđ‰ - āļĢāļ§āļĄ security-related activities (failed logins, permission changes) ```typescript // āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡ API response [ { user: 'editor01', action: 'Updated RFA (LCBP3-RFA-001)', time: '2025-11-04T09:30Z', }, { user: 'system', action: 'Virus scan completed - 0 threats found', time: '2025-11-04T09:25Z', }, ]; ``` ## ðŸ›Ąïļ **11. āļ‚āđ‰āļ­āļāļģāļŦāļ™āļ”āļ—āļĩāđˆāđ„āļĄāđˆāđƒāļŠāđˆāļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™ (Non-Functional Requirements)** āļŠāđˆāļ§āļ™āļ™āļĩāđ‰āļŠāļĢāļļāļ›āļ‚āđ‰āļ­āļāļģāļŦāļ™āļ” Non-Functional āļˆāļēāļ requirements.md āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļ—āļĩāļĄāļžāļąāļ’āļ™āļēāļ—āļēāļ™ - **Audit Log [cite: 6.1]:** āļ—āļļāļāļāļēāļĢāļāļĢāļ°āļ—āļģāļ—āļĩāđˆāļŠāļģāļ„āļąāļ (C/U/D) āļ•āđ‰āļ­āļ‡āļ–āļđāļāļšāļąāļ™āļ—āļķāļāđƒāļ™ audit_logs - **Performance [cite: 6.4]:** āļ•āđ‰āļ­āļ‡āđƒāļŠāđ‰ Caching āļŠāļģāļŦāļĢāļąāļšāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāļšāđˆāļ­āļĒ āđāļĨāļ°āđƒāļŠāđ‰ Pagination - **Security [cite: 6.5]:** āļ•āđ‰āļ­āļ‡āļĄāļĩ Rate Limiting āđāļĨāļ°āļˆāļąāļ”āļāļēāļĢ Secret āļœāđˆāļēāļ™ docker-compose.yml (āđ„āļĄāđˆāđƒāļŠāđˆ .env) - **File Security [cite: 3.9.6]:** āļ•āđ‰āļ­āļ‡āļĄāļĩ virus scanning, file type validation, access controls - **Resilience [cite: 6.5.3]:** āļ•āđ‰āļ­āļ‡āļĄāļĩ circuit breaker, retry mechanisms, graceful degradation - **Backup & Recovery [cite: 6.6]:** āļ•āđ‰āļ­āļ‡āļĄāļĩāđāļœāļ™āļŠāļģāļĢāļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļąāđ‰āļ‡ Database (MariaDB) āđāļĨāļ° File Storage (/share/dms-data) āļ­āļĒāđˆāļēāļ‡āļ™āđ‰āļ­āļĒāļ§āļąāļ™āļĨāļ° 1 āļ„āļĢāļąāđ‰āļ‡ - **Notification Strategy [cite: 6.7]:** āļĢāļ°āļšāļšāđāļˆāđ‰āļ‡āđ€āļ•āļ·āļ­āļ™ (Email/Line) āļ•āđ‰āļ­āļ‡āļ–āļđāļ Trigger āđ€āļĄāļ·āđˆāļ­āļĄāļĩāđ€āļ­āļāļŠāļēāļĢāđƒāļŦāļĄāđˆāļŠāđˆāļ‡āļ–āļķāļ‡, āļĄāļĩāļāļēāļĢāļĄāļ­āļšāļŦāļĄāļēāļĒāļ‡āļēāļ™āđƒāļŦāļĄāđˆ (Circulation), āļŦāļĢāļ·āļ­ (āļ—āļēāļ‡āđ€āļĨāļ·āļ­āļ) āđ€āļĄāļ·āđˆāļ­āļ‡āļēāļ™āđ€āļŠāļĢāđ‡āļˆ/āđƒāļāļĨāđ‰āļ–āļķāļ‡āļāļģāļŦāļ™āļ” - **Monitoring [cite: 6.8]:** āļ•āđ‰āļ­āļ‡āļĄāļĩ health checks, metrics collection, alerting ## ✅ **12. āļĄāļēāļ•āļĢāļāļēāļ™āļ—āļĩāđˆāļ™āļģāđ„āļ›āđƒāļŠāđ‰āđāļĨāđ‰āļ§ (āļˆāļēāļ SQL v1.4.0) (Implemented Standards (from SQL v1.4.0))** āļŠāđˆāļ§āļ™āļ™āļĩāđ‰āļĒāļ·āļ™āļĒāļąāļ™āļ§āđˆāļēāđāļ™āļ§āļ—āļēāļ‡āļ›āļāļīāļšāļąāļ•āļīāļ—āļĩāđˆāļ”āļĩāļ—āļĩāđˆāļŠāļļāļ”āļ•āđˆāļ­āđ„āļ›āļ™āļĩāđ‰āđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļŦāļ™āļķāđˆāļ‡āļ‚āļ­āļ‡āļāļēāļĢāļ­āļ­āļāđāļšāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ­āļĒāļđāđˆāđāļĨāđ‰āļ§ āđāļĨāļ°āļ„āļ§āļĢāļ–āļđāļāļ™āļģāđ„āļ›āđƒāļŠāđ‰āļ›āļĢāļ°āđ‚āļĒāļŠāļ™āđŒ āđ„āļĄāđˆāđƒāļŠāđˆāļŠāļĢāđ‰āļēāļ‡āļ‚āļķāđ‰āļ™āđƒāļŦāļĄāđˆ - ✅ **Soft Delete:** āļ™āļģāđ„āļ›āđƒāļŠāđ‰āđāļĨāđ‰āļ§āļœāđˆāļēāļ™āļ„āļ­āļĨāļąāļĄāļ™āđŒ deleted_at āđƒāļ™āļ•āļēāļĢāļēāļ‡āļŠāļģāļ„āļąāļ (āđ€āļŠāđˆāļ™ correspondences, rfas, project_parties) āļ•āļĢāļĢāļāļ°āļāļēāļĢāļ”āļķāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļ•āđ‰āļ­āļ‡āļāļĢāļ­āļ‡ deleted_at IS NULL - ✅ **Database Indexes:** āļŠāļ„āļĩāļĄāļēāđ„āļ”āđ‰āļĄāļĩāļāļēāļĢāļ—āļģ index āđ„āļ§āđ‰āļ­āļĒāđˆāļēāļ‡āļŦāļ™āļąāļāļŦāļ™āđˆāļ§āļ‡āļšāļ™ foreign keys āđāļĨāļ°āļ„āļ­āļĨāļąāļĄāļ™āđŒāļ—āļĩāđˆāđƒāļŠāđ‰āļ„āđ‰āļ™āļŦāļēāļšāđˆāļ­āļĒ (āđ€āļŠāđˆāļ™ idx_rr_rfa, idx_cor_project, idx_cr_is_current) āđ€āļžāļ·āđˆāļ­āļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļž - ✅ **āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡ RBAC:** āļĄāļĩāļĢāļ°āļšāļš users, roles, permissions, user_roles, āđāļĨāļ° user_project_roles āļ—āļĩāđˆāļ„āļĢāļ­āļšāļ„āļĨāļļāļĄāļ­āļĒāļđāđˆāđāļĨāđ‰āļ§ - ✅ **Data Seeding:** āļ‚āđ‰āļ­āļĄāļđāļĨ Master (roles, permissions, organization_roles, initial users, project parties) āļ–āļđāļāļĢāļ§āļĄāļ­āļĒāļđāđˆāđƒāļ™āļŠāļ„āļĢāļīāļ›āļ•āđŒāļŠāļ„āļĩāļĄāļēāđāļĨāđ‰āļ§ - ✅ **Application-level Locking:** āđƒāļŠāđ‰ Redis distributed lock āđāļ—āļ™ stored procedure - ✅ **File Security:** Virus scanning, file type validation, access control - ✅ **Resilience Patterns:** Circuit breaker, retry, fallback mechanisms - ✅ **Security Measures:** Input validation, rate limiting, security headers - ✅ **Monitoring:** Health checks, metrics collection, distributed tracing ## ðŸ§Đ **13. āļāļēāļĢāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āļ—āļĩāđˆāđāļ™āļ°āļ™āļģ (āļŠāļģāļŦāļĢāļąāļšāļ­āļ™āļēāļ„āļ•) (Recommended Enhancements (Future))** - ✅ āļŠāļĢāđ‰āļēāļ‡ Background job (āđ‚āļ”āļĒāđƒāļŠāđ‰ **n8n** āđ€āļžāļ·āđˆāļ­āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļš **Line** [cite: 2.7] āđāļĨāļ°/āļŦāļĢāļ·āļ­āđƒāļŠāđ‰āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāđāļˆāđ‰āļ‡āđ€āļ•āļ·āļ­āļ™ RFA āļ—āļĩāđˆāđƒāļāļĨāđ‰āļ–āļķāļ‡āļāļģāļŦāļ™āļ” due_date [cite: 6.7]) - ✅ āđ€āļžāļīāđˆāļĄ job āļĨāđ‰āļēāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļ›āđ‡āļ™āļĢāļ°āļĒāļ°āļŠāļģāļŦāļĢāļąāļš attachments āļ—āļĩāđˆāđ„āļĄāđˆāļ–āļđāļāđ€āļŠāļ·āđˆāļ­āļĄāđ‚āļĒāļ‡āļāļąāļš Entity āđƒāļ”āđ† āđ€āļĨāļĒ (āđ„āļŸāļĨāđŒāļāļģāļžāļĢāđ‰āļē) - 🔄 **AI-Powered Document Classification:** āđƒāļŠāđ‰ machine learning āļŠāļģāļŦāļĢāļąāļš automatic document categorization - 🔄 **Advanced Analytics:** Predictive analytics āļŠāļģāļŦāļĢāļąāļš workflow optimization - 🔄 **Mobile App:** Native mobile application āļŠāļģāļŦāļĢāļąāļš field workers - 🔄 **Blockchain Integration:** āļŠāļģāļŦāļĢāļąāļš document integrity verification āļ—āļĩāđˆāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒāļŠāļđāļ‡āļŠāļļāļ” ## ✅ **14. Summary Checklist for Developers** āļāđˆāļ­āļ™āļŠāđˆāļ‡ PR (Pull Request) āļ™āļąāļāļžāļąāļ’āļ™āļēāļ•āđ‰āļ­āļ‡āļ•āļĢāļ§āļˆāļŠāļ­āļšāļŦāļąāļ§āļ‚āđ‰āļ­āļ•āđˆāļ­āđ„āļ›āļ™āļĩāđ‰: - [ ] **Security:** āđ„āļĄāđˆāļĄāļĩ Secrets āđƒāļ™ Code, āđƒāļŠāđ‰ `docker-compose.override.yml` āđāļĨāđ‰āļ§ - [ ] **Concurrency:** āđƒāļŠāđ‰ Optimistic Lock āđƒāļ™ Entity āļ—āļĩāđˆāđ€āļŠāļĩāđˆāļĒāļ‡ Race Condition āđāļĨāđ‰āļ§ - [ ] **Idempotency:** API āļĢāļ­āļ‡āļĢāļąāļš Idempotency Key āđāļĨāđ‰āļ§ - [ ] **File Upload:** āđƒāļŠāđ‰ Flow Two-Phase (Temp -> Perm) āđāļĨāđ‰āļ§ - [ ] **Mobile:** āļŦāļ™āđ‰āļēāļˆāļ­āđāļŠāļ”āļ‡āļœāļĨāđāļšāļš Card View āļšāļ™āļĄāļ·āļ­āļ–āļ·āļ­āđ„āļ”āđ‰āļ–āļđāļāļ•āđ‰āļ­āļ‡ - [ ] **Performance:** āļŠāļĢāđ‰āļēāļ‡ Index āļŠāļģāļŦāļĢāļąāļš JSON Virtual Columns āđāļĨāđ‰āļ§ (āļ–āđ‰āļēāļĄāļĩ), āđƒāļŠāđ‰ useMemo/useCallback āļ—āļĩāđˆāđ€āļŦāļĄāļēāļ°āļŠāļĄ - [ ] **No Over-engineering:** āđ„āļĄāđˆāđƒāļŠāđ‰ state management libraries āđ€āļāļīāļ™āļ„āļ§āļēāļĄāļˆāļģāđ€āļ›āđ‡āļ™ - [ ] **State Management:** āđƒāļŠāđ‰ React Query āļŠāļģāļŦāļĢāļąāļš server state, React Hook Form āļŠāļģāļŦāļĢāļąāļš forms - [ ] **Error Handling:** āļĄāļĩ error boundaries āđāļĨāļ° proper error states - [ ] **Type Safety:** āļĄāļĩ proper TypeScript types āļŠāļģāļŦāļĢāļąāļšāļ—āļąāđ‰āļ‡āļŦāļĄāļ” state --- ## 📋 **15. Summary of Key Changes from Previous Version** ### **Security Enhancements:** 1. **File Upload Security** - Virus scanning, file type validation, access controls 2. **Input Validation** - OWASP Top 10 protection, XSS/CSRF prevention 3. **Rate Limiting** - Comprehensive rate limiting strategy 4. **Secrets Management** - Secure handling of sensitive configuration ### **Architecture Improvements:** 1. **Document Numbering** - Changed from Stored Procedure to Application-level Locking 2. **Resilience Patterns** - Circuit breaker, retry mechanisms, fallback strategies 3. **Monitoring & Observability** - Health checks, metrics, distributed tracing 4. **Caching Strategy** - Comprehensive caching with proper invalidation ### **Performance Targets :** 1. **API Response Time** - < 200ms (90th percentile) 2. **Search Performance** - < 500ms 3. **File Upload** - < 30 seconds for 50MB files 4. **Cache Hit Ratio** - > 80% ### **Operational Excellence:** 1. **Disaster Recovery** - RTO < 4 hours, RPO < 1 hour 2. **Backup Procedures** - Comprehensive backup and restoration 3. **Security Testing** - Penetration testing and security audits 4. **Performance Testing** - Load testing with realistic workloads āđ€āļ­āļāļŠāļēāļĢāļ™āļĩāđ‰āļŠāļ°āļ—āđ‰āļ­āļ™āļ–āļķāļ‡āļ„āļ§āļēāļĄāļĄāļļāđˆāļ‡āļĄāļąāđˆāļ™āđƒāļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āļĢāļ°āļšāļšāļ—āļĩāđˆāļĄāļĩāļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒ, āļĄāļĩāļ„āļ§āļēāļĄāļ—āļ™āļ—āļēāļ™, āđāļĨāļ°āļĄāļĩāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļŠāļđāļ‡ āļžāļĢāđ‰āļ­āļĄāļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāđ€āļ•āļīāļšāđ‚āļ•āđƒāļ™āļ­āļ™āļēāļ„āļ•āđāļĨāļ°āļ„āļ§āļēāļĄāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ—āļēāļ‡āļ˜āļļāļĢāļāļīāļˆāļ—āļĩāđˆāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āđ„āļ› **āļŦāļĄāļēāļĒāđ€āļŦāļ•āļļ:** āđāļ™āļ§āļ—āļēāļ‡āļ™āļĩāđ‰āļˆāļ°āļ–āļđāļāļ—āļšāļ—āļ§āļ™āđāļĨāļ°āļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āđ€āļ›āđ‡āļ™āļĢāļ°āļĒāļ°āļ•āļēāļĄ feedback āļˆāļēāļāļ—āļĩāļĄāļžāļąāļ’āļ™āļēāđāļĨāļ°āļ„āļ§āļēāļĄāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ—āļēāļ‡āļ˜āļļāļĢāļāļīāļˆāļ—āļĩāđˆāđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āđ„āļ› ## **Document Control:** - **Document:** FullStackJS v1.4.5 - **Version:** 1.4 - **Date:** 2025-11-29 - **Author:** NAP LCBP3-DMS & Gemini - **Status:** FINAL-Rev.05 - **Classification:** Internal Technical Documentation - **Approved By:** Nattanin --- `End of FullStackJS Guidelines v1.4.5`