Skip to content

PurpleSwtr/test-assignment-APR

Repository files navigation

Тестовое задание в компанию Аналитические программные решения

Python FastAPI Elasticsearch PostgreSQL Docker

Поисковый сервис по текстам csv-документов. Данные хранятся в PostgreSQL, полнотекстовый поиск — через Elasticsearch.

Стек

  • FastAPI — веб-фреймворк
  • SQLAlchemy 2.0 (async) — ORM
  • asyncpg — асинхронный драйвер PostgreSQL
  • elasticsearch-py — клиент Elasticsearch
  • Pydantic — валидация и настройки
  • Docker + Docker Compose — контейнеризация
  • pytest — тесты

Структура проекта

├── src/
│ ├── main.py # Точка входа FastAPI
│ ├── router.py # Эндпоинты
│ ├── import_data.py # Скрипт импорта из CSV
│ ├── parser.py # Парсер CSV
│ ├── core/
│ │ ├── config.py # Настройки (pydantic-settings)
│ │ ├── database.py # Движок SQLAlchemy
│ │ └── dependencies.py # FastAPI-зависимости
│ │ └── logger.py # Логирование
│ └── models/
│   └── post.py # Модель Post
├── tests/ # Функциональные тесты
├── docker-compose.yml
├── Dockerfile
├── docs.json # OpenAPI-схема
└── posts.csv # Тестовые данные

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

# Клонируем репозиторий
git clone https://github.com/PurpleSwtr/test-assignment-APR.git
cd test-assignment-APR

# Создаём файл окружения из шаблона
cp .env.example .env

# Поднимаем все сервисы (PostgreSQL + Elasticsearch + App)
docker compose up --build -d

# Импортируем данные из posts.csv в БД и Elasticsearch
docker compose exec app python src/import_data.py

Проверка работы

Сервис доступен:

Проверить эндпоинты через терминал:

# Поиск
curl -X 'GET' \
  'http://localhost:8000/api/v1/posts/search?query=%D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82' \
  -H 'accept: application/json'

# Удаление
curl -X 'DELETE' \
  'http://localhost:8000/api/v1/posts/delete_post/1' \
  -H 'accept: application/json'

Остановить:

docker compose down

Тесты

Запуск тестов прямо в Docker

docker compose exec app pytest tests/ -v

Локально

Установка зависимостей

# Создаём окружение
python -m venv .venv

# Активируем
source .venv/bin/activate        # Linux/macOS
.venv\Scripts\activate           # Windows

# Установка зависимостей

# через pip
pip install -r requirements.txt
# через uv
uv sync

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

# через pytest
pytest tests/ -v
# через uv
uv run pytest tests/ -v

API

GET /posts/search?query=<текст>

Полнотекстовый поиск по постам.

  • Ищет в Elasticsearch по полю text
  • Возвращает до 20 постов, отсортированных по created_date (сначала новые)
  • В ответе все поля БД: id, rubrics, text, created_date
curl "http://localhost:8000/api/v1/posts/search?query=привет"

DELETE /posts/delete_post/{post_id}

Удаляет пост из PostgreSQL и Elasticsearch.

  • 200 — успешно
  • 404 — пост не найден
curl -X DELETE "http://localhost:8000/api/v1/posts/delete_post/1"

Документация API

OpenAPI-схема генерируется перед запуском (локально), и сохраняется как docs.json в корне репозитория.

Также её можно открыть через запущенный сервис: http://localhost:8000/openapi.json

About

Тестовое задание в "ООО Аналитические программные решения"

Resources

Stars

0 stars

Watchers

0 watching

Forks

Contributors