# ngntiendat/unsaid-social-media-application architecture

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

- Interactive diagram: https://gitdiagram.com/ngntiendat/unsaid-social-media-application
- Repository: https://github.com/ngntiendat/unsaid-social-media-application

## Overview

UNSAID is a social-media backend for short posts, media sharing, follows, feeds, and conversation. The principal workflow accepts a post and optional media, stores the post, uploads media, then publishes a post-created event; feed services build and retrieve user feeds using Redis and follow data. Authentication and profile/follow operations are separate user-facing flows, while action, notification, and WebSocket components support social interaction. The README describes real-time conversation but gives no textual subsystem details; the frontend source is a Vite starter. Some messaging links are omitted because their wiring was not sampled.

Main entry points: [`unsaid-backend/src/main/java/com/ntd/unsaid/application/service/PostService.java`](https://github.com/ngntiendat/unsaid-social-media-application/blob/main/unsaid-backend/src/main/java/com/ntd/unsaid/application/service/PostService.java) (Post service), [`unsaid-backend/src/main/java/com/ntd/unsaid/application/service/UserService.java`](https://github.com/ngntiendat/unsaid-social-media-application/blob/main/unsaid-backend/src/main/java/com/ntd/unsaid/application/service/UserService.java) (User service), [`unsaid-backend/src/main/java/com/ntd/unsaid/domain/repository/UserRepository.java`](https://github.com/ngntiendat/unsaid-social-media-application/blob/main/unsaid-backend/src/main/java/com/ntd/unsaid/domain/repository/UserRepository.java) (User repository), [`unsaid-backend/src/main/java/com/ntd/unsaid/application/service/AuthenticationService.java`](https://github.com/ngntiendat/unsaid-social-media-application/blob/main/unsaid-backend/src/main/java/com/ntd/unsaid/application/service/AuthenticationService.java) (Authentication service)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_api["API and identity"]
  node_auth["Authentication API"]
  node_authsvc["Authentication service"]
  node_userapi["User API"]
  node_usersvc["User service<br/>[UserService.java]"]
end

subgraph group_social["Posts and social"]
  node_postapi["Post API"]
  node_postsvc["Post service<br/>[PostService.java]"]
  node_actionsvc["Action service<br/>[ActionService.java]"]
  node_feedapi["Social feed API"]
  node_feedsvc["Feed service<br/>[FeedService.java]"]
  node_media["Media upload"]
end

subgraph group_async["Async and realtime"]
  node_publisher["Message publisher"]
  node_postevent["Post-created event"]
  node_notify["Notification service"]
end

subgraph group_state["Persistence and cache"]
  node_postrepo["Post repository"]
  node_userrepo["User repository"]
  node_followrepo["Follow repository"]
  node_invalidrepo["Token repository"]
  node_database[("Relational database")]
  node_redis[("Redis cache")]
  node_redisrepo["Redis repository"]
end

node_user(("User"))
node_cloudinary{{"Cloudinary"}}
node_rabbit["RabbitMQ"]
node_websocket(("WebSocket clients"))

node_user -->|"submits credentials"| node_auth
node_auth -->|"delegates auth"| node_authsvc
node_authsvc -->|"loads user"| node_userrepo
node_authsvc -->|"checks token state"| node_invalidrepo
node_user -->|"manages profile"| node_userapi
node_userapi -->|"delegates profile"| node_usersvc
node_usersvc -->|"reads/writes users"| node_userrepo
node_usersvc -->|"manages follows"| node_followrepo
node_usersvc -.->|"uploads avatar"| node_cloudinary
node_user -->|"creates post"| node_postapi
node_postapi -->|"delegates creation"| node_postsvc
node_postsvc -->|"loads author"| node_userrepo
node_postsvc -->|"stores post"| node_postrepo
node_postsvc -->|"uploads attachments"| node_media
node_media -.->|"uploads media"| node_cloudinary
node_postsvc -->|"creates event"| node_postevent
node_postsvc -->|"publishes event"| node_publisher
node_publisher -->|"dispatches message"| node_rabbit
node_user -->|"requests feed"| node_feedapi
node_feedapi -->|"delegates retrieval"| node_feedsvc
node_feedsvc -->|"reads feed cache"| node_redisrepo
node_feedsvc -->|"loads followers"| node_followrepo
node_redisrepo -->|"reads/writes feeds"| node_redis
node_user -->|"interacts with posts"| node_actionsvc
node_actionsvc -->|"uses cache"| node_redisrepo
node_notify -->|"delivers updates"| node_websocket
node_postrepo -->|"reads/writes posts"| node_database
node_userrepo -->|"reads/writes users"| node_database
node_followrepo -->|"reads/writes follows"| node_database
node_invalidrepo -->|"stores invalidations"| node_database

click node_auth "https://github.com/ngntiendat/unsaid-social-media-application/blob/main/unsaid-backend/src/main/java/com/ntd/unsaid/presentation/controller/AuthenticationController.java"
click node_authsvc "https://github.com/ngntiendat/unsaid-social-media-application/blob/main/unsaid-backend/src/main/java/com/ntd/unsaid/application/service/AuthenticationService.java"
click node_userapi "https://github.com/ngntiendat/unsaid-social-media-application/blob/main/unsaid-backend/src/main/java/com/ntd/unsaid/presentation/controller/UserController.java"
click node_usersvc "https://github.com/ngntiendat/unsaid-social-media-application/blob/main/unsaid-backend/src/main/java/com/ntd/unsaid/application/service/UserService.java"
click node_postapi "https://github.com/ngntiendat/unsaid-social-media-application/blob/main/unsaid-backend/src/main/java/com/ntd/unsaid/presentation/controller/PostController.java"
click node_postsvc "https://github.com/ngntiendat/unsaid-social-media-application/blob/main/unsaid-backend/src/main/java/com/ntd/unsaid/application/service/PostService.java"
click node_actionsvc "https://github.com/ngntiendat/unsaid-social-media-application/blob/main/unsaid-backend/src/main/java/com/ntd/unsaid/application/service/ActionService.java"
click node_feedapi "https://github.com/ngntiendat/unsaid-social-media-application/blob/main/unsaid-backend/src/main/java/com/ntd/unsaid/presentation/controller/SocialFeedController.java"
click node_feedsvc "https://github.com/ngntiendat/unsaid-social-media-application/blob/main/unsaid-backend/src/main/java/com/ntd/unsaid/application/service/FeedService.java"
click node_media "https://github.com/ngntiendat/unsaid-social-media-application/blob/main/unsaid-backend/src/main/java/com/ntd/unsaid/application/service/CloudinaryUploadService.java"
click node_postrepo "https://github.com/ngntiendat/unsaid-social-media-application/blob/main/unsaid-backend/src/main/java/com/ntd/unsaid/domain/repository/PostRepository.java"
click node_userrepo "https://github.com/ngntiendat/unsaid-social-media-application/blob/main/unsaid-backend/src/main/java/com/ntd/unsaid/domain/repository/UserRepository.java"
click node_followrepo "https://github.com/ngntiendat/unsaid-social-media-application/blob/main/unsaid-backend/src/main/java/com/ntd/unsaid/domain/repository/FollowRepository.java"
click node_invalidrepo "https://github.com/ngntiendat/unsaid-social-media-application/blob/main/unsaid-backend/src/main/java/com/ntd/unsaid/domain/repository/InvalidatedTokenRepository.java"
click node_redisrepo "https://github.com/ngntiendat/unsaid-social-media-application/blob/main/unsaid-backend/src/main/java/com/ntd/unsaid/infrastructure/caching/RedisRepository.java"
click node_publisher "https://github.com/ngntiendat/unsaid-social-media-application/blob/main/unsaid-backend/src/main/java/com/ntd/unsaid/infrastructure/messaging/producer/RabbitMQPublisher.java"
click node_postevent "https://github.com/ngntiendat/unsaid-social-media-application/blob/main/unsaid-backend/src/main/java/com/ntd/unsaid/domain/event/PostCreatedEvent.java"
click node_notify "https://github.com/ngntiendat/unsaid-social-media-application/blob/main/unsaid-backend/src/main/java/com/ntd/unsaid/application/service/NotificationService.java"

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_auth,node_authsvc,node_userapi,node_usersvc,node_user,node_websocket toneBlue
class node_postapi,node_postsvc,node_actionsvc,node_feedapi,node_feedsvc,node_media toneAmber
class node_publisher,node_postevent,node_notify toneMint
class node_postrepo,node_userrepo,node_followrepo,node_invalidrepo,node_database,node_redis,node_redisrepo toneRose
class node_cloudinary,node_rabbit toneIndigo
```

## Components

### API and identity

- [Authentication API](https://github.com/ngntiendat/unsaid-social-media-application/blob/main/unsaid-backend/src/main/java/com/ntd/unsaid/presentation/controller/AuthenticationController.java): `unsaid-backend/src/main/java/com/ntd/unsaid/presentation/controller/AuthenticationController.java`
- [Authentication service](https://github.com/ngntiendat/unsaid-social-media-application/blob/main/unsaid-backend/src/main/java/com/ntd/unsaid/application/service/AuthenticationService.java): `unsaid-backend/src/main/java/com/ntd/unsaid/application/service/AuthenticationService.java`
- [User API](https://github.com/ngntiendat/unsaid-social-media-application/blob/main/unsaid-backend/src/main/java/com/ntd/unsaid/presentation/controller/UserController.java): `unsaid-backend/src/main/java/com/ntd/unsaid/presentation/controller/UserController.java`
- [User service](https://github.com/ngntiendat/unsaid-social-media-application/blob/main/unsaid-backend/src/main/java/com/ntd/unsaid/application/service/UserService.java): `unsaid-backend/src/main/java/com/ntd/unsaid/application/service/UserService.java`

### Posts and social

- [Post API](https://github.com/ngntiendat/unsaid-social-media-application/blob/main/unsaid-backend/src/main/java/com/ntd/unsaid/presentation/controller/PostController.java): `unsaid-backend/src/main/java/com/ntd/unsaid/presentation/controller/PostController.java`
- [Post service](https://github.com/ngntiendat/unsaid-social-media-application/blob/main/unsaid-backend/src/main/java/com/ntd/unsaid/application/service/PostService.java): `unsaid-backend/src/main/java/com/ntd/unsaid/application/service/PostService.java`
- [Action service](https://github.com/ngntiendat/unsaid-social-media-application/blob/main/unsaid-backend/src/main/java/com/ntd/unsaid/application/service/ActionService.java): `unsaid-backend/src/main/java/com/ntd/unsaid/application/service/ActionService.java`
- [Social feed API](https://github.com/ngntiendat/unsaid-social-media-application/blob/main/unsaid-backend/src/main/java/com/ntd/unsaid/presentation/controller/SocialFeedController.java): `unsaid-backend/src/main/java/com/ntd/unsaid/presentation/controller/SocialFeedController.java`
- [Feed service](https://github.com/ngntiendat/unsaid-social-media-application/blob/main/unsaid-backend/src/main/java/com/ntd/unsaid/application/service/FeedService.java): `unsaid-backend/src/main/java/com/ntd/unsaid/application/service/FeedService.java`
- [Media upload](https://github.com/ngntiendat/unsaid-social-media-application/blob/main/unsaid-backend/src/main/java/com/ntd/unsaid/application/service/CloudinaryUploadService.java): `unsaid-backend/src/main/java/com/ntd/unsaid/application/service/CloudinaryUploadService.java`

### Async and realtime

- [Message publisher](https://github.com/ngntiendat/unsaid-social-media-application/blob/main/unsaid-backend/src/main/java/com/ntd/unsaid/infrastructure/messaging/producer/RabbitMQPublisher.java): `unsaid-backend/src/main/java/com/ntd/unsaid/infrastructure/messaging/producer/RabbitMQPublisher.java`
- [Post-created event](https://github.com/ngntiendat/unsaid-social-media-application/blob/main/unsaid-backend/src/main/java/com/ntd/unsaid/domain/event/PostCreatedEvent.java): `unsaid-backend/src/main/java/com/ntd/unsaid/domain/event/PostCreatedEvent.java`
- [Notification service](https://github.com/ngntiendat/unsaid-social-media-application/blob/main/unsaid-backend/src/main/java/com/ntd/unsaid/application/service/NotificationService.java): `unsaid-backend/src/main/java/com/ntd/unsaid/application/service/NotificationService.java`

### Persistence and cache

- [Post repository](https://github.com/ngntiendat/unsaid-social-media-application/blob/main/unsaid-backend/src/main/java/com/ntd/unsaid/domain/repository/PostRepository.java): `unsaid-backend/src/main/java/com/ntd/unsaid/domain/repository/PostRepository.java`
- [User repository](https://github.com/ngntiendat/unsaid-social-media-application/blob/main/unsaid-backend/src/main/java/com/ntd/unsaid/domain/repository/UserRepository.java): `unsaid-backend/src/main/java/com/ntd/unsaid/domain/repository/UserRepository.java`
- [Follow repository](https://github.com/ngntiendat/unsaid-social-media-application/blob/main/unsaid-backend/src/main/java/com/ntd/unsaid/domain/repository/FollowRepository.java): `unsaid-backend/src/main/java/com/ntd/unsaid/domain/repository/FollowRepository.java`
- [Token repository](https://github.com/ngntiendat/unsaid-social-media-application/blob/main/unsaid-backend/src/main/java/com/ntd/unsaid/domain/repository/InvalidatedTokenRepository.java): `unsaid-backend/src/main/java/com/ntd/unsaid/domain/repository/InvalidatedTokenRepository.java`
- **Relational database**
- **Redis cache**
- [Redis repository](https://github.com/ngntiendat/unsaid-social-media-application/blob/main/unsaid-backend/src/main/java/com/ntd/unsaid/infrastructure/caching/RedisRepository.java): `unsaid-backend/src/main/java/com/ntd/unsaid/infrastructure/caching/RedisRepository.java`

### Other components

- **User**
- **Cloudinary**
- **RabbitMQ**
- **WebSocket clients**

## Connections

- User → Authentication API: submits credentials
- Authentication API → Authentication service: delegates auth
- Authentication service → User repository: loads user
- Authentication service → Token repository: checks token state
- User → User API: manages profile
- User API → User service: delegates profile
- User service → User repository: reads/writes users
- User service → Follow repository: manages follows
- User service → Cloudinary: uploads avatar
- User → Post API: creates post
- Post API → Post service: delegates creation
- Post service → User repository: loads author
- Post service → Post repository: stores post
- Post service → Media upload: uploads attachments
- Media upload → Cloudinary: uploads media
- Post service → Post-created event: creates event
- Post service → Message publisher: publishes event
- Message publisher → RabbitMQ: dispatches message
- User → Social feed API: requests feed
- Social feed API → Feed service: delegates retrieval
- Feed service → Redis repository: reads feed cache
- Feed service → Follow repository: loads followers
- Redis repository → Redis cache: reads/writes feeds
- User → Action service: interacts with posts
- Action service → Redis repository: uses cache
- Notification service → WebSocket clients: delivers updates
- Post repository → Relational database: reads/writes posts
- User repository → Relational database: reads/writes users
- Follow repository → Relational database: reads/writes follows
- Token repository → Relational database: stores invalidations
