🏛ïļ System Architecture Design (āļāļēāļĢāļ­āļ­āļāđāļšāļšāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļĢāļ°āļšāļš)


ðŸ‡đ🇭 āļ āļēāļĐāļēāđ„āļ—āļĒ (For User)

📌 1. āļŦāļĨāļąāļāļāļēāļĢāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļŠāļ°āļ­āļēāļ” (Clean Architecture Principles)

SplitDee āđƒāļŠāđ‰āļŦāļĨāļąāļāļāļēāļĢ Clean Architecture āļ—āļąāđ‰āļ‡āđƒāļ™āļāļąāđˆāļ‡āļĢāļ°āļšāļšāļŦāļĨāļąāļ‡āļšāđ‰āļēāļ™ (FastAPI) āđāļĨāļ°āļĢāļ°āļšāļšāļŠāđˆāļ§āļ™āļŦāļ™āđ‰āļē (Flutter) āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđāļ™āđˆāđƒāļˆāļ§āđˆāļēāļ•āļĢāļĢāļāļ°āļ—āļēāļ‡āļ˜āļļāļĢāļāļīāļˆāļŦāļĨāļąāļ (Business Logic) āļˆāļ°āđ„āļĄāđˆāļ‚āļķāđ‰āļ™āļāļąāļšāđ„āļĨāļšāļĢāļēāļĢāļĩāļ āļēāļĒāļ™āļ­āļ āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ āļŦāļĢāļ·āļ­āđ€āļŸāļĢāļĄāđ€āļ§āļīāļĢāđŒāļāļ‚āļ­āļ‡āļŠāđˆāļ§āļ™āđāļŠāļ”āļ‡āļœāļĨ āļ—āļģāđƒāļŦāđ‰āļāļēāļĢāļ­āļąāļ›āđ€āļāļĢāļ”āļĢāļ°āļšāļš āļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ āđāļĨāļ°āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļŠāļļāļ”āļ—āļ”āļŠāļ­āļš (Unit Test) āļ—āļģāđ„āļ”āđ‰āļ‡āđˆāļēāļĒāđāļĨāļ°āđ€āļŠāļ–āļĩāļĒāļĢ

+-----------------------------------------------------------+
| Presentation / UI (FastAPI Routers / Flutter Widgets)     |
|       ↓                                                   |
| Use Cases / Application Rules (Business Logic Flows)      |
|       ↓                                                   |
| Domain / Core Business Entities (Entities & Interfaces)   |
+-----------------------------------------------------------+
*āļ—āļīāļĻāļ—āļēāļ‡āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­ (Dependency Arrow) āļ•āđ‰āļ­āļ‡āļŠāļĩāđ‰āđ€āļ‚āđ‰āļēāļŠāļđāđˆāļĻāļđāļ™āļĒāđŒāļāļĨāļēāļ‡ (Domain) āđ€āļŠāļĄāļ­*

🐍 2. āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļŦāļĨāļąāļ‡āļšāđ‰āļēāļ™ (Backend - FastAPI)

āļĢāļ°āļšāļšāļŦāļĨāļąāļ‡āļšāđ‰āļēāļ™āđāļšāđˆāļ‡āļĢāļŦāļąāļŠāļ­āļ­āļāđ€āļ›āđ‡āļ™ 4 āļŠāļąāđ‰āļ™āļŦāļĨāļąāļ:

  1. Domain Layer (āļŠāļąāđ‰āļ™āđāļāļ™āļāļĨāļēāļ‡): āļ›āļĢāļ°āļāļ­āļšāļ”āđ‰āļ§āļĒ Entities āļŦāļĨāļąāļ (āđ€āļŠāđˆāļ™ āļœāļđāđ‰āđƒāļŠāđ‰, āļšāļīāļĨ, āļŠāļąāļ•āļ§āđŒāđ€āļĨāļĩāđ‰āļĒāļ‡) āđāļĨāļ° Interfaces (āļĢāļ°āļšāļļāļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđāļ•āđˆāļĒāļąāļ‡āđ„āļĄāđˆāļĢāļ°āļšāļļāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļˆāļĢāļīāļ‡) āļŦāđ‰āļēāļĄāļ™āļģāđ€āļ‚āđ‰āļē (import) āđāļžāđ‡āļāđ€āļāļˆāļ‚āļ­āļ‡āļ āļēāļĒāļ™āļ­āļāđƒāļ™āļŠāļąāđ‰āļ™āļ™āļĩāđ‰
  2. Use Cases Layer (āļŠāļąāđ‰āļ™āļ•āļĢāļĢāļāļ°āļ—āļēāļ‡āļ˜āļļāļĢāļāļīāļˆ): āļ„āļ§āļšāļ„āļļāļĄāļāļēāļĢāđ„āļŦāļĨāļ‚āļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ āđ€āļŠāđˆāļ™ āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāđāļšāđˆāļ‡āļšāļīāļĨāđ€āļ‡āļīāļ™, āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļŠāļąāđˆāļ‡āļˆāđˆāļēāļĒ, āļāļēāļĢāļ„āļģāļ™āļ§āļ“āļāļēāļĢāđ€āļ•āļīāļšāđ‚āļ•āļ‚āļ­āļ‡āļŠāļąāļ•āļ§āđŒāđ€āļĨāļĩāđ‰āļĒāļ‡
  3. Infrastructure Layer (āļŠāļąāđ‰āļ™āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļžāļ·āđ‰āļ™āļāļēāļ™): āļˆāļąāļ”āļāļēāļĢāļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļĢāļīāļ‡ (PostgreSQL/SQLAlchemy Repository), āļāļēāļĢāđ€āļ‚āđ‰āļēāļĢāļŦāļąāļŠāļœāđˆāļēāļ™ (JWT), āļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨ AI āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ āļēāļžāļŠāļĨāļīāļ› āđāļĨāļ°āļĢāļ°āļšāļšāļŠāđˆāļ‡āđ€āļĄāļĨ/āđāļˆāđ‰āļ‡āđ€āļ•āļ·āļ­āļ™
  4. Presentation Layer (āļŠāļąāđ‰āļ™āļ•āļīāļ”āļ•āđˆāļ­āļœāļđāđ‰āđƒāļŠāđ‰): āļĢāļąāļšāļ„āļģāļ‚āļ­ HTTP āļœāđˆāļēāļ™ FastAPI API Routers, āđāļ›āļĨāļ‡āļ„āļĨāļēāļŠāļ”āđ‰āļ§āļĒ Pydantic (Schemas) āđāļĨāļ°āļŠāđˆāļ‡āļ„āļ·āļ™āļœāļĨāļĨāļąāļžāļ˜āđŒāđ€āļ›āđ‡āļ™ JSON

ðŸĶ 3. āļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāļŦāļ™āđ‰āļēāļšāđ‰āļēāļ™ (Frontend - Flutter)

āļĢāļ°āļšāļšāļŦāļ™āđ‰āļēāļšāđ‰āļēāļ™āđāļšāđˆāļ‡āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āđ€āļ›āđ‡āļ™ 3 āļŠāļąāđ‰āļ™:

  1. Domain Layer: āļ™āļīāļĒāļēāļĄ Entity āļ‚āļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđāļ­āļ› āđāļĨāļ° Usecases āđƒāļ™āļŦāļ™āđ‰āļēāļˆāļ­ āļĢāļ§āļĄāļ—āļąāđ‰āļ‡ abstract repository
  2. Data Layer: āļˆāļąāļ”āļāļēāļĢāļāļēāļĢāļĢāđ‰āļ­āļ‡āļ‚āļ­ API āļœāđˆāļēāļ™ HTTP Client, āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ JSON (Models) āđāļĨāļ°āļāļēāļĢāļšāļąāļ™āļ—āļķāļāļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡ (Secure Storage)
  3. Presentation Layer: āļŠāđˆāļ§āļ™āļ§āļēāļ”āļŦāļ™āđ‰āļēāļˆāļ­ (Pages/Widgets) āđāļĨāļ°āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļŠāļ–āļēāļ™āļ°āļŦāļ™āđ‰āļēāļˆāļ­ (State Management) āđ‚āļ”āļĒāđ€āļĨāļ·āļ­āļāđƒāļŠāđ‰ Riverpod āđ€āļžāļ·āđˆāļ­āļˆāļąāļ”āļāļēāļĢāļŠāļ āļēāļ§āļ°āļŦāļ™āđ‰āļēāļˆāļ­āđāļĨāļ°āļāļēāļĢāđāļˆāđ‰āļ‡āđ€āļ•āļ·āļ­āļ™

