Skip to content

Latest commit

 

History

History
171 lines (132 loc) · 4.9 KB

File metadata and controls

171 lines (132 loc) · 4.9 KB

Описание

Smart Notification Service — это микросервис на базе FastAPI, предназначенный для асинхронной обработки уведомлений через Email и Telegram.
Сервис принимает заявки на отправку, сохраняет их со статусом pending, немедленно отвечает клиенту и обрабатывает отправку в фоновом режиме с имитацией задержки.

Проект соответствует всем требованиям тестового задания:

  • ✅ Асинхронная обработка через BackgroundTasks
  • ✅ Хранение уведомлений в Redis (в памяти)
  • ✅ Поддержка фильтрации по статусу
  • ✅ Unit-тесты с pytest
  • ✅ Поддержка Docker и логирование

🚀 Быстрый старт

Требования

  • Docker и Docker Compose
  • Python 3.11+ (для локальной разработки)

Запуск через Docker Compose

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

Локальный запуск (без Docker)

# Установка зависимостей
pip install -r requirements.txt

# Запуск (требуется запущенный Redis на localhost:6379)
uvicorn app.main:app --reload

📡 API Endpoints

1. POST /api/notifications — Создать уведомление

Запрос:

{
  "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"
}

2. GET /api/notifications/{user_id} — Получить историю уведомлений

Параметры:

  • 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.
  • После приёма заявки:
    1. Уведомление сохраняется со статусом pending.
    2. Запускается фоновая задача.
    3. Задача "спит" (asyncio.sleep) и обновляет статус на sent.

🧪 Тестирование

Запуск тестов:

pytest

🐳 Docker и зависимости

Файлы

  • Dockerfile — сборка образа Python-приложения.
  • docker-compose.yml — запуск сервиса и Redis одной командой.
  • requirements.txt — зависимости проекта.

Зависимости

  • fastapi
  • uvicorn
  • pydantic
  • redis
  • pytest
  • httpx

✅ Соответствие требованиям

Требование Статус
FastAPI + Python 3.11+
GitHub репозиторий
Dockerfile
Unit-тесты (pytest) ✅ (3 теста)
Асинхронная отправка
Фильтрация по статусу
Retry механизм ✅ (бонус)
Docker Compose с Redis