set deliveries on all items

This commit is contained in:
matst80
2024-11-11 13:22:28 +01:00
parent 1c31ff9d80
commit c4572bf057
4 changed files with 212 additions and 17 deletions

View File

@@ -3,6 +3,7 @@ package main
import (
"encoding/json"
"fmt"
"slices"
"time"
messages "git.tornberg.me/go-cart-actor/proto"
@@ -118,6 +119,43 @@ func (c *CartGrain) GetStorageMessage(since int64) []StorableMessage {
return ret
}
func (c *CartGrain) GetState() ([]byte, error) {
return json.Marshal(c)
}
func (c *CartGrain) ItemsWithDelivery() []int {
ret := make([]int, 0, len(c.Items))
for _, item := range c.Items {
for _, delivery := range c.Deliveries {
for _, id := range delivery.Items {
if item.Id == id {
ret = append(ret, id)
}
}
}
}
return ret
}
func (c *CartGrain) ItemsWithoutDelivery() []int {
ret := make([]int, 0, len(c.Items))
hasDelivery := c.ItemsWithDelivery()
for _, item := range c.Items {
found := false
for _, id := range hasDelivery {
if item.Id == id {
found = true
break
}
}
if !found {
ret = append(ret, item.Id)
}
}
return ret
}
func (c *CartGrain) HandleMessage(message *Message, isReplay bool) ([]byte, error) {
if message.TimeStamp == nil {
now := time.Now().Unix()
@@ -195,18 +233,26 @@ func (c *CartGrain) HandleMessage(message *Message, isReplay bool) ([]byte, erro
}
}
}
case AddDeliveryType:
case SetDeliveryType:
msg, ok := message.Content.(*messages.SetDelivery)
if !ok {
err = fmt.Errorf("expected SetDelivery")
} else {
c.lastDeliveryId++
items := make([]int, 0)
for _, id := range msg.Items {
for _, item := range c.Items {
if item.Id == int(id) {
items = append(items, int(item.Id))
break
withDelivery := c.ItemsWithDelivery()
if len(msg.Items) == 0 {
items = append(items, c.ItemsWithoutDelivery()...)
} else {
for _, id := range msg.Items {
for _, item := range c.Items {
if item.Id == int(id) {
if slices.Contains(withDelivery, item.Id) {
return nil, fmt.Errorf("item already has delivery")
}
items = append(items, int(item.Id))
break
}
}
}
}