Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
553edd9
feat: refactored stats and released recommendations feature
yiqes May 6, 2025
6817514
feat: refactored stats and released recommendations feature
yiqes May 6, 2025
e65142d
feat: refactored stats and released recommendations feature
yiqes May 6, 2025
95a01bd
feat: refactored stats and released recommendations feature
yiqes May 6, 2025
73d008c
feat: refactored stats and released recommendations feature
yiqes May 6, 2025
3a03cc7
feat: refactored stats and released recommendations feature
yiqes May 7, 2025
52eb4e3
feat: refactored stats and released recommendations feature
yiqes May 9, 2025
b019e69
feat: refactored stats and released recommendations feature
yiqes May 9, 2025
c3a4c4d
feat: refactored stats and released recommendations feature
yiqes May 9, 2025
2c92255
feat: refactored stats and released recommendations feature
yiqes May 9, 2025
b3951eb
feat: refactored stats and released recommendations feature
yiqes May 9, 2025
63537a7
feat: refactored stats and released recommendations feature
yiqes May 9, 2025
63d9a34
feat: refactored stats and released recommendations feature
yiqes May 10, 2025
a23acde
feat: refactored stats and released recommendations feature
yiqes May 10, 2025
27788ab
feat: refactored stats and released recommendations feature
yiqes May 11, 2025
d99d909
feat: refactored stats and released recommendations feature
yiqes May 11, 2025
27a6687
feat: refactored stats and released recommendations feature
yiqes May 11, 2025
45dfa8b
feat: refactored stats and released recommendations feature
yiqes May 11, 2025
b0381b2
feat: refactored stats and released recommendations feature
yiqes May 11, 2025
3866185
feat: refactored stats and released recommendations feature
yiqes May 11, 2025
983c059
feat: refactored stats and released recommendations feature
yiqes May 11, 2025
a9e8b8e
feat: refactored stats and released recommendations feature
yiqes May 11, 2025
41c4b67
feat: refactored stats and released recommendations feature
yiqes May 11, 2025
5062eec
fix: code cleanup
yiqes May 11, 2025
c7b91a4
fix: added Readme.md
yiqes May 11, 2025
0b728bd
fix: resolved reviewer comments
yiqes May 11, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
159 changes: 159 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,159 @@
# Explore-with-me

## Introduction

Explore-with-me - это платформа, позволяющая пользователям создавать мероприятия, управлять ими и участвовать в них. Приложение перешло на **микросервисную архитектуру** для улучшения масштабируемости, отказоустойчивости и гибкости разработки.

Ключевые компоненты архитектуры:
* **Config Server**: Централизованное управление конфигурациями для всех микросервисов.
* **Discovery Server (Eureka)**: Обеспечивает регистрацию и обнаружение сервисов в сети.
* **Gateway Server**: Единая точка входа для всех клиентских запросов, выполняет маршрутизацию к соответствующим микросервисам.
* **Event Service**: Отвечает за логику, связанную с мероприятиями (создание, поиск, управление).
* **User Service**: Управляет данными пользователей и их аутентификацией/авторизацией.
* **Request Service**: Обрабатывает запросы на участие в мероприятиях.
* **Stats Service**: Система сбора и анализа статистики, разделенная на:
* **Collector**: Принимает и сохраняет информацию о просмотрах и обращениях к эндпоинтам.
* **Aggregator**: Агрегирует собранные данные для последующего анализа.
* **Analyzer**: Анализирует агрегированные данные для формирования рекомендаций пользователям.

Взаимодействие между сервисами осуществляется с помощью **Feign клиентов**.

## Technologies Used

- **Spring Boot**: Основа для создания микросервисов.
- **Spring Cloud**:
- **Spring Cloud Config**: Для `config-server`.
- **Spring Cloud Netflix Eureka** (или **Consul**): Для `discovery-server`.
- **Spring Cloud Gateway**: Для `gateway-server`.
- **OpenFeign**: Для декларативного REST-взаимодействия между сервисами.
- **REST**: Для API коммуникации.
- **Docker & Docker Compose**: Для контейнеризации и оркестрации окружения.
- **PostgreSQL**: В качестве основной базы данных для сервисов (где это необходимо).
- **Lombok**: Для уменьшения шаблонного кода.
- **SLF4J**: Для логирования.

## Service Overview

Проект состоит из следующих основных микросервисов:

- **config-server**: Сервер конфигураций.
- **discovery-server**: Сервер регистрации и обнаружения сервисов.
- **gateway-server**: API шлюз, маршрутизирующий запросы.
- **event-service**: Сервис управления событиями.
- **user-service**: Сервис управления пользователями.
- **request-service**: Сервис управления запросами на участие.
- **collector**: Сервис сбора статистики.
- **aggregator**: Сервис агрегации статистики.
- **analyzer**: Сервис анализа статистики и формирования рекомендаций.

## Setup and Installation

### Prerequisites

- Java 21+
- Maven
- Docker
- Docker Compose

### Installation Steps

1. **Clone the Repository**

```bash
git clone https://github.com/yiqes/java-plus-graduation.git
cd java-plus-graduation
```

2. **Build the Project Modules**

```bash
mvn clean install
```

3. **Running with Docker Compose (Recommended)**

- Убедитесь, что Docker и Docker Compose установлены.
- Перейдите в корневую директорию проекта, где находится `docker-compose.yml`.
- Запустите:

```bash
docker-compose up --build
```
Это поднимет все сконфигурированные сервисы, включая `config-server`, `discovery-server` и базы данных.

4. **Running Without Docker (More Complex)**

- Запустите `config-server`.
- Запустите `discovery-server`. Убедитесь, что он регистрируется в `config-server` для получения своей конфигурации.
- Запустите остальные микросервисы (`event-service`, `user-service`, `request-service`, `stats-collector`, `stats-aggregator`, `stats-analyzer`). Они должны регистрироваться в `discovery-server` и получать конфигурацию из `config-server`.
- Запустите `gateway-server`. Он будет использовать `discovery-server` для маршрутизации запросов.
- Для каждого сервиса необходимо настроить подключение к базе данных (если используется) в его `bootstrap.properties` (для подключения к config-server) и `application.properties` (или получать из config-server).
- Запуск каждого сервиса:
```bash
# Пример для event-service
# java -jar event-service/target/event-service.jar
```

## API Documentation

Все API запросы должны направляться через **Gateway Server**, который обычно доступен по адресу `http://localhost:8080` (или порт, указанный в вашей конфигурации `gateway-server`). Gateway автоматически маршрутизирует запросы к соответствующим микросервисам.

**Эндпоинты остались теми же, что и в монолитной версии.**

### Admin API Endpoints (через Gateway)

- **POST /admin/categories**
- Создает новую категорию.
- Request Body: `NewCategoryDto`
- *Маршрутизируется на `event-service`*

- **GET /admin/compilations**
- Получает подборки событий.
- Query Params: `pinned`, `from`, `size`
- *Маршрутизируется на `event-service`*

- **POST /admin/events** (и другие PATCH, GET эндпоинты для событий)
- Создает/обновляет/получает события (администратор).
- Request Body: `NewEventDto` / `UpdateEventAdminRequest`
- *Маршрутизируется на `event-service`*

- **GET /admin/users** (и другие эндпоинты для управления пользователями)
- Получает пользователей.
- Query Params: `ids`, `from`, `size`
- *Маршрутизируется на `user-service`*

### Public API Endpoints (через Gateway)

- **GET /categories**
- Получает категории.
- Query Params: `from`, `size`
- *Маршрутизируется на `event-service`*

- **GET /compilations**
- Получает подборки событий.
- Query Params: `pinned`, `from`, `size`
- *Маршрутизируется на `event-service`*

- **GET /events**
- Получает события (публичный доступ).
- Query Params: `text`, `categories`, `paid`, `rangeStart`, `rangeEnd`, `onlyAvailable`, `sort`, `from`, `size`
- *Маршрутизируется на `event-service`*

### Private API Endpoints (через Gateway)

- **POST /users/{userId}/events** (и другие эндпоинты для событий пользователя)
- Создает событие для пользователя.
- Request Body: `NewEventDto`
- *Маршрутизируется на `event-service` (с проверкой пользователя через `user-service` или передачей `userId`)*

- **GET /users/{userId}/requests** (и другие эндпоинты для запросов пользователя)
- Получает запросы на участие для событий пользователя.
- *Маршрутизируется на `request-service` (с проверкой пользователя)*

## Usage Examples

### Getting an event with provided id & user-id from header (через Gateway)

```bash
curl -X GET "http://localhost:8080/123" \
-H "X-Ewm-User-Id: 456"
Loading