Skip to content

NECROshizo/grocery-store

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

7 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Grocery-store

Описание

Backend сервис для магазина продуктов.

Технологии

Python PostgreSQL Docker

Django Django Rest Framework Gunicorn

Ruff Pre-commit

Требования

Чек лист с требованиями
  • Управление категориями и подкатегориями

    • Должна быть реализована возможность создания, редактирования, удаления категорий и подкатегорий товаров в админке.
    • Категории и подкатегории обязательно должны иметь наименование, slug-имя, изображение.
    • Подкатегории должны быть связаны с родительской категорией.
    • Должен быть реализован эндпоинт для просмотра всех категорий с подкатегориями. Должна быть предусмотрена пагинация.
  • Управление продуктами

    • Должна быть реализована возможность добавления, изменения, удаления продуктов в админке.
    • Продукты должны относится к определенной подкатегории и, соответственно, категории. Должны иметь наименование, slug-имя, изображение в 3-х размерах, цену.
    • Должен быть реализован эндпоинт вывода продуктов с пагинацией. Каждый продукт в выводе должен иметь поля: наименование, slug, категория, подкатегория, цена, список изображений.
  • Корзина

    • Реализовать эндпоинт добавления, изменения (изменение количества), удаления продукта в корзине.
    • Реализовать эндпоинт вывода состава корзины с подсчетом количества товаров и суммы стоимости товаров в корзине.
    • Реализовать возможность полной очистки корзины.
  • Права доступа

    • Операции по эндпоинтам категорий и продуктов может осуществлять любой пользователь.
    • Операции по эндпоинтам корзины может осуществлять только авторизированный пользователь и только со своей корзиной.
  • Авторизация

    • Реализовать авторизацию по токену.
  • Дополнительно

    • Подключенны pre-commit.
    • Настроен линтер ruff.
    • Реализованна возможность добавлять товары списком.
    • Реализован запуск проекта в Docker.

Запуск проекта

Запуск локально с помощью Docker

  1. Клонировать репозиторий.

    git clone git@github.com:NECROshizo/grocery-store.git
    cd grocery-store
  2. Создайте и заполните файл .env согласно шаблону .env.example.

  3. Перейдите в директорию infra и соберите и запустите контейнеры с помощью Docker Compose.

    cd infra
    docker-compose -f docker-compose.local.yaml up --build
  4. Для остановки контейнеров используйте команду:

    docker-compose -f docker-compose.local.yaml down

Теперь ваш проект запущен.

Настройка и запуск локально для разработки

Проект использует Poetry как инструмент управления зависимостями.

  1. Клонировать репозиторий.

    git clone git@github.com:NECROshizo/grocery-store.git
    cd diary-workout-tracker-backend
  2. Создание и активация виртуального окружения при помощи 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.

  1. Инициализация pre-commit.

    poetry run pre-commit install
  2. Создайте и заполните файл .env согласно шаблону .env.example.

  3. Сапуск postgresql(при необходимости):

cd infra/
docker-compose -f docker-compose.local.yaml up --build
cd ..
  1. Запустите проект с выполнив следующие команды вручную:

    При первом запуске:

    python backend/manage.py migrate
    python backend/manage.py collectstatic --noinput

    Для последующих запусков:

    python backend/manage.py runserver

Теперь ваш проект должен быть настроен и готов к локальной разработке.

Описание эндпоинтов

Эндпоинты авторизации (JWT)

Создание пользователя (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