Skip to content

kooznitsa/bike_rent

Repository files navigation

Сервис аренды велосипедов

Swagger UI: http://127.0.0.1:1337/v1/swagger/

Админка: http://127.0.0.1:1337/admin/

  • Описание задачи
  • Команды для локального запуска в Docker
  • Примеры запросов к API

Задача

Реализовать backend для сервиса аренды велосипедов, который предоставляет RESTful API для выполнения основных операций. Используйте Django и Django Rest Framework. Реализуйте асинхронные задачи с помощью Celery. Для работы с базой данных используйте Django ORM. Развертывание системы должно осуществляться с использованием Docker и CI/CD (например, GitLab CI). Для работы с облачными технологиями выберите одного из популярных провайдеров (AWS, Google Cloud, Яндекс.Облако) и реализуйте интеграцию с ним.

Основные функции

Регистрация нового пользователя:

  • Реализован API для регистрации нового пользователя.
  • Пользователь предоставляет информацию: юзернейм, электронную почту, пароль, имя, фамилию.
  • Пароль хранится в зашифрованном виде.

Авторизация пользователя:

  • Реализован API для авторизации пользователя.
  • JWT (JSON Web Token) для управления сеансами.

Получение списка доступных велосипедов:

  • Реализован API для получения списка всех доступных велосипедов.
  • Учитывается текущий статус велосипеда (доступен или арендован).

Аренда велосипеда:

  • Реализован API для аренды велосипеда.
  • Пользователь может арендовать только один велосипед одновременно.
  • Учитывается время начала аренды.

Возврат велосипеда:

  • Реализован API для возврата велосипеда.
  • Учитывается время окончания аренды для расчета стоимости аренды.

Получение истории аренды пользователя:

  • Реализован API для получения истории аренды велосипедов текущего пользователя.

Дополнительные требования

Асинхронные задачи:

  • Используется Celery для обработки асинхронной задачию
  • Раз в 6 часов в БД добавляется статистика по количеству велосипедов и общей стоимости аренды за последние 6 часов.

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

  • Реализованы модульные тесты с использованием PyTest.
  • Реализованы интеграционные тесты для проверки работы API.

Развертывание:

  • Используется Docker для контейнеризации приложения.
  • CI/CD система для автоматического тестирования и развертывания.

Интеграция с облачными технологиями:

  • Реализована интеграция с Яндекс.Облаком для хранения данных.

Стек технологий

  • Backend: Django, Django Rest Framework
  • Асинхронность: Celery
  • База данных: PostgreSQL
  • Тестирование: PyTest
  • Контейнеризация: Docker
  • CI/CD: GitHub Actions
  • Облачные технологии: Яндекс.Облако

Результаты

  • Репозиторий с исходным кодом приложения.
  • Документация по API (Swagger).
  • Файл docker-compose.yml для развертывания всех сервисов.
  • Скрипт CI/CD для автоматического тестирования и деплоя.
  • Инструкции по развертыванию и локальному запуску проекта.
  • Примеры запросов для тестирования API.

Команды для локального запуска в Docker

# Создание сети:
docker network create external-net

# Создание контейнеров:
docker compose up -d --build

# Создание миграций:
docker exec -it backend poetry run python manage.py makemigrations
docker exec -it backend poetry run python manage.py migrate

# Создание суперюзера:
docker exec -it backend poetry run python manage.py createsuperuser

# Запуск тестов:
docker exec -it backend bash
poetry run pytest -v

# Удаление контейнеров:
docker compose down

Примеры запросов к API

Swagger: /v1/swagger/

/v1/user/register — регистрация пользователя

{
  "username": "severus",
  "email": "severus@example.com",
  "password": "severus_password",
  "first_name": "severus",
  "last_name": "snape"
}

/v1/user/jwt/token/ — получение JWT-токена для зарегистрированного пользователя

{
  "username": "harry",
  "password": "bike_rent_password"
}

Response:

{
  "refresh": "string",
  "access": "string" — используется для авторизации
}

/v1/bike/ — доступные для аренды велосипеды

Без параметров даты по умолчанию — ближайшие сутки. Пример параметров дат:

  • start_at_gte: 2024-06-13T10:30:10
  • finish_at_gte: 2024-06-13T11:30:10

/v1/rent/book_bike — арендовать велосипед

{
  "user": "6c78fef1-4607-4d34-9042-7007760d62b3",
  "bike": "66b47ced-e53e-4ac6-af6f-d154fccf6e79",
  "start_at": "2024-08-11T10:00:00",
  "finish_at": "2024-08-11T12:00:00"
}

/v1/rent/return_bike — вернуть велосипед

{
  "uid": "a03a068f-b878-4453-9cc9-9478621f7514"
}