Skip to content
Merged
Show file tree
Hide file tree
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
82 changes: 74 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,11 +1,77 @@
# tnews-subscription-service
Subscription management service for TNews project
# TNEWS

## Описание | Description

TNEWS - это сервис для персонализированного получения новостей. Проект построен по микросервисной архитектуре и включает в себя три сервиса:

TNEWS is a service for personalized news delivery. The project follows a microservice architecture and includes three services:

- **subscription-service** – управляет подписками пользователей и хранит их в PostgreSQL.
Manages user subscriptions and stores them in PostgreSQL.
- **aggregator-service** – агрегирует новости с портала Dzen (и потенциально других источников), хранит их в MongoDB и раз в заданный период времени подбирает новости по подпискам.
Aggregates news from the Dzen portal (and potentially other sources), stores them in MongoDB, and periodically selects news based on subscriptions.
- **client-service** – обеспечивает связь между агрегатором новостей и пользователями через Telegram-бота, передавая пользователям отфильтрованные новости и принимая их команды.
Acts as a bridge between the news aggregator and users via a Telegram bot, delivering filtered news and processing user commands.

## Технологии | Technologies

- **Backend**: Java, Spring Boot
- **Базы данных | Databases**: PostgreSQL, MongoDB
- **Контейнеризация | Containerization**: Docker
- **Сборка | Build System**: Gradle
- **Тестирование | Testing**: JUnit, H2, Flapdoodle

## Запуск проекта | Running the project

### Требования | Requirements

- Установленный Docker и Docker Compose
Installed Docker and Docker Compose
- Java 21
- Gradle
- PostgreSQL и MongoDB (либо запуск через Docker)
PostgreSQL and MongoDB (or launch via Docker)

### Конфигурация | Configuration

Перед запуском необходимо задать токен Telegram-бота в файле конфигурации (`application.yml` или переменных окружения):

Before launching, set the Telegram bot token in the configuration file (`application.yml` or environment variables):

```yaml
bot:
name: YOUR_TELEGRAM_BOT_NAME
token: YOUR_TELEGRAM_BOT_TOKEN
```

### Сборка и запуск через Docker | Build and run with Docker

Перед запуском Docker необходимо собрать проект с помощью Gradle:

Before starting Docker, build the project using Gradle:

```sh
gradle build
```

```sh
docker-compose up -d
```

## Использование | Usage

- Пользователь подписывается на категории и ключевые слова через Telegram-бота.
Users subscribe to categories and keywords via the Telegram bot.
- Агрегатор собирает новости, фильтрует их и отправляет пользователю в соответствии с подписками.
The aggregator collects, filters, and sends news to users based on subscriptions.
- Новости обновляются автоматически с заданным интервалом.
News is updated automatically at a set interval.

## TODO

- Добавить поддержку дополнительных источников новостей
Add support for additional news sources.


Проект позволяет пользователю получать подборку новостей в телеграм бот с определенной периодичностью.

Требования:
1. Аггрегация и индексация статей с разных источников (dzen.ru в качестве первого источника).
2. Пользователь должен иметь возможность зарегистрироваться в телеграм-боте, указать категории и\или ключевые слова и периодичность обновления.
3. Пользователь должно получать подборку новостей в соответствии с индивидуальными настройками.

![image](https://github.com/user-attachments/assets/7994aa40-2422-4d3a-ae1c-c513a61002a2)
41 changes: 28 additions & 13 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
../services:
postgres-db:
image: postgres
image: postgres:latest
container_name: tnews-db
environment:
POSTGRES_DB: tnews_DB
POSTGRES_USER: tnews_DB
POSTGRES_PASSWORD: postgres_tnews_DB
ports:
- "5555:5432"
networks:
- internal_net
volumes:
- postgres_data:/var/lib/postgresql/data

mongo:
image: mongo:latest
Expand All @@ -17,36 +19,49 @@
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: password
MONGO_INITDB_DATABASE: newsdb
ports:
- "27017:27017"
volumes:
- ./init-mongo.js:/docker-entrypoint-initdb.d/init-mongo.js:ro

- mongo_data:/data/db
networks:
- internal_net

subscription-service:
build: ./subscription-service
container_name: subscription-service
depends_on:
- postgres-db
- aggregation-service # стоит ли ждать агрегатор при запуске?
ports:
- "8081:8080"
- aggregation-service
environment:
SPRING_DATASOURCE_URL: jdbc:postgresql://tnews-db:5432/tnews_DB
SPRING_DATASOURCE_USERNAME: tnews_DB
SPRING_DATASOURCE_PASSWORD: postgres_tnews_DB
AGGREGATOR_SERVICE_URL: http://aggregation-service:8080/news

networks:
- internal_net
- default

aggregation-service:
build: ./aggregation-service
container_name: aggregation-service
depends_on:
- mongo
ports:
- "8082:8080"
environment:
MONGO_USERNAME: user
MONGO_PASSWORD: password
MONGO_DATABASE: newsdb
MONGO_PORT: 27017
MONGO_PORT: 27017
networks:
- internal_net
- default

networks:
internal_net:
internal: true
default:
driver: bridge

volumes:
postgres_data:
driver: local
mongo_data:
driver: local
Loading