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
|
|||
|
}
|