Smart Notification Service — это микросервис на базе FastAPI, предназначенный для асинхронной обработки уведомлений через Email и Telegram.
Сервис принимает заявки на отправку, сохраняет их со статусом pending, немедленно отвечает клиенту и обрабатывает отправку в фоновом режиме с имитацией задержки.
Проект соответствует всем требованиям тестового задания:
- ✅ Асинхронная обработка через
BackgroundTasks - ✅ Хранение уведомлений в Redis (в памяти)
- ✅ Поддержка фильтрации по статусу
- ✅ Unit-тесты с
pytest - ✅ Поддержка Docker и логирование
- Docker и Docker Compose
- Python 3.11+ (для локальной разработки)
git clone https://github.com/Alex5200/notificationFastapi.git
cd notification-service
docker-compose up --buildСервис будет доступен по адресу:
👉 http://localhost:8000
Swagger UI (документация API):
👉 http://localhost:8000/docs
# Установка зависимостей
pip install -r requirements.txt
# Запуск (требуется запущенный Redis на localhost:6379)
uvicorn app.main:app --reloadЗапрос:
{
"user_id": 123,
"message": "Ваш код: 1111",
"type": "telegram"
}Параметры:
| Поле | Тип | Обязательное | Возможные значения |
|---|---|---|---|
user_id |
int |
✅ | Любое положительное число |
message |
str |
✅ | 1–1000 символов |
type |
str |
✅ | "email" или "telegram" |
Ответ (201 Created):
{
"message": "Notification processing started",
"user_id": 123,
"type": "telegram",
"status": "accepted"
}Параметры:
status(опционально): фильтр по статусу (pending,sent,failed)
Примеры:
- Все уведомления:
GET /api/notifications/123 - Только отправленные:
GET /api/notifications/123?status=sent
Ответ (200 OK):
{
"user_id": 123,
"count": 2,
"notifications": [
{
"user_id": 123,
"message": "Ваш код: 1111",
"type": "telegram",
"status": "sent",
"created_at": "2026-01-07T10:00:00.000000",
"sent_at": "2026-01-07T10:00:00.200000"
},
{
"user_id": 123,
"message": "Подтверждение регистрации",
"type": "email",
"status": "pending",
"created_at": "2026-01-07T10:01:00.000000",
"sent_at": null
}
]
}- Redis используется как in-memory хранилище.
- Ключ:
notification:{user_id}:{timestamp} - Значение: хеш с полями уведомления (
user_id,message,type,status,created_at,sent_at)
- Используется
BackgroundTasksиз FastAPI. - После приёма заявки:
- Уведомление сохраняется со статусом
pending. - Запускается фоновая задача.
- Задача "спит" (
asyncio.sleep) и обновляет статус наsent.
- Уведомление сохраняется со статусом
Запуск тестов:
pytestDockerfile— сборка образа Python-приложения.docker-compose.yml— запуск сервиса и Redis одной командой.requirements.txt— зависимости проекта.
fastapiuvicornpydanticredispytesthttpx
| Требование | Статус |
|---|---|
| FastAPI + Python 3.11+ | ✅ |
| GitHub репозиторий | ✅ |
| Dockerfile | ✅ |
| Unit-тесты (pytest) | ✅ (3 теста) |
| Асинхронная отправка | ✅ |
| Фильтрация по статусу | ✅ |
| Retry механизм | ✅ (бонус) |
| Docker Compose с Redis | ✅ |