diff --git a/README.md b/README.md index 2ded5d5..a99bb84 100644 --- a/README.md +++ b/README.md @@ -15,8 +15,6 @@ ---- - - ## 📝 Описание проекта Приложение для отслеживания обновлений контента по ссылкам. @@ -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) @@ -69,19 +61,17 @@ - [**`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 @@ -89,8 +79,7 @@ Scrapper API работает по OpenAPI-контракту. В случае - /list 🔄 Кеш автоматически сбрасывается в следующих случаях: -- При добавлении или удалении ссылки (/track, /untrack) -- При удалении чата (/stop) +- При добавлении или удалении ссылки (/track, /untrack, /untag) При вызове команд бот сначала проверяет наличие ответа в кеше. Если данные найдены — используется кеш. В противном случае происходит обращение к Scrapper API, и результат сохраняется в кеш. @@ -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. - Для каждого пользователя применяется его список фильтров: @@ -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`). ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------