Giter Site home page Giter Site logo

48170360shop's Introduction

Тестовое задание: Реализовать API для небольшого интернет магазина.

Реализовано на базе:

  • Golang & PostgreSQL.
  • Структура модулей (папок) согласно golang-standards/project-layout.
  • Основная логика запросов вынесена в функции (stored procedures) PostgreSQL. Функции сохранены в бекапе БД.
  • Провайдер БД jmoiron/sqlx.
  • В качестве ключа строк корзины взят тип UUID.
  • Основой для API взят go-chi/chi. Выбран как быстрый по тестам.
  • Аутенификация токиеном на базе go-chi/jwtauth. Не лучший вариант, достаточно сырая.
  • Валидация при помощи go-ozzo/ozzo-validation реализована через методы (не через теги структуры), что снижает возможность ошибки разработчика.
  • API протестировано Postman. Исходники Postman находятся в test/postman.
  • Начато прописывание комментариев для автоматической генерации swagger.json (находится в папке docs).

Возможности API:

Реализовано на связке REST+JSON.

Для покупателя

  • Смотреть список товаров и цены.
  • Добавлять и убавлять товары в корзине. При вводе отрицательного значения количество товара уменьшается на эту величину. При нулевом количестве товар удаляется. При попытке получить отрицательное количество БД возвращает ошибку.
  • При этом покупателю возвращается итоговый список товаров в его корзине с промежуточной и общей суммой.
[
    {
        "name": "апельсины",
        "price": "170.40 руб",
        "goods_q": 6,
        "sum": "1 022.40 руб"
    },
    {
        "name": "картофель",
        "price": "45.34 руб",
        "goods_q": 2,
        "sum": "90.68 руб"
    },
    {
        "name": "Сумма:",
        "price": "0.00 руб",
        "goods_q": 0,
        "sum": "1 113.08 руб"
    }
]
  • Покупать товар, то есть уменьшать количество товара на складе на количество товара в корзине с одновременным ее удалением.

Для менеджера

  • Смотреть все корзины покупателей.
  • Добавлять в список товаров новый товар. При этом название товара является уникальным, нельзя добавить товар с тем же названием.
  • Изменять количество товаров на складе (store) на положительную или отрицательную величину. В ответ БД возвращает текущее количество. При попытке получить отрицательное количество возвращает ошибку.

Роли покупателя и менеджера ограничены, при попытке покупателя выполнить операции менеджера или наоборот БД вернет ошибку:

   IF NOT EXISTS (SELECT * FROM b_users JOIN a_user_type USING(type_id) WHERE b_users.account = user_name AND a_user_type.type = 'manager')
   THEN RAISE EXCEPTION 'Denied user --> %', user_name USING HINT = 'Please check your rights';
   END IF;

Сборка и запуск

Для

$ psql -V
(PostgreSQL) 13.3
  1. Создать в PostgreSQL БД smallshop и восстановить в нее backup
$ psql -h localhost -U postgres -d smallshop -f configs/sql/211024backup.sql
  1. Добавить параметры соединения с вашей БД в configs/config.toml
[database]
Host     ="localhost"
Port     ="5432"
User     ="postgres"
Password ="pass"
NameDB   ="smallshop"
$ go run cmd/main.go
  1. Postman -> Import (Ctrl+O) -> test/postmanshop.postman_collection.json

API Postman description
[user auth] Авторизация user (в БД есть user1, user2, user3 с одинаковым паролем userpass)
[user get googs list] Возвращает список товаров и цен из таблицы c_goods
[user put into basket] Добавляет/убавляет товары в корзине, возвращает содержимое корзины (см. выше)
"goods_add": "1" добавляет к количеству +1 товар, "goods_add": "5" добавляет 5,
"goods_add": "-1" убавляет -1 товар, и т.д.
[user buy] Сокращает склад (c_goods.store) на количество товара в корзине и удаляет корзину
[user auth check] Проверка авторизации пользователя, возвращает user_name
[user auth logout] Logout текущего аккаунта
Роль менеджера
[manager auth] Авторизация user (в БД есть manager1 с паролем manager1pass)
[manager get baskets] Просмотр всех корзин (содержание таблицы d_basket сгруппированое по user_id)
[manager new goods] Добавление нового товара (название, количество, цена) в таблицу c_goods
[manager add to store] Изменение остатков на складе (c_goods.store),
Например, "goods_add": "-6" уменьшает количество на 6

48170360shop's People

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.