REST API для справочника организаций с геопространственным поиском.
- Python 3.13 - современный синтаксис с типизацией
- FastAPI - асинхронный веб-фреймворк
- SQLAlchemy 2.0 - ORM с async поддержкой и DeclarativeBase
- PostgreSQL + PostGIS - база данных с геопространственными возможностями
- Pydantic 2.0 - валидация данных с Annotated типами
- Alembic - миграции БД
- uv - современный менеджер пакетов Python
- pytest + aiosqlite - тестирование с SQLite in-memory
# Клонировать репозиторий
git clone <repo-url>
cd organization-directory-api
# Запустить через Docker Compose
docker-compose up -d --build --no-depsAPI будет доступно по адресу: http://localhost:8005
# Установить uv
curl -LsSf https://astral.sh/uv/install.sh | sh
# Установить зависимости
uv sync
# Настроить переменные окружения
cp .env.example .env
# Отредактировать .env файл
# Запустить PostgreSQL с PostGIS
docker run -d --name postgres-postgis \
-e POSTGRES_DB=orgdir \
-e POSTGRES_USER=postgres \
-e POSTGRES_PASSWORD=postgres \
-p 5432:5432 \
postgis/postgis:16-3.4
# Применить миграции
uv run alembic upgrade head
# Загрузить тестовые данные
uv run python scripts/seed_data.py
# Запустить сервер
uv run uvicorn app.main:app --reload- Swagger UI: http://localhost:8005/api/docs
- ReDoc: http://localhost:8005/api/redoc
- OpenAPI JSON: http://localhost:8005/api/openapi.json
# Список всех зданий (с пагинацией)
GET /api/v1/buildings/?limit=100&offset=0
# Здание по ID
GET /api/v1/buildings/{building_id}# Дерево видов деятельности (иерархическое)
GET /api/v1/activities/
# Вид деятельности по ID
GET /api/v1/activities/{activity_id}# Организация по ID (с полной информацией)
GET /api/v1/organizations/{org_id}
# Поиск по названию
GET /api/v1/organizations/search?q=название&limit=100&offset=0
# Организации в здании
GET /api/v1/organizations/by-building/{building_id}
# Организации по виду деятельности (с учетом иерархии)
GET /api/v1/organizations/by-activity/{activity_id}
# Геопространственный поиск (радиус)
GET /api/v1/organizations/nearby?lat=55.7558&lon=37.6173&radius=1000
# Геопространственный поиск (bounding box)
GET /api/v1/organizations/nearby?lat_min=55.7&lat_max=55.8&lon_min=37.6&lon_max=37.7# Проверка работоспособности API и БД
GET /healthВсе запросы к /api/v1/* требуют заголовок:
X-API-Key: your-secret-api-key-here
# Получить все здания
curl -H "X-API-Key: your-secret-api-key-here" \
http://localhost:8005/api/v1/buildings/
# Поиск организаций по названию
curl -H "X-API-Key: your-secret-api-key-here" \
"http://localhost:8005/api/v1/organizations/search?q=Рога"
# Геопоиск в радиусе 1км от центра Москвы
curl -H "X-API-Key: your-secret-api-key-here" \
"http://localhost:8005/api/v1/organizations/nearby?lat=55.7558&lon=37.6173&radius=1000"
# Получить дерево деятельностей
curl -H "X-API-Key: your-secret-api-key-here" \
http://localhost:8005/api/v1/activities/# Приложение
APP_NAME="Organization Directory API"
APP_VERSION="1.0.0"
DEBUG=false
# База данных
DATABASE_URL=postgresql+asyncpg://postgres:password@localhost:5432/orgdir
DB_ECHO=false
DB_POOL_SIZE=5
DB_MAX_OVERFLOW=10
# Безопасность
API_KEY=your-secret-api-key-here
# CORS
CORS_ORIGINS=["*"]uv sync --devТесты используют SQLite in-memory базу данных - настройка не требуется! База создается автоматически для каждого теста и удаляется после завершения.
# Все тесты (70 юнит-тестов)
pytest
# С покрытием кода
pytest --cov=app --cov-report=html
open htmlcov/index.html
# Только юнит-тесты
pytest tests/unit/
# Конкретный файл
pytest tests/unit/test_building_service.py
# Конкретный тест
pytest tests/unit/test_building_service.py::test_get_building_by_id -v
# С подробным выводом
pytest -v -s
# Параллельный запуск (быстрее)
pytest -n auto- ✅ 70 юнит-тестов - все проходят
- ⚡ ~1 секунда - время выполнения
- 🎯 >80% - покрытие кода
- 🚀 SQLite in-memory - не требуется PostgreSQL
test_activity_service.py- 8 тестов сервиса деятельностейtest_building_service.py- 5 тестов сервиса зданийtest_organization_service.py- 10 тестов сервиса организацийtest_models.py- 10 тестов моделей SQLAlchemytest_repositories.py- 11 тестов репозиториевtest_schemas.py- 15 тестов Pydantic схемtest_exceptions.py- 11 тестов исключений
tests/README.md- общее описаниеtests/unit/README.md- юнит-тестыtests/TESTING_GUIDE.md- подробное руководствоtests/FINAL_SUMMARY.md- финальная сводка
# Форматирование кода
uv run ruff format .
# Проверка линтером
uv run ruff check .
# Проверка типов
uv run mypy app/# Создание новой миграции
uv run alembic revision --autogenerate -m "Description"
# Применение миграций
uv run alembic upgrade head
# Откат последней миграции
uv run alembic downgrade -1
# История миграций
uv run alembic history# Production зависимость
uv add package-name
# Dev зависимость
uv add --dev package-name
# Синхронизация зависимостей
uv syncПроект следует принципам Clean Architecture и SOLID:
app/
├── api/ # API Layer
│ ├── middleware/ # Аутентификация, CORS
│ └── v1/endpoints/ # HTTP endpoints
├── core/ # Business Logic Layer
│ ├── services/ # Бизнес-логика
│ └── exceptions.py # Кастомные исключения
├── db/ # Data Layer
│ ├── models/ # SQLAlchemy модели
│ ├── repositories/ # Паттерн Repository
│ └── base.py # Base класс для моделей
├── schemas/ # Pydantic схемы
├── config.py # Конфигурация
├── dependencies.py # FastAPI dependencies
└── main.py # Точка входа
-
API Layer (
app/api/)- HTTP endpoints с валидацией
- Middleware (auth, CORS, error handling)
- Роутинг и документация
-
Service Layer (
app/core/services/)- Бизнес-логика
- Оркестрация репозиториев
- Обработка исключений
-
Repository Layer (
app/db/repositories/)- Доступ к данным
- CRUD операции
- Сложные запросы
-
Models (
app/db/models/)- SQLAlchemy модели
- Связи между таблицами
- Валидация на уровне БД
-
Schemas (
app/schemas/)- Pydantic модели для валидации
- Request/Response схемы
- Документация API
- ✅ Иерархические виды деятельности - до 3 уровней вложенности
- ✅ Геопространственный поиск - через PostGIS (радиус и bounding box)
- ✅ Полнотекстовый поиск - по названиям организаций
- ✅ Пагинация - для всех списковых endpoints
- ✅ Валидация - на всех уровнях (Pydantic, SQLAlchemy, БД)
- ✅ Асинхронная архитектура - высокая производительность
- ✅ Автоматическая документация - OpenAPI/Swagger
- ✅ Type hints - полная типизация кода
- ✅ Dependency Injection - через FastAPI Depends
- ✅ Annotated типы - современный подход FastAPI
- ✅ Lifespan events - управление жизненным циклом
- ✅ Error handling - централизованная обработка ошибок
- ✅ DeclarativeBase - вместо declarative_base()
- ✅ Annotated[Type, Depends()] - вместо Type = Depends()
- ✅ model_validator - вместо @validator
- ✅ ConfigDict - вместо class Config
- ✅ Explicit status codes - для всех endpoints
- ✅ Russian descriptions - в OpenAPI документации
Автоматические тесты запускаются при:
- Push в main/develop
- Создании Pull Request
См. .github/workflows/tests.yml
# Сборка образа
docker build -t organization-api .
# Запуск контейнера
docker run -p 8005:8005 --env-file .env organization-api
# Docker Compose (с PostgreSQL)
docker-compose up -d- Async/await - неблокирующие операции
- Connection pooling - переиспользование соединений
- Lazy loading - оптимизация запросов
- Indexes - на часто используемых полях
- PostGIS - оптимизированные геопространственные запросы
- ✅ Все тесты должны проходить
- ✅ Покрытие кода >80%
- ✅ Код отформатирован (ruff format)
- ✅ Нет ошибок линтера (ruff check)
- ✅ Type hints для всех функций