Поисковый сервис по текстам 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 # Тестовые данные
# Клонируем репозиторий
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Сервис доступен:
- Swagger UI: http://localhost:8000/docs
- API: http://localhost:8000/api/v1/
- OpenAPI схема: http://localhost:8000/openapi.json
Проверить эндпоинты через терминал:
# Поиск
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 downdocker 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Полнотекстовый поиск по постам.
- Ищет в Elasticsearch по полю
text - Возвращает до 20 постов, отсортированных по
created_date(сначала новые) - В ответе все поля БД:
id,rubrics,text,created_date
curl "http://localhost:8000/api/v1/posts/search?query=привет"Удаляет пост из PostgreSQL и Elasticsearch.
200— успешно404— пост не найден
curl -X DELETE "http://localhost:8000/api/v1/posts/delete_post/1"OpenAPI-схема генерируется перед запуском (локально), и сохраняется как docs.json в корне репозитория.
Также её можно открыть через запущенный сервис: http://localhost:8000/openapi.json