# menumate-a2sv/dineq-backend architecture

> Architecture diagram of the GitHub repository menumate-a2sv/dineq-backend, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-27). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/menumate-a2sv/dineq-backend
- Repository: https://github.com/menumate-a2sv/dineq-backend

## Overview

DineQ is a Go HTTP service for restaurant menus, with account and authentication features alongside restaurant, menu, item, photo, and review functionality. The principal workflow is an HTTP request entering the API, being routed to a handler, and—where wired—being served by a use case and infrastructure. Sampled auth code shows registration, login and token refresh, OTP verification, password reset, and Google sign-in; the tree also shows content-management modules. Most content handlers and the central router setup were not sampled, so their internal wiring is not inferred.

Main entry points: [`internal/interfaces/http/routers/auth_routes.go`](https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/interfaces/http/routers/auth_routes.go) (Auth Routes), [`internal/interfaces/http/handlers/auth_handler.go`](https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/interfaces/http/handlers/auth_handler.go) (Auth Handler), [`internal/interfaces/http/routers/user_routes.go`](https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/interfaces/http/routers/user_routes.go) (User Routes), [`internal/usecases/user_usecase.go`](https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/usecases/user_usecase.go) (User Use Case)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_api["HTTP API"]
  node_server["API Server<br/>[main.go]"]
  node_router["Router Setup<br/>[setup.go]"]
  node_auth_routes["Auth Routes<br/>[auth_routes.go]"]
  node_user_routes["User Routes<br/>[user_routes.go]"]
  node_auth_handler["Auth Handler<br/>[auth_handler.go]"]
  node_user_handler["User Handler<br/>[user_handler.go]"]
  node_restaurant_handler["Restaurant Handler"]
  node_menu_handler["Menu Handler<br/>[menu_handler.go]"]
  node_item_handler["Item Handler<br/>[item_handler.go]"]
  node_photo_handler["Photo Handler<br/>[photo_handler.go]"]
  node_review_handler["Review Handler<br/>[review_handler.go]"]
end

subgraph group_business["Business Logic"]
  node_user_uc["User Use Case<br/>[user_usecase.go]"]
  node_otp_uc["OTP Use Case<br/>[otp_usecase.go]"]
  node_refresh_uc["Refresh Token Use Case"]
  node_restaurant_uc["Restaurant Use Case"]
  node_menu_uc["Menu Use Case<br/>[menu_usecase.go]"]
  node_item_uc["Item Use Case<br/>[item_usecase.go]"]
  node_photo_uc["Photo Use Case<br/>[photo_usecase.go]"]
  node_review_uc["Review Use Case<br/>[review_usecase.go]"]
end

subgraph group_infra["Infrastructure"]
  node_mongo[("MongoDB<br/>[mongo.go]")]
  node_user_repo["User Repository<br/>[user_repo.go]"]
  node_otp_repo["OTP Repository<br/>[otp_repo.go]"]
  node_refresh_repo["Refresh Repository"]
  node_jwt["JWT Service<br/>[jwt_service.go]"]
  node_email["Email Service<br/>[gomail_services.go]"]
  node_imagekit["Image Storage<br/>[imagekit.go]"]
  node_google["Google OAuth<br/>[google.go]"]
end

subgraph group_domain["Domain"]
  node_domain_user["User Model<br/>[user.go]"]
  node_domain_otp["OTP Model<br/>[otp.go]"]
  node_domain_menu["Menu Model<br/>[menu.go]"]
  node_domain_restaurant["Restaurant Model<br/>[restaurant.go]"]
  node_domain_item["Item Model<br/>[item.go]"]
end

node_client(("API Client"))
node_smtp["SMTP Service"]

node_client -->|"sends request"| node_server
node_server -->|"configures routes"| node_router
node_router -->|"registers routes"| node_auth_routes
node_router -->|"registers routes"| node_user_routes
node_auth_routes -->|"dispatches auth"| node_auth_handler
node_user_routes -->|"dispatches profile"| node_user_handler
node_auth_routes -->|"constructs"| node_user_repo
node_auth_routes -->|"constructs"| node_otp_repo
node_auth_routes -->|"constructs"| node_refresh_repo
node_auth_routes -->|"constructs"| node_user_uc
node_auth_routes -->|"constructs"| node_otp_uc
node_auth_routes -->|"constructs"| node_refresh_uc
node_auth_routes -->|"constructs"| node_jwt
node_auth_routes -->|"constructs"| node_email
node_auth_routes -->|"constructs"| node_imagekit
node_user_routes -->|"constructs"| node_user_repo
node_user_routes -->|"constructs"| node_user_uc
node_user_routes -->|"constructs"| node_imagekit
node_auth_handler -->|"calls"| node_user_uc
node_auth_handler -->|"calls"| node_otp_uc
node_auth_handler -->|"calls"| node_refresh_uc
node_auth_handler -->|"generates tokens"| node_jwt
node_auth_handler -->|"starts OAuth"| node_google
node_user_uc --> node_user_repo
node_user_uc --> node_imagekit
node_otp_uc --> node_otp_repo
node_otp_uc --> node_email
node_refresh_uc --> node_refresh_repo
node_user_repo -->|"reads/writes"| node_mongo
node_otp_repo -->|"reads/writes"| node_mongo
node_refresh_repo -->|"reads/writes"| node_mongo
node_email -->|"sends email"| node_smtp

