Backend REST API для работы с данными о перевалах, построенный на FastAPI и PostgreSQL.
API предоставляет единственный endpoint POST /submitData
для создания новых записей о перевалах с полной информацией о пользователе, координатах, уровне сложности и изображениях.
├── main.py # Главный файл приложения
├── requirements.txt # Python зависимости
├── Dockerfile # Docker образ приложения
├── docker-compose.yml # Docker Compose конфигурация
├── alembic.ini # Конфигурация Alembic
├── database/ # Настройки базы данных
│ ├── connection.py # Подключение к PostgreSQL
│ └── migrations/ # Миграции Alembic
├── models/ # SQLAlchemy модели
│ ├── user.py # Модель пользователя
│ ├── coords.py # Модель координат
│ ├── level.py # Модель уровня сложности
│ ├── image.py # Модель изображения
│ └── pereval.py # Модель перевала
├── schemas/ # Pydantic схемы
│ ├── user.py # Схемы пользователя
│ ├── coords.py # Схемы координат
│ ├── level.py # Схемы уровня сложности
│ ├── image.py # Схемы изображения
│ └── pereval.py # Схемы перевала
├── repository/ # Репозиторий для работы с БД
│ └── pereval_repository.py
└── routers/ # API роутеры
└── submit_data.py # Роутер для submitData
-
Клонируйте репозиторий:
git clone <repository-url> cd GraduationWork
-
Создайте виртуальное окружение:
python -m venv venv source venv/bin/activate # Linux/Mac # или venv\Scripts\activate # Windows
-
Установите зависимости:
pip install -r requirements.txt
-
Настройте переменные окружения: Создайте файл
.env
в корне проекта:FSTR_DB_HOST=localhost FSTR_DB_PORT=5432 FSTR_DB_LOGIN=postgres FSTR_DB_PASS=password FSTR_DB_NAME=pereval_db
-
Запустите PostgreSQL: Убедитесь, что PostgreSQL запущен и доступен по указанным параметрам.
-
Запустите приложение:
uvicorn main:app --reload
-
Запустите все сервисы:
docker-compose up --build
-
Приложение будет доступно по адресу:
- API: http://localhost:8000
- Swagger UI: http://localhost:8000/docs
- PostgreSQL: localhost:5432
Создает новую запись о перевале.
Запрос:
{
"beauty_title": "пер. ",
"title": "Пхия",
"other_titles": "Триев",
"connect": "",
"add_time": "2021-09-22 13:18:13",
"user": {
"email": "qwerty@mail.ru",
"fam": "Пупкин",
"name": "Василий",
"otc": "Иванович",
"phone": "+7 555 55 55"
},
"coords": {
"latitude": "45.3842",
"longitude": "7.1525",
"height": "1200"
},
"level": {
"winter": "",
"summer": "1А",
"autumn": "1А",
"spring": ""
},
"images": [
{"data": "<base64_encoded_image>", "title": "Седловина"},
{"data": "<base64_encoded_image>", "title": "Подъём"}
]
}
Ответ:
{
"status": 200,
"message": null,
"id": 42
}
Коды ответов:
200
- Успешное создание записи400
- Ошибка валидации данных500
- Ошибка сервера или базы данных
Получает перевал по его ID.
Запрос:
curl -X GET "http://localhost:8000/api/submitData/42"
Ответ:
{
"id": 42,
"beauty_title": "пер. Пхия",
"title": "Пхия",
"other_titles": "Триев",
"connect": "",
"add_time": "2021-09-22T13:18:13",
"status": "new",
"user": {
"id": 1,
"email": "qwerty@mail.ru",
"fam": "Пупкин",
"name": "Василий",
"otc": "Иванович",
"phone": "+7 555 55 55"
},
"coords": {
"id": 1,
"latitude": "45.3842",
"longitude": "7.1525",
"height": "1200"
},
"level": {
"id": 1,
"winter": "",
"summer": "1А",
"autumn": "1А",
"spring": ""
},
"images": [
{
"id": 1,
"data": "<base64_encoded_image>",
"title": "Седловина",
"pereval_id": 42
}
]
}
Коды ответов:
200
- Успешное получение записи400
- Перевал не найден500
- Ошибка сервера
Обновляет существующий перевал (только если статус = 'new').
Запрос:
curl -X PATCH "http://localhost:8000/api/submitData/42" \
-H "Content-Type: application/json" \
-d '{
"beauty_title": "Обновленное название",
"title": "Обновленный перевал",
"coords": {
"latitude": "45.5000",
"longitude": "7.2000",
"height": "1300"
}
}'
Ответ (успех):
{
"state": 1,
"message": null
}
Ответ (ошибка - статус не 'new'):
{
"state": 0,
"message": "Редактирование запрещено: статус не 'new'"
}
Ответ (перевал не найден):
{
"state": 0,
"message": "Перевал не найден"
}
Ограничения:
- Можно изменять только перевалы со статусом 'new'
- Запрещено изменять ФИО, email и телефон пользователя
- Разрешено изменять: beauty_title, title, other_titles, connect, add_time, coords, level, images
Получает список всех перевалов пользователя по email.
Запрос:
curl -X GET "http://localhost:8000/api/submitData/?user__email=qwerty@mail.ru"
Запрос с пагинацией:
curl -X GET "http://localhost:8000/api/submitData/?user__email=qwerty@mail.ru&offset=0&limit=10"
Ответ:
[
{
"id": 42,
"beauty_title": "пер. Пхия",
"title": "Пхия",
"other_titles": "Триев",
"connect": "",
"add_time": "2021-09-22T13:18:13",
"status": "new",
"user": {
"id": 1,
"email": "qwerty@mail.ru",
"fam": "Пупкин",
"name": "Василий",
"otc": "Иванович",
"phone": "+7 555 55 55"
},
"coords": {
"id": 1,
"latitude": "45.3842",
"longitude": "7.1525",
"height": "1200"
},
"level": {
"id": 1,
"winter": "",
"summer": "1А",
"autumn": "1А",
"spring": ""
},
"images": [
{
"id": 1,
"data": "<base64_encoded_image>",
"title": "Седловина",
"pereval_id": 42
}
]
}
]
Параметры запроса:
user__email
(обязательный) - Email пользователяoffset
(опциональный, по умолчанию 0) - Смещение для пагинацииlimit
(опциональный) - Лимит записей для пагинации
Коды ответов:
200
- Успешное получение списка500
- Ошибка сервера
id
- Первичный ключemail
- Email пользователя (уникальный)fam
- Фамилияname
- Имяotc
- Отчество (опционально)phone
- Телефон
id
- Первичный ключlatitude
- Широтаlongitude
- Долготаheight
- Высота
id
- Первичный ключwinter
- Зимний уровень сложностиsummer
- Летний уровень сложностиautumn
- Осенний уровень сложностиspring
- Весенний уровень сложности
id
- Первичный ключdata
- Base64 данные изображенияtitle
- Название изображенияpereval_id
- Внешний ключ на перевал
id
- Первичный ключbeauty_title
- Красивое названиеtitle
- Названиеother_titles
- Другие названияconnect
- Соединениеadd_time
- Время добавленияuser_id
- Внешний ключ на пользователяcoords_id
- Внешний ключ на координатыlevel_id
- Внешний ключ на уровеньstatus
- Статус (new, pending, accepted, rejected)
Для работы с миграциями Alembic:
# Создание новой миграции
alembic revision --autogenerate -m "Описание изменений"
# Применение миграций
alembic upgrade head
# Откат миграций
alembic downgrade -1
Запуск всех тестов:
pytest tests/
Запуск только unit-тестов репозитория:
pytest tests/test_repository.py
Запуск только интеграционных тестов API:
pytest tests/test_api_integration.py
-
Swagger UI: http://localhost:8000/docs
-
curl примеры:
Создание перевала:
curl -X POST "http://localhost:8000/api/submitData" \ -H "Content-Type: application/json" \ -d '{"beauty_title": "Тест", "title": "Тестовый перевал", ...}'
Получение перевала по ID:
curl -X GET "http://localhost:8000/api/submitData/1"
Обновление перевала:
curl -X PATCH "http://localhost:8000/api/submitData/1" \ -H "Content-Type: application/json" \ -d '{"title": "Обновленное название"}'
Получение перевалов по email:
curl -X GET "http://localhost:8000/api/submitData/?user__email=test@example.com"
-
Демонстрационный скрипт:
python demo_api.py
Скрипт автоматически протестирует все endpoints API.
- Валидация данных: Используются Pydantic схемы для автоматической валидации
- Обработка ошибок: Централизованная обработка с детальными сообщениями
- Транзакции: Все операции выполняются в транзакциях с откатом при ошибках
- Логирование: Подробное логирование всех операций
- Документация: Автоматическая генерация OpenAPI/Swagger документации
- Docker: Полная контейнеризация с health checks
- FastAPI - веб-фреймворк
- SQLAlchemy - ORM для работы с базой данных
- PostgreSQL - реляционная база данных
- Alembic - система миграций
- Pydantic - валидация данных
- Docker - контейнеризация
- Uvicorn - ASGI сервер