- 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).
Реализовано на связке 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
- Создать в PostgreSQL БД smallshop и восстановить в нее backup
$ psql -h localhost -U postgres -d smallshop -f configs/sql/211024backup.sql
- Добавить параметры соединения с вашей БД в configs/config.toml
[database]
Host ="localhost"
Port ="5432"
User ="postgres"
Password ="pass"
NameDB ="smallshop"
$ go run cmd/main.go
- 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 |