Skip to content

LinterProd/OnlineChat

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

OnlineChat — реактивный backend чата

Реактивный backend для чат‑приложения на базе Spring Boot 3 / WebFlux / GraphQL, с поддержкой JWT‑аутентификации, Postgres (R2DBC), Redis и «умных» обновлений через GraphQL Subscriptions.


Архитектура

Проект разделён на несколько Gradle‑модулей по принципам DDD / Hexagonal / Clean Architecture:

  • core — доменная модель и порты:
    • сущности: User, ChatRoom, Message, Participant, RefreshToken и т.д.;
    • общие абстракции: CreateUseCase, FindUseCase, UpdateUseCase, DeleteUseCase, критерии поиска, пагинация;
    • порты (ports.inbound / ports.outbound) для пользователей, сообщений, комнат, безопасности, токенов.
  • application — прикладные use‑cases:
    • CreateUserUseCase, CreateMessageUseCase, FindMessagesUseCase, CreateChatRoomUseCase, AddReactionUseCase и пр.;
    • AuthenticationServiceImpl реализует AuthenticationUseCase (login / refresh / logout).
  • infrastructure — адаптеры и интеграции:
    • Persistence: R2DBC‑репозитории, сущности и мапперы (UserRepositoryImpl, MessageRepositoryImpl, ChatRoomRepositoryImpl, ParticipantRepositoryPortImpl и др.);
    • Security: JWT‑генерация и валидация, адаптеры к AuthenticationPort, SecurityUtilsPort, PasswordEncoderPort, blacklist refresh‑токенов и access‑токенов;
    • GraphQL: резолверы (UserResolver, MessageResolver, ChatRoomResolver) + DTO;
    • Redis / Smart updates: RedisConfig + SmartUpdateAdapter, который хранит контекст клиента и пушит «умные» обновления через Reactor Sinks.
  • boot — точка входа Spring Boot:
    • OnlineChatApplication со @SpringBootApplication(scanBasePackages = "com.metarash.onlinechat");
    • подключает модули core, application, infrastructure, конфигурацию GraphQL, безопасности и БД.

Технологический стек

  • Язык / платформа: Java 21
  • Сборка: Gradle (многомодульный проект)
  • Web / Reactive:
    • Spring Boot 3.3.x
    • Spring WebFlux
    • Project Reactor
  • API:
    • Spring for GraphQL (/graphql)
    • GraphQL Subscriptions (/subscriptions) для «умных» обновлений
  • БД:
    • PostgreSQL (R2DBC драйвер + Flyway миграции)
  • Кеш / брокер:
    • Redis (ReactiveRedisTemplate, хранение клиентского контекста)
  • Безопасность:
    • Spring Security (reactive)
    • JWT (jjwt)
  • Инфраструктура и утилиты:
    • MapStruct (мапперы DTO ↔ домен)
    • Lombok

Конфигурация окружения

Основная конфигурация находится в boot/src/main/resources/application.yml:

  • PostgreSQL (R2DBC + Flyway):
    • URL: r2dbc:postgresql://localhost:5432/OnlineChat
    • JDBC для Flyway: jdbc:postgresql://localhost:5432/OnlineChat
    • схема: onlinechat
    • пользователь: postgres
    • пароль: 12345
  • Redis:
    • host: localhost
    • port: 6379
  • GraphQL:
    • endpoint: /graphql
    • GraphiQL UI: включен (/graphiql?path=/graphql)
    • WebSocket для подписок: /subscriptions
  • JWT:
    • заданы access-secret, refresh-secret, TTL для access/refresh токенов.

Запуск проекта локально

Предварительные требования

  • Java 21 (JDK)
  • Docker (желательно) или локально установленные:
    • PostgreSQL
    • Redis

Быстрый старт через Docker (пример)

# PostgreSQL
docker run --name onlinechat-postgres -e POSTGRES_PASSWORD=12345 \
  -e POSTGRES_DB=OnlineChat -p 5432:5432 -d postgres:16

# Redis
docker run --name onlinechat-redis -p 6379:6379 -d redis:7

Убедитесь, что схема onlinechat создаётся миграциями Flyway (это делает приложение при старте).

Сборка и запуск

Из корня проекта:

# Windows (PowerShell / cmd)
gradlew.bat :boot:bootRun

# Linux / macOS
./gradlew :boot:bootRun

После старта приложение будет доступно по адресу:

  • HTTP: http://localhost:8080/graphql
  • GraphiQL: http://localhost:8080/graphiql?path=/graphql
  • WebSocket Subscriptions: ws://localhost:8080/subscriptions

Сборка JAR

./gradlew :boot:bootJar
java -jar boot/build/libs/boot-*.jar

GraphQL API (кратко)

Схема определена в infrastructure/src/main/resources/graphql/schema.graphqls. Основные операции:

  • Query
    • getMessages(input: GetMessagesInput!): [Message!]!
    • getUser(id: UUID!): User!
    • getCurrentUser: User!
    • getChatRoom(id: UUID!): ChatRoomResponse!
    • getUserChatRooms: [ChatRoom!]!
  • Mutation
    • login(input: LoginInput!): AuthResponse!
    • register(input: RegisterInput!): AuthResponse!
    • refreshToken(refreshToken: String!): AuthResponse!
    • logout: String!
    • createChatRoom, sendMessage, editMessage, deleteMessage, addReaction, removeReaction
  • Subscription
    • userSmartUpdates(userId: UUID!): UserUpdate! — смарт‑обновления (новые сообщения / обновление списка комнат)

Типичный сценарий работы

  1. Регистрация / логин
mutation {
  register(input: { username: "test", password: "secret" }) {
    userId
    accessToken
    refreshToken
  }
}
  1. Использование accessToken

    • Отправлять в заголовке Authorization: Bearer <accessToken> при запросах к /graphql.
  2. Обновление токена

mutation {
  refreshToken(refreshToken: "<refresh-token>") {
    accessToken
    refreshToken
  }
}
  1. Подписка на обновления
    • открыть WebSocket‑подключение к /subscriptions и вызвать
subscription {
  userSmartUpdates(userId: "<uuid>") {
    type
    data {
      ... on Message { id content }
      ... on RoomListUpdate { roomId lastMessage { id content } }
    }
  }
}

В целом проект выглядит архитектурно зрелым и хорошо структурированным, но требует доработки инфраструктуры (секреты, контейнеризация) и покрытия тестами перед продакшеном.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages