Backend сервис для магазина продуктов.
Чек лист с требованиями
-
Управление категориями и подкатегориями
- Должна быть реализована возможность создания, редактирования, удаления категорий и подкатегорий товаров в админке.
- Категории и подкатегории обязательно должны иметь наименование, slug-имя, изображение.
- Подкатегории должны быть связаны с родительской категорией.
- Должен быть реализован эндпоинт для просмотра всех категорий с подкатегориями. Должна быть предусмотрена пагинация.
-
Управление продуктами
- Должна быть реализована возможность добавления, изменения, удаления продуктов в админке.
- Продукты должны относится к определенной подкатегории и, соответственно, категории. Должны иметь наименование, slug-имя, изображение в 3-х размерах, цену.
- Должен быть реализован эндпоинт вывода продуктов с пагинацией. Каждый продукт в выводе должен иметь поля: наименование, slug, категория, подкатегория, цена, список изображений.
-
Корзина
- Реализовать эндпоинт добавления, изменения (изменение количества), удаления продукта в корзине.
- Реализовать эндпоинт вывода состава корзины с подсчетом количества товаров и суммы стоимости товаров в корзине.
- Реализовать возможность полной очистки корзины.
-
Права доступа
- Операции по эндпоинтам категорий и продуктов может осуществлять любой пользователь.
- Операции по эндпоинтам корзины может осуществлять только авторизированный пользователь и только со своей корзиной.
-
Авторизация
- Реализовать авторизацию по токену.
-
Дополнительно
- Подключенны pre-commit.
- Настроен линтер ruff.
- Реализованна возможность добавлять товары списком.
- Реализован запуск проекта в Docker.
-
Клонировать репозиторий.
git clone git@github.com:NECROshizo/grocery-store.git cd grocery-store
-
Создайте и заполните файл
.env
согласно шаблону .env.example. -
Перейдите в директорию
infra
и соберите и запустите контейнеры с помощью Docker Compose.cd infra docker-compose -f docker-compose.local.yaml up --build
-
Для остановки контейнеров используйте команду:
docker-compose -f docker-compose.local.yaml down
Теперь ваш проект запущен.
Проект использует Poetry как инструмент управления зависимостями.
-
Клонировать репозиторий.
git clone git@github.com:NECROshizo/grocery-store.git cd diary-workout-tracker-backend
-
Создание и активация виртуального окружения при помощи Poetry.
2.1 Создание отдельного окружения:
python -m venv venv source venv/Scripts/activate
для Linux и macOS:
python3 -m venv venv source venv/bin/activate
2.2 Использование Poetry:
pip install poetry poetry shell poetry install
Примечание: версия Python должна быть ^3.12.
-
Инициализация pre-commit.
poetry run pre-commit install
-
Создайте и заполните файл
.env
согласно шаблону .env.example. -
Сапуск postgresql(при необходимости):
cd infra/
docker-compose -f docker-compose.local.yaml up --build
cd ..
-
Запустите проект с выполнив следующие команды вручную:
При первом запуске:
python backend/manage.py migrate python backend/manage.py collectstatic --noinput
Для последующих запусков:
python backend/manage.py runserver
Теперь ваш проект должен быть настроен и готов к локальной разработке.
Создание пользователя (POST /auth/users/)
Регистрация нового пользователя.
Request:
{
"username": "user1",
"password": "password123",
"email": "user1@example.com"
}
Response:
{
"email": "user1@example.com",
"username": "user1",
"id": 1
}
Status Code: 201 CREATED
Получение JWT токена (POST /auth/jwt/create/)
Получение JWT токена для авторизации.
Request:
{
"username": "user1",
"password": "password123"
}
Response:
{
"access": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
"refresh": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9..."
}
Status Code: 200 OK
Обновление JWT токена (POST /auth/jwt/refresh/)
Обновление просроченного JWT токена.
Request:
{
"refresh": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9..."
}
Response:
{
"access": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9..."
}
Status Code: 200 OK
Проверка JWT токена (POST /auth/jwt/verify/)
Проверка действительности JWT токена.
Request:
{
"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9..."
}
Response:
{
"detail": "Token is valid"
}
Status Code: 200 OK
Получение категорий (GET /api/v1/categories/)
Получение списка всех категорий.
Авторизация не требуется
Response:
{
"count": 2,
"next": null,
"previous": null,
"results": [
{
"title": "Категория 1",
"slug": "kategoriya-1",
"subcategories": [
{
"title": "Подкатегория 1",
"slug": "podkategoriya-1",
"image": "http://example.com/media/image.jpg"
},
{
"title": "Подкатегория 2",
"slug": "podkategoriya-2",
"image": "http://example.com/media/image.jpg"
}
],
"image": "http://example.com/media/image.jpg"
},
{
"title": "Категория 2",
"slug": "kategoriya-2",
"subcategories": [],
"image": "http://example.com/media/image.jpg"
}
]
}
Status Code: 200 OK
Получение продуктов (GET /api/v1/products/)
Получение списка всех продуктов.
Авторизация не требуется
Response:
{
"count": 2,
"next": null,
"previous": null,
"results": [
{
"title": "Продукт 1",
"price": "100.00",
"slug": "produkt-1",
"category": {
"title": "Категория 1",
"slug": "kategoriya-1",
"image": "http://example.com/media/image.jpg"
},
"subcategory": {
"title": "Подкатегория 1",
"slug": "podkategoriya-1",
"image": "http://example.com/media/image.jpg"
},
"images": [
"http://example.com/media/original_image.jpg",
"http://example.com/media/medium_image.jpg",
"http://example.com/media/small_image.jpg"
]
},
{
"title": "Продукт 2",
"price": "50.00",
"slug": "produkt-2",
"category": {
"title": "Категория 2",
"slug": "kategoriya-2",
"image": "http://example.com/media/image.jpg"
},
"subcategory": {
"title": "Подкатегория 2",
"slug": "podkategoriya-2",
"image": "http://example.com/media/image.jpg"
},
"images": [
"http://example.com/media/original_image.jpg",
"http://example.com/media/medium_image.jpg",
"http://example.com/media/small_image.jpg"
]
}
]
}
Status Code: 200 OK
Получение корзины (GET /api/v1/shopping-cart/)
Получение списка продуктов в корзине текущего пользователя с суммарной информацией о количестве товаров в корзине и общей стоимости всех товаров
Требуется авторизация по JWT-токену
Response:
{
"count": 2,
"next": null,
"previous": null,
"results": [
{
"product": {
"title": "Продукт 1",
"price": "100.00",
"slug": "produkt-1",
"category": {
"title": "Категория 1",
"slug": "kategoriya-1",
"image": "http://example.com/media/image.jpg"
},
"subcategory": {
"title": "Подкатегория 1",
"slug": "podkategoriya-1",
"image": "http://example.com/media/image.jpg"
},
"images": [
"http://example.com/media/original_image.jpg",
"http://example.com/media/medium_image.jpg",
"http://example.com/media/small_image.jpg"
]
},
"count": 2
},
{
"product": {
"title": "Продукт 2",
"price": "50.00",
"slug": "produkt-2",
"category": {
"title": "Категория 2",
"slug": "kategoriya-2",
"image": "http://example.com/media/image.jpg"
},
"subcategory": {
"title": "Подкатегория 2",
"slug": "podkategoriya-2",
"image": "http://example.com/media/image.jpg"
},
"images": [
"http://example.com/media/original_image.jpg",
"http://example.com/media/medium_image.jpg",
"http://example.com/media/small_image.jpg"
]
},
"count": 1
}
],
"summary": {
"total_items": 3,
"total_price": "250.00"
}
}
Status Code: 200 OK
Добавление в корзину (POST /api/v1/shopping-cart/)
Добавление продуктов в корзину текущего пользователя. При наличие товара в корзине добавленные товары суммируются к тому количеству что уже есть.
Требуется авторизация по JWT-токену
Request:
{
"products": [
{
"product": "produkt-1",
"count": 2
},
{
"product": "produkt-2",
"count": 1
}
]
}
Response:
{
"result": "success"
}
Status Code: 201 CREATE
Обновление корзины (PATCH/PUT /api/v1/shopping-cart/)
Обновление количества продуктов в корзине текущего пользователя. При наличие товара в корзине его количество обновляется на переданное
Требуется авторизация по JWT-токену
Request:
{
"products": [
{
"product": "produkt-1",
"count": 3
},
{
"product": "produkt-2",
"count": 1
}
]
}
Response:
{
"result": "success"
}
Status Code: 200 OK
Удаление из корзины (DELETE /api/v1/shopping-cart/)
Удаление продуктов из корзины текущего пользователя. При наличие товара в корзине его количество уменьшится на переданное количество, если количество снижается до 0, то товар удаляется из корзины
Требуется авторизация по JWT-токену
Request:
{
"products": [
{
"product": "produkt-1",
"count": 1
},
{
"product": "produkt-2",
"count": 1
}
]
}
Response:
{
"result": "success"
}
Status Code: 204 NO CONTENT
Очистка корзины (DELETE /api/v1/shopping-cart/clear/)
Полная очистка корзины текущего пользователя.
Требуется авторизация по JWT-токену
Response:
{
"result": "success"
}
Status Code: 204 NO CONTENT