actualize items list in db
This commit is contained in:
@ -21,11 +21,20 @@ const useJSON = false
|
||||
|
||||
type goodsItemClient struct {
|
||||
db *badger.DB
|
||||
|
||||
s itemSerializer[entity.GoodsItem]
|
||||
}
|
||||
|
||||
func newGoodsItemClient(db *badger.DB) *goodsItemClient {
|
||||
func newGoodsItemClient(db *badger.DB, serializeAsJSON bool) *goodsItemClient {
|
||||
var s itemSerializer[entity.GoodsItem]
|
||||
if serializeAsJSON {
|
||||
s = goodsItemJSONSerializer{}
|
||||
} else {
|
||||
s = goodsItemFlatbufSerializer{}
|
||||
}
|
||||
return &goodsItemClient{
|
||||
db: db,
|
||||
s: s,
|
||||
}
|
||||
}
|
||||
|
||||
@ -68,17 +77,9 @@ func (c *goodsItemClient) ListIter(
|
||||
|
||||
for _, kv := range list.GetKv() {
|
||||
var gooditem entity.GoodsItem
|
||||
|
||||
if useJSON {
|
||||
err = json.Unmarshal(kv.GetValue(), &gooditem)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
} else {
|
||||
gooditem, err = fbs.ParseGoodsItem(kv.GetValue())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
gooditem, err = c.s.Deserialize(kv.GetValue())
|
||||
if err != nil {
|
||||
return fmt.Errorf("deserializing item: %w", err)
|
||||
}
|
||||
|
||||
bus <- gooditem
|
||||
@ -94,7 +95,6 @@ func (c *goodsItemClient) ListIter(
|
||||
if err != nil {
|
||||
zerolog.Ctx(ctx).Warn().Err(err).Msg("unable to orchestrate")
|
||||
}
|
||||
println("finished")
|
||||
}(ctx)
|
||||
|
||||
return bus, nil
|
||||
@ -117,17 +117,11 @@ func (c *goodsItemClient) List(
|
||||
current := iter.Item()
|
||||
err = current.Value(func(val []byte) error {
|
||||
var goodsItem entity.GoodsItem
|
||||
if useJSON {
|
||||
err := json.Unmarshal(val, &goodsItem)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
} else {
|
||||
goodsItem, err = fbs.ParseGoodsItem(val)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
goodsItem, err = c.s.Deserialize(val)
|
||||
if err != nil {
|
||||
return fmt.Errorf("deserializing: %w", err)
|
||||
}
|
||||
|
||||
out = append(out, goodsItem)
|
||||
|
||||
return nil
|
||||
@ -201,6 +195,28 @@ func (c *goodsItemClient) UpsertMany(ctx context.Context, items ...entity.GoodsI
|
||||
return items, c.upsertByBatch(ctx, items)
|
||||
}
|
||||
|
||||
func (c *goodsItemClient) Delete(ctx context.Context, sku string) (out entity.GoodsItem, err error) {
|
||||
err = c.db.Update(func(txn *badger.Txn) error {
|
||||
skuKey := c.prefixedStr(sku)
|
||||
out, err = c.getBySKU(skuKey, txn)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = txn.Delete(skuKey)
|
||||
if err != nil {
|
||||
return fmt.Errorf("deleting key: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
return entity.GoodsItem{}, err
|
||||
}
|
||||
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func (c *goodsItemClient) upsertByBatch(ctx context.Context, items []entity.GoodsItem) error {
|
||||
batch := c.db.NewWriteBatch()
|
||||
defer batch.Cancel()
|
||||
@ -214,11 +230,9 @@ func (c *goodsItemClient) upsertByBatch(ctx context.Context, items []entity.Good
|
||||
}
|
||||
|
||||
key := c.prefixedStr(item.Articul)
|
||||
var value []byte
|
||||
if useJSON {
|
||||
value, _ = json.Marshal(item)
|
||||
} else {
|
||||
value = fbs.MakeDomainGoodItemFinished(item)
|
||||
value, err := c.s.Serialize(item)
|
||||
if err != nil {
|
||||
return fmt.Errorf("serializing item: %w", err)
|
||||
}
|
||||
|
||||
idxValue := make([]byte, len(key))
|
||||
@ -257,17 +271,43 @@ func (c *goodsItemClient) getBySKU(sku []byte, txn *badger.Txn) (out entity.Good
|
||||
}
|
||||
|
||||
err = item.Value(func(val []byte) error {
|
||||
if useJSON {
|
||||
return json.Unmarshal(val, &out)
|
||||
}
|
||||
|
||||
out, err = fbs.ParseGoodsItem(val)
|
||||
out, err = c.s.Deserialize(val)
|
||||
return err
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
return out, fmt.Errorf("reading value: %w", err)
|
||||
}
|
||||
|
||||
return out, nil
|
||||
}
|
||||
|
||||
type itemSerializer[T any] interface {
|
||||
Serialize(T) ([]byte, error)
|
||||
Deserialize([]byte) (T, error)
|
||||
}
|
||||
|
||||
type goodsItemJSONSerializer struct{}
|
||||
|
||||
func (goodsItemJSONSerializer) Serialize(in entity.GoodsItem) ([]byte, error) {
|
||||
return json.Marshal(in)
|
||||
}
|
||||
|
||||
func (goodsItemJSONSerializer) Deserialize(data []byte) (in entity.GoodsItem, err error) {
|
||||
err = json.Unmarshal(data, &in)
|
||||
return in, err
|
||||
}
|
||||
|
||||
type goodsItemFlatbufSerializer struct{}
|
||||
|
||||
func (goodsItemFlatbufSerializer) Serialize(in entity.GoodsItem) ([]byte, error) {
|
||||
out := fbs.MakeDomainGoodItemFinished(in)
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func (goodsItemFlatbufSerializer) Deserialize(data []byte) (out entity.GoodsItem, err error) {
|
||||
out, err = fbs.ParseGoodsItem(data)
|
||||
if err != nil {
|
||||
return entity.GoodsItem{}, err
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user