Skip to content
Merged
Changes from all commits
Commits
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
57 changes: 22 additions & 35 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,6 @@

----



## 📝 Описание проекта

Приложение для отслеживания обновлений контента по ссылкам.
Expand All @@ -30,13 +28,7 @@

Для работы требуется БД `PostgreSQL`, `Redis`, `Kafka`.

Для дополнительной справки: [HELP.md](./HELP.md)



![{E4ED68AF-CD94-4964-B402-74AE70A10960}](https://github.com/user-attachments/assets/26e0773b-61db-41fb-b696-01e68d824b3a)


### 📟 Схема приложения
![Scrapper](https://github.com/user-attachments/assets/0a9cfa67-9f31-456f-a24d-24fbec93654e)<svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 7200.790836764663 2795.6894500653675" width="7200.790836764663" height="2795.6894500653675" class="excalidraw-svg">
<!-- svg-source:excalidraw -->

Expand Down Expand Up @@ -69,28 +61,25 @@
- [**`TagClient`**](https://github.com/Delphington/LinterBot/blob/main/bot/src/main/java/backend/academy/bot/client/tag/ScrapperTagClientImpl.java) — получение списка тегов, получение ссылки по тегу и удаление тега у ссылки.
- [**`ScrapperFilterClient`**](https://github.com/Delphington/LinterBot/blob/main/bot/src/main/java/backend/academy/bot/client/filter/ScrapperFilterClientImpl.java) — управление фильтрами (добавление, удаление, получение списка фильтров)

Scrapper API работает по OpenAPI-контракту. В случае ошибок ошибки логируются, корректную обработку ошибок и пересылку сообщений в чат выполняет [`ErrorHandler`]().

### 📩 Получение обновлений

- Бот получает обновления о ссылках через [`UpdateController`]() по HTTP либо через [`KafkaUpdateListener`]() по Kafka.
- Бот получает обновления о ссылках через [`UpdateController`](https://github.com/Delphington/LinterBot/blob/main/bot/src/main/java/backend/academy/bot/api/controller/UpdateController.java) по HTTP либо через [`KafkaUpdateListener`](https://github.com/Delphington/LinterBot/blob/main/bot/src/main/java/backend/academy/bot/kafka/client/KafkaLinkUpdateListener.java) по Kafka.
- Scrapper отправляет данные по OpenAPI-контракту.
- Обновления рассылаются чатам через [`UpdateService`]().
- Обновления рассылаются чатам через [`NotificationService`](https://github.com/Delphington/LinterBot/blob/main/bot/src/main/java/backend/academy/bot/notification/NotificationService.java).

### 📜 Дополнительно

- Бот поддерживает встроенное [**меню команд**]() в Telegram.
- Бот поддерживает встроенное [**меню команд**](https://github.com/Delphington/LinterBot/blob/main/bot/src/main/java/backend/academy/bot/processor/UserMessageProcessor.java) в Telegram.

### 🧠 Кеширование
### 🧠 Кеширование Redis

Бот кеширует ответы для следующих команд:
- /tag
- /tag <tag>
- /list

🔄 Кеш автоматически сбрасывается в следующих случаях:
- При добавлении или удалении ссылки (/track, /untrack)
- При удалении чата (/stop)
- При добавлении или удалении ссылки (/track, /untrack, /untag)

При вызове команд бот сначала проверяет наличие ответа в кеше. Если данные найдены — используется кеш. В противном случае происходит обращение к Scrapper API, и результат сохраняется в кеш.

Expand All @@ -101,21 +90,22 @@ Scrapper API работает по OpenAPI-контракту. В случае
### 📌 Функционал

Scrapper обрабатывает запросы от бота:
- **Работа с чатами** через [`ChatController`]().
- **Работа с ссылками** через [`LinkController`]().
- **Работа с тегами** через [`TagController`]().
- **Работа с чатами** через [`ChatController`](https://github.com/Delphington/LinterBot/blob/main/scrapper/src/main/java/backend/academy/scrapper/controller/ChatController.java).
- **Работа с ссылками** через [`LinkController`](https://github.com/Delphington/LinterBot/blob/main/scrapper/src/main/java/backend/academy/scrapper/controller/LinkController.java).
- **Работа с тегами** через [`TagController`](https://github.com/Delphington/LinterBot/blob/main/scrapper/src/main/java/backend/academy/scrapper/controller/TagController.java).
- **Работа с фильтрами** через [`FilterController`](https://github.com/Delphington/LinterBot/blob/main/scrapper/src/main/java/backend/academy/scrapper/controller/FilterController.java).

Все контроллеры работают по OpenAPI-контракту.

### 🔄 Получение обновлений

- [**`UpdateScheduler`**]().
- [**`LinkUpdateScheduler`**](https://github.com/Delphington/LinterBot/blob/main/scrapper/src/main/java/backend/academy/scrapper/scheduler/LinkUpdaterScheduler.java).
- **📡 Источники данных:**
- GitHub — через [`GitHubClient`]()
- Stack Overflow — через [`StackOverflowClient`]()
- GitHub — через [`GitHubClient`](https://github.com/Delphington/LinterBot/blob/main/scrapper/src/main/java/backend/academy/scrapper/tracker/client/GitHubClient.java)
- Stack Overflow — через [`StackOverflowClient`](https://github.com/Delphington/LinterBot/blob/main/scrapper/src/main/java/backend/academy/scrapper/tracker/client/StackOverFlowClient.java)
- **⚙️ Обработка полученных данных**
1. Запрос обновлений
- Для каждого URL запрашивается обновление через API
- Для каждого URL запрашивается обновление через открытый API GitHub и StackOverflow
2. Фильтрация обновлений
- Определяются подписанные пользователи (чаты), которые отслеживают данный URL.
- Для каждого пользователя применяется его список фильтров:
Expand All @@ -134,29 +124,26 @@ Scrapper обрабатывает запросы от бота:

Для хранения данных используются **четыре основные таблицы** и **три вспомогательные таблицы** для связи.


### 📌 Схема базы данных

![{E4ED68AF-CD94-4964-B402-74AE70A10960}](https://github.com/user-attachments/assets/26e0773b-61db-41fb-b696-01e68d824b3a)

### 📌 Основные таблицы

- `chats` — таблица чатов.
- `tg_chats` — таблица чатов.
- `links` — таблица ссылок.
- `tags` — таблица тегов.
- `filters` — таблица фильтров.

### 🔗 Связующие таблицы

Связи между чатами, ссылками, тегами и фильтрами реализованы через **промежуточные таблицы**:

- `chat_links` — связь между чатами и ссылками.
- `chat_link_tags` — связь между ссылками и тегами в контексте чата.
- `chat_link_filters` — связь между ссылками и фильтрами в контексте чата.
- `filter_list` — таблица фильтров каждого пользователя

💡 **Один чат может отслеживать несколько ссылок, а одна ссылка может быть отслеживаемой несколькими чатами.**
📌 **Каждая ссылка может иметь несколько тегов и фильтров в рамках одного чата.**

### 🛠 Способы работы с базой данных:

- **SQL** (`JdbcTemplate`, `SqlRepository`).
- **SQL** (`JdbcTemplate`, `Dao`).
- **ORM** (`Hibernate`, `OrmRepository`).
Оба репозитория (`SqlRepository` и `OrmRepository`) наследуются от `DbRepository` и работают одинаково.
Выбор зависит от **настроек** (`database.access-type`).

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Expand Down
Loading