77 lines
1.9 KiB
Go
77 lines
1.9 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
messages "git.tornberg.me/go-cart-actor/pkg/messages"
|
|
)
|
|
|
|
// mutation_add_item.go
|
|
//
|
|
// Registers the AddItem cart mutation in the generic mutation registry.
|
|
// This replaces the legacy switch-based logic previously found in CartGrain.Apply.
|
|
//
|
|
// Behavior:
|
|
// * Validates quantity > 0
|
|
// * If an item with same SKU exists -> increases quantity
|
|
// * Else creates a new CartItem with computed tax amounts
|
|
// * Totals recalculated automatically via WithTotals()
|
|
//
|
|
// NOTE: Any future field additions in messages.AddItem that affect pricing / tax
|
|
// must keep this handler in sync.
|
|
|
|
func AddItem(g *CartGrain, m *messages.AddItem) error {
|
|
if m == nil {
|
|
return fmt.Errorf("AddItem: nil payload")
|
|
}
|
|
if m.Quantity < 1 {
|
|
return fmt.Errorf("AddItem: invalid quantity %d", m.Quantity)
|
|
}
|
|
|
|
// Fast path: merge with existing item having same SKU
|
|
if existing, found := g.FindItemWithSku(m.Sku); found {
|
|
existing.Quantity += int(m.Quantity)
|
|
return nil
|
|
}
|
|
|
|
g.mu.Lock()
|
|
defer g.mu.Unlock()
|
|
|
|
g.lastItemId++
|
|
taxRate := 2500
|
|
if m.Tax > 0 {
|
|
taxRate = int(m.Tax)
|
|
}
|
|
taxAmountPerUnit := GetTaxAmount(m.Price, taxRate)
|
|
|
|
g.Items = append(g.Items, &CartItem{
|
|
Id: g.lastItemId,
|
|
ItemId: int(m.ItemId),
|
|
Quantity: int(m.Quantity),
|
|
Sku: m.Sku,
|
|
Name: m.Name,
|
|
Price: m.Price,
|
|
TotalPrice: m.Price * int64(m.Quantity),
|
|
TotalTax: int64(taxAmountPerUnit * int64(m.Quantity)),
|
|
Image: m.Image,
|
|
Stock: StockStatus(m.Stock),
|
|
Disclaimer: m.Disclaimer,
|
|
Brand: m.Brand,
|
|
Category: m.Category,
|
|
Category2: m.Category2,
|
|
Category3: m.Category3,
|
|
Category4: m.Category4,
|
|
Category5: m.Category5,
|
|
OrgPrice: m.OrgPrice,
|
|
ArticleType: m.ArticleType,
|
|
Outlet: m.Outlet,
|
|
SellerId: m.SellerId,
|
|
SellerName: m.SellerName,
|
|
Tax: int(taxAmountPerUnit),
|
|
TaxRate: taxRate,
|
|
StoreId: m.StoreId,
|
|
})
|
|
g.UpdateTotals()
|
|
return nil
|
|
}
|