# spgodev/new-chat architecture

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

- Interactive diagram: https://gitdiagram.com/spgodev/new-chat
- Repository: https://github.com/spgodev/new-chat

## Overview

This is a Gin-based direct-messaging API. Clients register or log in, use bearer tokens on protected routes, find users and create direct chats, then send messages or retrieve chat history. The graph follows the route wiring in main.go and the sampled controller, service, and token code; several other service and PostgreSQL repository implementations are represented from their filenames and wiring, so their internal behavior is not expanded.

Main entry points: [`backend/cmd/api/main.go`](https://github.com/spgodev/new-chat/blob/main/backend/cmd/api/main.go) (Gin API), [`backend/internal/repository/usersPG.go`](https://github.com/spgodev/new-chat/blob/main/backend/internal/repository/usersPG.go) (Users repository), [`backend/internal/controller`](https://github.com/spgodev/new-chat/tree/main/backend/internal/controller) (Auth controllers), [`backend/internal/story/token_service.go`](https://github.com/spgodev/new-chat/blob/main/backend/internal/story/token_service.go) (Token lifecycle)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_api["HTTP API"]
  node_server["Gin API<br/>[main.go]"]
  node_authmw["JWT middleware<br/>[auth_jwt.go]"]
end

subgraph group_identity["Identity"]
  node_authctrl["Auth controllers"]
  node_profilectrl["Profile controller<br/>[me_controller.go]"]
  node_register["Registration"]
  node_login["Login<br/>[login_service.go]"]
  node_tokens["Token lifecycle<br/>[token_service.go]"]
  node_logout["Logout<br/>[logout_service.go]"]
  node_profile["Current user<br/>[me_service.go]"]
end

subgraph group_chat["Messaging"]
  node_chatctrl["Chat controllers"]
  node_messagectrl["Message controllers"]
  node_search["User search"]
  node_createchat["Create direct chat"]
  node_listchats["List chats"]
  node_send["Send message"]
  node_history["Chat history"]
end

subgraph group_storage["Persistence"]
  node_usersrepo["Users repository<br/>[usersPG.go]"]
  node_chatsrepo["Direct-chat repository<br/>[directChatsPG.go]"]
  node_messagesrepo["Messages repository<br/>[messagesPG.go]"]
  node_tokensrepo["Refresh-token repository<br/>[tokensPG.go]"]
  node_postgres[("PostgreSQL")]
end

node_client(("Client"))

node_client -->|"HTTP requests"| node_server
node_server -->|"routes auth"| node_authctrl
node_server -->|"routes profile"| node_profilectrl
node_server -->|"routes chats"| node_chatctrl
node_server -->|"routes messages"| node_messagectrl
node_server -->|"protects API"| node_authmw
node_authmw -->|"parses token"| node_tokens
node_authctrl -->|"registers"| node_register
node_authctrl -->|"authenticates"| node_login
node_authctrl -->|"refreshes"| node_tokens
node_authctrl -->|"logs out"| node_logout
node_profilectrl -->|"loads profile"| node_profile
node_chatctrl -->|"searches users"| node_search
node_chatctrl -->|"creates chat"| node_createchat
node_chatctrl -->|"lists chats"| node_listchats
node_messagectrl -->|"sends message"| node_send
node_messagectrl -->|"loads history"| node_history
node_register -->|"checks and creates user"| node_usersrepo
node_register -->|"issues tokens"| node_tokens
node_login -->|"loads credentials"| node_usersrepo
node_login -->|"issues tokens"| node_tokens
node_tokens -->|"stores and rotates"| node_tokensrepo
node_logout -->|"revokes token"| node_tokensrepo
node_profile -->|"loads user"| node_usersrepo
node_search -->|"searches prefix"| node_usersrepo
node_createchat -->|"loads participants"| node_usersrepo
node_createchat -->|"creates chat"| node_chatsrepo
node_listchats -->|"loads chats"| node_chatsrepo
node_send -->|"checks chat access"| node_chatsrepo
node_send -->|"persists message"| node_messagesrepo
node_history -->|"checks chat access"| node_chatsrepo
node_history -->|"loads messages"| node_messagesrepo
node_usersrepo -->|"queries"| node_postgres
node_chatsrepo -->|"queries"| node_postgres
node_messagesrepo -->|"queries"| node_postgres
node_tokensrepo -->|"queries"| node_postgres

click node_server "https://github.com/spgodev/new-chat/blob/main/backend/cmd/api/main.go"
click node_authmw "https://github.com/spgodev/new-chat/blob/main/backend/internal/middleware/auth_jwt.go"
click node_authctrl "https://github.com/spgodev/new-chat/tree/main/backend/internal/controller"
click node_profilectrl "https://github.com/spgodev/new-chat/blob/main/backend/internal/controller/me_controller.go"
click node_chatctrl "https://github.com/spgodev/new-chat/tree/main/backend/internal/controller"
click node_messagectrl "https://github.com/spgodev/new-chat/tree/main/backend/internal/controller"
click node_register "https://github.com/spgodev/new-chat/blob/main/backend/internal/story/registraton_service.go"
click node_login "https://github.com/spgodev/new-chat/blob/main/backend/internal/story/login_service.go"
click node_tokens "https://github.com/spgodev/new-chat/blob/main/backend/internal/story/token_service.go"
click node_logout "https://github.com/spgodev/new-chat/blob/main/backend/internal/story/logout_service.go"
click node_profile "https://github.com/spgodev/new-chat/blob/main/backend/internal/story/me_service.go"
click node_search "https://github.com/spgodev/new-chat/blob/main/backend/internal/story/searchUsers_service.go"
click node_createchat "https://github.com/spgodev/new-chat/blob/main/backend/internal/story/createChat_service.go"
click node_listchats "https://github.com/spgodev/new-chat/blob/main/backend/internal/story/getChats_service.go"
click node_send "https://github.com/spgodev/new-chat/blob/main/backend/internal/story/sendMessage_service.go"
click node_history "https://github.com/spgodev/new-chat/blob/main/backend/internal/story/getChatHistory_service.go"
click node_usersrepo "https://github.com/spgodev/new-chat/blob/main/backend/internal/repository/usersPG.go"
click node_chatsrepo "https://github.com/spgodev/new-chat/blob/main/backend/internal/repository/directChatsPG.go"
click node_messagesrepo "https://github.com/spgodev/new-chat/blob/main/backend/internal/repository/messagesPG.go"
click node_tokensrepo "https://github.com/spgodev/new-chat/blob/main/backend/internal/repository/tokensPG.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_authmw,node_client toneBlue
class node_authctrl,node_profilectrl,node_register,node_login,node_tokens,node_logout,node_profile toneAmber
class node_chatctrl,node_messagectrl,node_search,node_createchat,node_listchats,node_send,node_history toneMint
class node_usersrepo,node_chatsrepo,node_messagesrepo,node_tokensrepo,node_postgres toneRose
```

## Components

### HTTP API

- [Gin API](https://github.com/spgodev/new-chat/blob/main/backend/cmd/api/main.go): `backend/cmd/api/main.go`
- [JWT middleware](https://github.com/spgodev/new-chat/blob/main/backend/internal/middleware/auth_jwt.go): `backend/internal/middleware/auth_jwt.go`

### Identity

- [Auth controllers](https://github.com/spgodev/new-chat/tree/main/backend/internal/controller): `backend/internal/controller`
- [Profile controller](https://github.com/spgodev/new-chat/blob/main/backend/internal/controller/me_controller.go): `backend/internal/controller/me_controller.go`
- [Registration](https://github.com/spgodev/new-chat/blob/main/backend/internal/story/registraton_service.go): `backend/internal/story/registraton_service.go`
- [Login](https://github.com/spgodev/new-chat/blob/main/backend/internal/story/login_service.go): `backend/internal/story/login_service.go`
- [Token lifecycle](https://github.com/spgodev/new-chat/blob/main/backend/internal/story/token_service.go): `backend/internal/story/token_service.go`
- [Logout](https://github.com/spgodev/new-chat/blob/main/backend/internal/story/logout_service.go): `backend/internal/story/logout_service.go`
- [Current user](https://github.com/spgodev/new-chat/blob/main/backend/internal/story/me_service.go): `backend/internal/story/me_service.go`

### Messaging

- [Chat controllers](https://github.com/spgodev/new-chat/tree/main/backend/internal/controller): `backend/internal/controller`
- [Message controllers](https://github.com/spgodev/new-chat/tree/main/backend/internal/controller): `backend/internal/controller`
- [User search](https://github.com/spgodev/new-chat/blob/main/backend/internal/story/searchUsers_service.go): `backend/internal/story/searchUsers_service.go`
- [Create direct chat](https://github.com/spgodev/new-chat/blob/main/backend/internal/story/createChat_service.go): `backend/internal/story/createChat_service.go`
- [List chats](https://github.com/spgodev/new-chat/blob/main/backend/internal/story/getChats_service.go): `backend/internal/story/getChats_service.go`
- [Send message](https://github.com/spgodev/new-chat/blob/main/backend/internal/story/sendMessage_service.go): `backend/internal/story/sendMessage_service.go`
- [Chat history](https://github.com/spgodev/new-chat/blob/main/backend/internal/story/getChatHistory_service.go): `backend/internal/story/getChatHistory_service.go`

### Persistence

- [Users repository](https://github.com/spgodev/new-chat/blob/main/backend/internal/repository/usersPG.go): `backend/internal/repository/usersPG.go`
- [Direct-chat repository](https://github.com/spgodev/new-chat/blob/main/backend/internal/repository/directChatsPG.go): `backend/internal/repository/directChatsPG.go`
- [Messages repository](https://github.com/spgodev/new-chat/blob/main/backend/internal/repository/messagesPG.go): `backend/internal/repository/messagesPG.go`
- [Refresh-token repository](https://github.com/spgodev/new-chat/blob/main/backend/internal/repository/tokensPG.go): `backend/internal/repository/tokensPG.go`
- **PostgreSQL**

### Other components

- **Client**

## Connections

- Client → Gin API: HTTP requests
- Gin API → Auth controllers: routes auth
- Gin API → Profile controller: routes profile
- Gin API → Chat controllers: routes chats
- Gin API → Message controllers: routes messages
- Gin API → JWT middleware: protects API
- JWT middleware → Token lifecycle: parses token
- Auth controllers → Registration: registers
- Auth controllers → Login: authenticates
- Auth controllers → Token lifecycle: refreshes
- Auth controllers → Logout: logs out
- Profile controller → Current user: loads profile
- Chat controllers → User search: searches users
- Chat controllers → Create direct chat: creates chat
- Chat controllers → List chats: lists chats
- Message controllers → Send message: sends message
- Message controllers → Chat history: loads history
- Registration → Users repository: checks and creates user
- Registration → Token lifecycle: issues tokens
- Login → Users repository: loads credentials
- Login → Token lifecycle: issues tokens
- Token lifecycle → Refresh-token repository: stores and rotates
- Logout → Refresh-token repository: revokes token
- Current user → Users repository: loads user
- User search → Users repository: searches prefix
- Create direct chat → Users repository: loads participants
- Create direct chat → Direct-chat repository: creates chat
- List chats → Direct-chat repository: loads chats
- Send message → Direct-chat repository: checks chat access
- Send message → Messages repository: persists message
- Chat history → Direct-chat repository: checks chat access
- Chat history → Messages repository: loads messages
- Users repository → PostgreSQL: queries
- Direct-chat repository → PostgreSQL: queries
- Messages repository → PostgreSQL: queries
- Refresh-token repository → PostgreSQL: queries
