package cart import ( "context" "fmt" "log" "time" messages "git.k6n.net/go-cart-actor/pkg/messages" ) // mutation_remove_item.go // // Registers the RemoveItem mutation. // // Behavior: // - Removes the cart line whose local cart line Id == payload.Id // - If no such line exists returns an error // - Recalculates cart totals (WithTotals) // // Notes: // - This removes only the line item; any deliveries referencing the removed // item are NOT automatically adjusted (mirrors prior logic). If future // semantics require pruning delivery.item_ids you can extend this handler. // - If multiple lines somehow shared the same Id (should not happen), only // the first match would be removed—data integrity relies on unique line Ids. func (c *CartMutationContext) RemoveItem(g *CartGrain, m *messages.RemoveItem) error { if m == nil { return fmt.Errorf("RemoveItem: nil payload") } targetID := uint32(m.Id) index := -1 for i, it := range g.Items { if it.Id == targetID { index = i break } } if index == -1 { return fmt.Errorf("RemoveItem: item id %d not found", m.Id) } item := g.Items[index] if item.ReservationEndTime != nil && item.ReservationEndTime.After(time.Now()) { err := c.ReleaseItem(context.Background(), g.Id, item.Sku, item.StoreId) if err != nil { log.Printf("unable to release item reservation") } } g.Items = append(g.Items[:index], g.Items[index+1:]...) g.UpdateTotals() return nil }