Dingo Dream

Very very nice Book.

Application Architecture

graph TB
subgraph Infrastructure ["Infrastructure"]
    DB["<br/>Database Connection<br/>sql.DB"]
    LOG["<br/>Logger<br/>slog.Logger"]
    WG["<br/>WaitGroup<br/>sync.WaitGroup"]
end

subgraph DataAccessLayer ["Data Access Layer"]
    MODELS["<br/>Models<br/>data.Models"]
    MM["<br/>MovieModel<br/>data.MovieModel"] --> DB
    UM["<br/>UserModel<br/>data.UserModel"] --> DB
    TM["<br/>TokenModel<br/>data.TokenModel"] --> DB
    PM["<br/>PermissionModel<br/>data.PermissionModel"] --> DB
    MODELS --> MM
    MODELS --> UM
    MODELS --> TM
    MODELS --> PM
end

subgraph ApplicationLayer ["Application Layer"]
    CFG["<br/>Config<br/>main.config"]
    APP["<br/>Application (Handlers and Helpers)<br/>main.application"]
    MAILER["<br/>Mailer<br/>mailer.Mailer"]
    VALIDATOR["<br/>Validator<br/>validator.Validator"]

    APP --> MODELS
    APP --> CFG
    APP --> MAILER
    APP -.-> VALIDATOR
end

subgraph TransportLayer ["Transport Layer"]
    SERVER["<br/>HTTP Server<br/>http.Server"]
    ROUTER["<br/>Router (+ Custom Middlewares)<br/>httprouter.Router"]
    
    SERVER --> ROUTER
    ROUTER --> APP
end

subgraph Legend ["Legend"]
    STDLIB["<br/>stdlib"] ~~~ CUSTOM["<br/>custom"] ~~~ THIRDPARTY["<br/>3rd party"]
end

%% Color Legend:
%% Green: Custom Application Components
%% Blue: Go Standard Library Components  
%% Gray: External Library Components (3rd party dependencies)

style APP fill:#2e7d32,stroke:#1b5e20,stroke-width:3px,color:#ffffff
style DB fill:#1976d2,stroke:#0d47a1,stroke-width:2px,color:#ffffff
style SERVER fill:#1976d2,stroke:#0d47a1,stroke-width:2px,color:#ffffff
style LOG fill:#1976d2,stroke:#0d47a1,stroke-width:2px,color:#ffffff
style WG fill:#1976d2,stroke:#0d47a1,stroke-width:2px,color:#ffffff
style MODELS fill:#2e7d32,stroke:#1b5e20,stroke-width:2px,color:#ffffff
style MM fill:#2e7d32,stroke:#1b5e20,stroke-width:2px,color:#ffffff
style UM fill:#2e7d32,stroke:#1b5e20,stroke-width:2px,color:#ffffff
style TM fill:#2e7d32,stroke:#1b5e20,stroke-width:2px,color:#ffffff
style PM fill:#2e7d32,stroke:#1b5e20,stroke-width:2px,color:#ffffff
style MAILER fill:#2e7d32,stroke:#1b5e20,stroke-width:2px,color:#ffffff
style VALIDATOR fill:#2e7d32,stroke:#1b5e20,stroke-width:2px,color:#ffffff
style CFG fill:#2e7d32,stroke:#1b5e20,stroke-width:2px,color:#ffffff
style ROUTER fill:#4d4d4d,stroke:#666666,stroke-width:2px,color:#ffffff
style STDLIB fill:#1976d2,stroke:#0d47a1,stroke-width:2px,color:#ffffff
style CUSTOM fill:#2e7d32,stroke:#1b5e20,stroke-width:2px,color:#ffffff
style THIRDPARTY fill:#4d4d4d,stroke:#666666,stroke-width:2px,color:#ffffff

%% Subgraph styling with light yellow background and black text
style Infrastructure fill:#fff7d9,stroke:#333,stroke-width:2px,color:#000000
style DataAccessLayer fill:#fff7d9,stroke:#333,stroke-width:2px,color:#000000
style ApplicationLayer fill:#fff7d9,stroke:#333,stroke-width:2px,color:#000000
style TransportLayer fill:#fff7d9,stroke:#333,stroke-width:2px,color:#000000
style Legend fill:#fff7d9,stroke:#333,stroke-width:2px,color:#000000