Controller  → HTTP request/response, query binding, context extraction
Service     → Business logic, request/response transformation, validation, tracing
Manager     → Data fetching: DB calls, external gRPC calls

Data flow

flowchart TD
    A[HTTP Request] --> B["Controller<br/>bind params, extract context"]
    B --> C["Service<br/>business logic, model conversion, tracing"]
    C --> D["Manager<br/>DB calls, external gRPC calls"]
    D --> E[(Database)]
    D --> F[External gRPC Service]

External vs internal API mapping

External APIs are versioned (/api/v1/sessions); internal APIs aren’t (/internal/sessions). The difference in path structure means the protobuf go_package differs, requiring manual mapping between external and internal representations.

Trade-off: simpler internal APIs at the cost of extra conversion code in the service layer.

See also