package cart import ( "context" richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error" "git.gocasts.ir/ebhomengo/niki/types" "time" ) type Repository interface { AddItem(ctx context.Context, userID types.ID, item Item) error GetCart(ctx context.Context, userID types.ID) (Cart, error) DeleteItem(ctx context.Context, userID, productID types.ID) error UpdateQuantity(ctx context.Context, userID, productID types.ID, quantity int) error DeleteCart(ctx context.Context, userID types.ID) error } type Service struct { validate Validate repo Repository } func New(val Validate, repo Repository) Service { return Service{validate: val, repo: repo} } func (s Service) AddToBasket(ctx context.Context, req AddToCartRequest) error { const op = "shoppingbasketapp.service.AddToBasket" if err := s.validate.ValidateAddToCart(req); err != nil { return err } return s.repo.AddItem(ctx, req.UserID, Item{ ProductID: req.ProductID, Quantity: req.Quantity, Price: req.Price, Name: req.Name, AddedAt: time.Now().UnixNano(), }) } func (s Service) GetCart(ctx context.Context, userID types.ID) (GetCartResponse, error) { const op = "shoppingbasketapp.service.GetCart" if userID < 1 { return GetCartResponse{}, richerror.New(op).WithKind(richerror.KindInvalid).WithMessage("invalid user id") } res, err := s.repo.GetCart(ctx, userID) if err != nil { return GetCartResponse{}, richerror.New(op).WithErr(err) } return GetCartResponse{ UserID: res.UserID, Items: res.Items, TotalPrice: res.TotalPrice, CreatedAt: res.CreatedAt, ExpireAt: res.ExpireAt, }, nil } func (s Service) RemoveFromCart(ctx context.Context, req RemoveFromCartRequest) error { const op = "shoppingbaskerapp.service.RemoveFromCart" if err := s.validate.ValidateRemoveFromCart(req); err != nil { return err } return s.repo.DeleteItem(ctx, req.UserID, req.ProductID) } func (s Service) UpdateQuantity(ctx context.Context, req UpdateQuantityRequest) error { const op = "shoppingbaskerapp.service.UpdateQuantity" if err := s.validate.ValidateUpdateQuantity(req); err != nil { return err } if req.Quantity == 0 { return s.repo.DeleteItem(ctx, req.UserID, req.ProductID) } return s.repo.UpdateQuantity(ctx, req.UserID, req.ProductID, req.Quantity) } func (s Service) ClearCart(ctx context.Context, userID types.ID) error { const op = "shoppingbaskerapp.service.ClearCart" if userID < 1 { return richerror.New(op).WithKind(richerror.KindInvalid). WithMessage("invalid user id") } return s.repo.DeleteCart(ctx, userID) }