click node_server "https://github.com/menumate-a2sv/dineq-backend/blob/main/cmd/api/main.go"
click node_router "https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/interfaces/http/routers/setup.go"
click node_auth_routes "https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/interfaces/http/routers/auth_routes.go"
click node_user_routes "https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/interfaces/http/routers/user_routes.go"
click node_auth_handler "https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/interfaces/http/handlers/auth_handler.go"
click node_user_handler "https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/interfaces/http/handlers/user_handler.go"
click node_restaurant_handler "https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/interfaces/http/handlers/restaurant_handler.go"
click node_menu_handler "https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/interfaces/http/handlers/menu_handler.go"
click node_item_handler "https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/interfaces/http/handlers/item_handler.go"
click node_photo_handler "https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/interfaces/http/handlers/photo_handler.go"
click node_review_handler "https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/interfaces/http/handlers/review_handler.go"
click node_user_uc "https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/usecases/user_usecase.go"
click node_otp_uc "https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/usecases/otp_usecase.go"
click node_refresh_uc "https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/usecases/refresh_token_usecase.go"
click node_restaurant_uc "https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/usecases/restaurant_usecase.go"
click node_menu_uc "https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/usecases/menu_usecase.go"
click node_item_uc "https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/usecases/item_usecase.go"
click node_photo_uc "https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/usecases/photo_usecase.go"
click node_review_uc "https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/usecases/review_usecase.go"
click node_mongo "https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/infrastructure/database/mongo.go"
click node_user_repo "https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/infrastructure/repositories/user_repo.go"
click node_otp_repo "https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/infrastructure/repositories/otp_repo.go"
click node_refresh_repo "https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/infrastructure/repositories/refresh_token_repo.go"
click node_jwt "https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/infrastructure/security/jwt_service.go"
click node_email "https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/infrastructure/email/gomail_services.go"
click node_imagekit "https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/infrastructure/storage/imagekit.go"
click node_google "https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/infrastructure/oauth/google.go"
click node_domain_user "https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/domain/user.go"
click node_domain_otp "https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/domain/otp.go"
click node_domain_menu "https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/domain/menu.go"
click node_domain_restaurant "https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/domain/restaurant.go"
click node_domain_item "https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/domain/item.go"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_server,node_router,node_auth_routes,node_user_routes,node_auth_handler,node_user_handler,node_restaurant_handler,node_menu_handler,node_item_handler,node_photo_handler,node_review_handler,node_client toneBlue
class node_user_uc,node_otp_uc,node_refresh_uc,node_restaurant_uc,node_menu_uc,node_item_uc,node_photo_uc,node_review_uc toneAmber
class node_mongo,node_user_repo,node_otp_repo,node_refresh_repo,node_jwt,node_email,node_imagekit,node_google toneMint
class node_domain_user,node_domain_otp,node_domain_menu,node_domain_restaurant,node_domain_item toneRose
class node_smtp toneIndigo
```

## Components

### HTTP API

- [API Server](https://github.com/menumate-a2sv/dineq-backend/blob/main/cmd/api/main.go): `cmd/api/main.go`
- [Router Setup](https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/interfaces/http/routers/setup.go): `internal/interfaces/http/routers/setup.go`
- [Auth Routes](https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/interfaces/http/routers/auth_routes.go): `internal/interfaces/http/routers/auth_routes.go`
- [User Routes](https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/interfaces/http/routers/user_routes.go): `internal/interfaces/http/routers/user_routes.go`
- [Auth Handler](https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/interfaces/http/handlers/auth_handler.go): `internal/interfaces/http/handlers/auth_handler.go`
- [User Handler](https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/interfaces/http/handlers/user_handler.go): `internal/interfaces/http/handlers/user_handler.go`
- [Restaurant Handler](https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/interfaces/http/handlers/restaurant_handler.go): `internal/interfaces/http/handlers/restaurant_handler.go`
- [Menu Handler](https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/interfaces/http/handlers/menu_handler.go): `internal/interfaces/http/handlers/menu_handler.go`
- [Item Handler](https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/interfaces/http/handlers/item_handler.go): `internal/interfaces/http/handlers/item_handler.go`
- [Photo Handler](https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/interfaces/http/handlers/photo_handler.go): `internal/interfaces/http/handlers/photo_handler.go`
- [Review Handler](https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/interfaces/http/handlers/review_handler.go): `internal/interfaces/http/handlers/review_handler.go`

### Business Logic

- [User Use Case](https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/usecases/user_usecase.go): `internal/usecases/user_usecase.go`
- [OTP Use Case](https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/usecases/otp_usecase.go): `internal/usecases/otp_usecase.go`
- [Refresh Token Use Case](https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/usecases/refresh_token_usecase.go): `internal/usecases/refresh_token_usecase.go`
- [Restaurant Use Case](https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/usecases/restaurant_usecase.go): `internal/usecases/restaurant_usecase.go`
- [Menu Use Case](https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/usecases/menu_usecase.go): `internal/usecases/menu_usecase.go`
- [Item Use Case](https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/usecases/item_usecase.go): `internal/usecases/item_usecase.go`
- [Photo Use Case](https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/usecases/photo_usecase.go): `internal/usecases/photo_usecase.go`
- [Review Use Case](https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/usecases/review_usecase.go): `internal/usecases/review_usecase.go`

### Infrastructure

- [MongoDB](https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/infrastructure/database/mongo.go): `internal/infrastructure/database/mongo.go`
- [User Repository](https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/infrastructure/repositories/user_repo.go): `internal/infrastructure/repositories/user_repo.go`
- [OTP Repository](https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/infrastructure/repositories/otp_repo.go): `internal/infrastructure/repositories/otp_repo.go`
- [Refresh Repository](https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/infrastructure/repositories/refresh_token_repo.go): `internal/infrastructure/repositories/refresh_token_repo.go`
- [JWT Service](https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/infrastructure/security/jwt_service.go): `internal/infrastructure/security/jwt_service.go`
- [Email Service](https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/infrastructure/email/gomail_services.go): `internal/infrastructure/email/gomail_services.go`
- [Image Storage](https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/infrastructure/storage/imagekit.go): `internal/infrastructure/storage/imagekit.go`
- [Google OAuth](https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/infrastructure/oauth/google.go): `internal/infrastructure/oauth/google.go`

### Domain

- [User Model](https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/domain/user.go): `internal/domain/user.go`
- [OTP Model](https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/domain/otp.go): `internal/domain/otp.go`
- [Menu Model](https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/domain/menu.go): `internal/domain/menu.go`
- [Restaurant Model](https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/domain/restaurant.go): `internal/domain/restaurant.go`
- [Item Model](https://github.com/menumate-a2sv/dineq-backend/blob/main/internal/domain/item.go): `internal/domain/item.go`

### Other components

- **API Client**
- **SMTP Service**

## Connections

- API Client → API Server: sends request
- API Server → Router Setup: configures routes
- Router Setup → Auth Routes: registers routes
- Router Setup → User Routes: registers routes
- Auth Routes → Auth Handler: dispatches auth
- User Routes → User Handler: dispatches profile
- Auth Routes → User Repository: constructs
- Auth Routes → OTP Repository: constructs
- Auth Routes → Refresh Repository: constructs
- Auth Routes → User Use Case: constructs
- Auth Routes → OTP Use Case: constructs
- Auth Routes → Refresh Token Use Case: constructs
- Auth Routes → JWT Service: constructs
- Auth Routes → Email Service: constructs
- Auth Routes → Image Storage: constructs
- User Routes → User Repository: constructs
- User Routes → User Use Case: constructs
- User Routes → Image Storage: constructs
- Auth Handler → User Use Case: calls
- Auth Handler → OTP Use Case: calls
- Auth Handler → Refresh Token Use Case: calls
- Auth Handler → JWT Service: generates tokens
- Auth Handler → Google OAuth: starts OAuth
- User Use Case → User Repository
- User Use Case → Image Storage
- OTP Use Case → OTP Repository
- OTP Use Case → Email Service
- Refresh Token Use Case → Refresh Repository
- User Repository → MongoDB: reads/writes
- OTP Repository → MongoDB: reads/writes
- Refresh Repository → MongoDB: reads/writes
- Email Service → SMTP Service: sends email
