forked from ebhomengo/niki
124 lines
2.6 KiB
Go
124 lines
2.6 KiB
Go
package repository
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"git.gocasts.ir/ebhomengo/niki/domain/shoppingbasket/entity"
|
|
"git.gocasts.ir/ebhomengo/niki/types"
|
|
"time"
|
|
)
|
|
|
|
type Config struct {
|
|
CacheKartKeyPrefix string `koanf:"cache_kart_key_prefix"`
|
|
CacheTTL time.Duration `koanf:"cache_ttl"`
|
|
|
|
MysqlTTL time.Duration `koanf:"mysql_ttl"`
|
|
}
|
|
|
|
type Repo struct {
|
|
db DB
|
|
cache Cache
|
|
}
|
|
|
|
func New(db DB, cache Cache) Repo {
|
|
return Repo{db: db, cache: cache}
|
|
}
|
|
|
|
func op(s string) string {
|
|
return fmt.Sprintf("shoppingbasketapp-repository-", s)
|
|
}
|
|
|
|
func (r Repo) AddItem(ctx context.Context, userID types.ID, item entity.Item) error {
|
|
if err := r.db.addToBasket(ctx, userID, item); err != nil {
|
|
return err
|
|
}
|
|
|
|
cart, err := r.db.getCart(ctx, nil, FindCartByUserIDQuery, userID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return r.cache.upsertCart(ctx, cart)
|
|
}
|
|
|
|
func (r Repo) GetCart(ctx context.Context, userID types.ID) (entity.Cart, error) {
|
|
cart, err := r.cache.getCart(ctx, userID)
|
|
if err != nil {
|
|
return entity.Cart{}, err
|
|
}
|
|
|
|
if cart.ID < 1 || len(cart.Items) < 1 {
|
|
c, err := r.db.getCart(ctx, nil, FindCartByUserIDQuery, userID)
|
|
if err != nil {
|
|
return entity.Cart{}, err
|
|
}
|
|
|
|
if c.ID < 1 {
|
|
return entity.Cart{}, nil
|
|
}
|
|
|
|
if err := r.cache.upsertCart(ctx, c); err != nil {
|
|
return entity.Cart{}, err
|
|
}
|
|
|
|
return c, nil
|
|
}
|
|
|
|
return cart, nil
|
|
}
|
|
|
|
func (r Repo) UpdateQuantity(ctx context.Context, cartID, itemID types.ID, quantity int) error {
|
|
|
|
cart, err := r.db.getCart(ctx, nil, FindCartByIDQuery, cartID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
for i, item := range cart.Items {
|
|
if item.ID == itemID {
|
|
cart.Items[i].Quantity = quantity
|
|
item.Quantity = quantity
|
|
if err := r.db.updateQuantity(ctx, nil, item); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
}
|
|
|
|
return r.cache.upsertCart(ctx, cart)
|
|
}
|
|
|
|
func (r Repo) UpdateStatus(ctx context.Context, cartID types.ID, status entity.CartStatus) error {
|
|
if err := r.db.updateCartStatus(ctx, nil, cartID, status); err != nil {
|
|
return err
|
|
}
|
|
|
|
cart, err := r.db.getCart(ctx, nil, FindCartByIDQuery, cartID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return r.cache.upsertCart(ctx, cart)
|
|
}
|
|
|
|
func (r Repo) DeleteItem(ctx context.Context, cartID, itemID types.ID) error {
|
|
if err := r.db.deleteItem(ctx, nil, cartID, itemID); err != nil {
|
|
return err
|
|
}
|
|
|
|
c, err := r.db.getCart(ctx, nil, FindCartByIDQuery, cartID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return r.cache.upsertCart(ctx, c)
|
|
}
|
|
|
|
func (r Repo) DeleteCart(ctx context.Context, cartID, userID types.ID) error {
|
|
|
|
if err := r.db.deleteCart(ctx, cartID, userID); err != nil {
|
|
return err
|
|
}
|
|
|
|
return r.cache.deleteCart(ctx, userID)
|
|
}
|