🔄 4. āđāļœāļ™āļœāļąāļ‡āļāļēāļĢāđ„āļŦāļĨāļ‚āļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ (Data Flow Diagram)

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđ„āļŦāļĨāļ‚āļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļĄāļ·āđˆāļ­āļœāļđāđ‰āđƒāļŠāđ‰āļ—āļģāļĢāļēāļĒāļāļēāļĢāļšāļąāļ™āļ—āļķāļāļšāļīāļĨāļ„āđˆāļēāđƒāļŠāđ‰āļˆāđˆāļēāļĒ:

sequenceDiagram
    participant User as āļœāļđāđ‰āđƒāļŠāđ‰ (Flutter UI)
    participant Controller as State Controller (Riverpod)
    participant Router as FastAPI Router
    participant UseCase as CreateBill UseCase
    participant DB as PostgreSQL DB
    participant AI as AI Service (OCR/Slip)

    User->>Controller: āļāļĢāļ­āļāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āđāļĨāļ°āļĒāļ·āļ™āļĒāļąāļ™āļŠāļĢāđ‰āļēāļ‡āļšāļīāļĨ
    Controller->>Router: HTTP POST /api/v1/groups/{id}/bills
    Router->>UseCase: āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ˜āļļāļĢāļāļīāļˆ
    UseCase->>DB: āļšāļąāļ™āļ—āļķāļāļ‚āđ‰āļ­āļĄāļđāļĨāļšāļīāļĨāļĨāļ‡āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ
    UseCase->>AI: (āļ–āđ‰āļēāļĄāļĩāļāļēāļĢāđāļ™āļšāđƒāļšāđ€āļŠāļĢāđ‡āļˆ) āļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļĢāļđāļ›āļ āļēāļžāļšāļīāļĨ
    AI-->>UseCase: āļŠāđˆāļ‡āļœāļĨāļ§āļīāđ€āļ„āļĢāļēāļ°āļŦāđŒāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļāļĨāļąāļšāļĄāļē
    UseCase-->>Router: āļŠāđˆāļ‡āļ„āļ·āļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļšāļīāļĨāļ—āļĩāđˆāļ„āļģāļ™āļ§āļ“āļŠāļąāļ”āļŠāđˆāļ§āļ™āđāļĨāđ‰āļ§
    Router-->>Controller: āļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ JSON āļœāļĨāļĨāļąāļžāļ˜āđŒ
    Controller-->>User: āđāļŠāļ”āļ‡āļœāļĨāļšāļīāļĨāļ—āļĩāđˆāļŠāļĢāđ‰āļēāļ‡āļŠāļģāđ€āļĢāđ‡āļˆāļšāļ™āđāļ­āļ›āļĄāļ·āļ­āļ–āļ·āļ­

🇎🇧 English (For AI Agents)

📌 1. Clean Architecture Design

SplitDee applies Clean Architecture pattern for both backend (FastAPI) and frontend (Flutter) to achieve a decoupled, testable, and highly maintainable codebase.

  • Dependency Rule: Source code dependencies must point inwards. Outer layers (UI, databases, frameworks) can depend on inner layers (Use Cases, Domain), but inner layers must never depend on outer layers.

🐍 2. Backend Layer Breakdown (FastAPI)

  • app/domain: Contains core business model models (Entities) and repository interfaces. Clean from framework imports.
  • app/use_cases: Application business rules. Coordinates the flow of data to and from the domain entities.
  • app/infrastructure: Framework-specific implementations. Includes PostgreSQL database drivers, SQLAlchemy ORM mappings, external AI integration clients (OCR, slip scanner), JWT authorization providers, and Firebase messaging integration.
  • app/presentation: FastAPI endpoints, routers, middleware, and request/response validation schemas (Pydantic models).

ðŸĶ 3. Frontend Layer Breakdown (Flutter)

  • lib/domain: Entities representing UI-agnostic models, abstract repositories, and business use cases.
  • lib/data: API clients, data transfer models (DPOs with JSON serialization), local secure storage, and repository implementations.
  • lib/presentation: Widgets, screens, layouts, and Riverpod State Management controllers.

ðŸĪ– 4. External Integration Points

  • AI Verification Service: Processes slip transaction IDs and amounts. Interfaces with bank validation APIs using an adapter pattern.
  • Firebase Cloud Messaging: Delivers real-time notifications for system events (such as debt updates or Mochi pet actions).
  • PromptPay QR Code Engine: Generates custom EMV Co-compliant QR payloads dynamically for swift in-app scanning.