95 lines
3.0 KiB
Go
95 lines
3.0 KiB
Go
package handler
|
||
|
||
import (
|
||
"math"
|
||
|
||
"gitlab.com/toby3d/test/internal/model"
|
||
"gitlab.com/toby3d/test/internal/model/store"
|
||
"golang.org/x/net/context"
|
||
)
|
||
|
||
// Handler представляет собой объект хендлеров с хранилищем данных
|
||
type Handler struct {
|
||
cartManager store.CartManager
|
||
productReader store.ProductReader
|
||
}
|
||
|
||
// NewHandler создаёт хендлеры сервера с указанным хранилищем
|
||
func NewHandler(cartManager store.CartManager, productReader store.ProductReader) *Handler {
|
||
return &Handler{
|
||
cartManager: cartManager,
|
||
productReader: productReader,
|
||
}
|
||
}
|
||
|
||
// Add добавляет объект в хранилище (если его не существует) или обновляет количество существующего объекта
|
||
func (h *Handler) Add(ctx context.Context, req *model.AddRequest) (*model.Response, error) {
|
||
var resp model.Response
|
||
|
||
if err := h.cartManager.Add(&model.Item{
|
||
ProductId: req.GetProductId(),
|
||
Quanity: req.GetQuanity(),
|
||
}); err != nil {
|
||
resp.Description = err.Error()
|
||
return &resp, err
|
||
}
|
||
|
||
resp.Ok = true
|
||
resp.Result = &model.Response_Item{Item: h.cartManager.GetById(req.GetProductId())}
|
||
return &resp, nil
|
||
}
|
||
|
||
func (h *Handler) Get(ctx context.Context, req *model.GetRequest) (*model.Response, error) {
|
||
var resp model.Response
|
||
|
||
var result model.Cart
|
||
count, items := h.cartManager.GetList()
|
||
result.Items = items
|
||
result.ItemsCount = int32(count)
|
||
for _, item := range items {
|
||
result.QuanityCount += item.GetQuanity()
|
||
product := h.productReader.GetById(item.GetProductId())
|
||
result.TotalPrice += product.GetPrice() * float32(item.GetQuanity())
|
||
}
|
||
// NOTE(toby3d): округляем до двух знаков после запятой
|
||
result.TotalPrice = float32(math.Round(float64(result.GetTotalPrice())*100) / 100)
|
||
|
||
resp.Ok = true
|
||
resp.Result = &model.Response_Cart{Cart: &result}
|
||
return &resp, nil
|
||
}
|
||
|
||
// Update обновляет конкретные товары в корзине.
|
||
func (h *Handler) Update(ctx context.Context, req *model.UpdateRequest) (*model.Response, error) {
|
||
var resp model.Response
|
||
|
||
if err := h.cartManager.Update(&model.Item{
|
||
ProductId: req.GetProductId(),
|
||
Quanity: req.GetQuanity(),
|
||
}); err != nil {
|
||
resp.Description = err.Error()
|
||
return &resp, err
|
||
}
|
||
|
||
// NOTE(toby3d): Если количество отрицательно, то Result должен быть пустой как и в случае Remove
|
||
if req.GetQuanity() > 0 {
|
||
resp.Result = &model.Response_Item{Item: h.cartManager.GetById(req.GetProductId())}
|
||
}
|
||
|
||
resp.Ok = true
|
||
return &resp, nil
|
||
}
|
||
|
||
// Remove удаляет конкретные товары в корзине вне зависимости от их количества.
|
||
func (h *Handler) Remove(ctx context.Context, req *model.RemoveRequest) (*model.Response, error) {
|
||
var resp model.Response
|
||
|
||
if err := h.cartManager.Delete(req.GetProductId()); err != nil {
|
||
resp.Description = err.Error()
|
||
return &resp, err
|
||
}
|
||
|
||
resp.Ok = true
|
||
return &resp, nil
|
||
}
|