allow to skip item by created

This commit is contained in:
Aleksandr Trushkin
2024-02-04 22:13:39 +03:00
parent a224f249d5
commit e91eec7aeb
7 changed files with 51 additions and 3 deletions

View File

@ -15,6 +15,7 @@ table GoodItem {
cart:long; cart:long;
stock:short; stock:short;
parameters:string; parameters:string;
created_at:long;
} }
table GoodItems { table GoodItems {

View File

@ -899,6 +899,7 @@ func parseEwayDumpAction(ctx context.Context, cmd *cli.Command) error {
fetchedInfo int fetchedInfo int
handledAll int handledAll int
cachedInfo int cachedInfo int
skippedItem int
}{} }{}
startFrom := time.Now() startFrom := time.Now()
@ -934,6 +935,14 @@ func parseEwayDumpAction(ctx context.Context, cmd *cli.Command) error {
for _, item := range items { for _, item := range items {
var pi entity.GoodsItemInfo var pi entity.GoodsItemInfo
seenItem := seenItems[item.SKU] seenItem := seenItems[item.SKU]
if time.Since(seenItem.CreatedAt) < time.Hour*24 {
logger.Debug().Str("sku", item.SKU).Msg("skipping item because it's too fresh")
stats.skippedItem++
itemsUpdated[item.SKU] = struct{}{}
continue
}
if len(seenItem.Parameters) != 0 && len(seenItem.PhotoURLs) != 0 { if len(seenItem.Parameters) != 0 && len(seenItem.PhotoURLs) != 0 {
pi.Parameters = seenItem.Parameters pi.Parameters = seenItem.Parameters
pi.PhotoURLs = seenItem.PhotoURLs pi.PhotoURLs = seenItem.PhotoURLs
@ -1015,6 +1024,7 @@ func parseEwayDumpAction(ctx context.Context, cmd *cli.Command) error {
Int("handled", stats.handledAll). Int("handled", stats.handledAll).
Int("cached", stats.cachedInfo). Int("cached", stats.cachedInfo).
Int("fetched", stats.fetchedInfo). Int("fetched", stats.fetchedInfo).
Int("skipped", stats.skippedItem).
Int("to_delete", len(seenItems)). Int("to_delete", len(seenItems)).
Msg("processed items") Msg("processed items")

View File

@ -177,8 +177,20 @@ func (rcv *GoodItem) Parameters() []byte {
return nil return nil
} }
func (rcv *GoodItem) CreatedAt() int64 {
o := flatbuffers.UOffsetT(rcv._tab.Offset(32))
if o != 0 {
return rcv._tab.GetInt64(o + rcv._tab.Pos)
}
return 0
}
func (rcv *GoodItem) MutateCreatedAt(n int64) bool {
return rcv._tab.MutateInt64Slot(32, n)
}
func GoodItemStart(builder *flatbuffers.Builder) { func GoodItemStart(builder *flatbuffers.Builder) {
builder.StartObject(14) builder.StartObject(15)
} }
func GoodItemAddSku(builder *flatbuffers.Builder, sku flatbuffers.UOffsetT) { func GoodItemAddSku(builder *flatbuffers.Builder, sku flatbuffers.UOffsetT) {
builder.PrependUOffsetTSlot(0, flatbuffers.UOffsetT(sku), 0) builder.PrependUOffsetTSlot(0, flatbuffers.UOffsetT(sku), 0)
@ -222,6 +234,9 @@ func GoodItemAddStock(builder *flatbuffers.Builder, stock int16) {
func GoodItemAddParameters(builder *flatbuffers.Builder, parameters flatbuffers.UOffsetT) { func GoodItemAddParameters(builder *flatbuffers.Builder, parameters flatbuffers.UOffsetT) {
builder.PrependUOffsetTSlot(13, flatbuffers.UOffsetT(parameters), 0) builder.PrependUOffsetTSlot(13, flatbuffers.UOffsetT(parameters), 0)
} }
func GoodItemAddCreatedAt(builder *flatbuffers.Builder, createdAt int64) {
builder.PrependInt64Slot(14, createdAt, 0)
}
func GoodItemEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT { func GoodItemEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT {
return builder.EndObject() return builder.EndObject()
} }

View File

@ -6,6 +6,7 @@ import (
"fmt" "fmt"
"strings" "strings"
"sync" "sync"
"time"
"git.loyso.art/frx/eway/internal/entity" "git.loyso.art/frx/eway/internal/entity"
@ -98,6 +99,7 @@ func makeDomainGoodItem(builder *flatbuffers.Builder, in entity.GoodsItem) flatb
GoodItemAddCart(builder, int64(in.Cart)) GoodItemAddCart(builder, int64(in.Cart))
GoodItemAddStock(builder, int16(in.Stock)) GoodItemAddStock(builder, int16(in.Stock))
GoodItemAddParameters(builder, parameters) GoodItemAddParameters(builder, parameters)
GoodItemAddCreatedAt(builder, in.CreatedAt.Unix())
return GoodItemEnd(builder) return GoodItemEnd(builder)
} }
@ -134,6 +136,11 @@ func ParseGoodsItem(data []byte) (item entity.GoodsItem, err error) {
} }
} }
createdAt := itemFBS.CreatedAt()
if createdAt > 0 {
item.CreatedAt = time.Unix(createdAt, 0)
}
return item, nil return item, nil
} }

View File

@ -4,6 +4,7 @@ import (
"fmt" "fmt"
"strconv" "strconv"
"strings" "strings"
"time"
"unicode" "unicode"
) )
@ -22,6 +23,7 @@ type GoodsItem struct {
Cart int64 `json:"cart"` Cart int64 `json:"cart"`
Stock int `json:"stock"` Stock int `json:"stock"`
Parameters map[string]string `json:"parameters"` Parameters map[string]string `json:"parameters"`
CreatedAt time.Time `json:"created_at"`
} }
type GoodsItemRaw struct { type GoodsItemRaw struct {

View File

@ -325,7 +325,18 @@ func (c client) GetProductInfo(ctx context.Context, cart int64) (pi entity.Goods
}) })
}) })
err = collector.Visit("https://eway.elevel.ru/product/" + strconv.Itoa(int(cart)) + "/") for i := 0; i < 3; i++ {
err = collector.Visit("https://eway.elevel.ru/product/" + strconv.Itoa(int(cart)) + "/")
if err != nil {
c.log.Warn().Err(err).Msg("unable to visit site, retrying...")
select {
case <-time.After(time.Second * 2):
continue
case <-ctx.Done():
return pi, ctx.Err()
}
}
}
if err != nil { if err != nil {
return pi, fmt.Errorf("visiting site: %w", err) return pi, fmt.Errorf("visiting site: %w", err)
} }

View File

@ -248,18 +248,20 @@ func (c *goodsItemClient) upsertByBatch(ctx context.Context, items []entity.Good
batch := c.db.NewWriteBatch() batch := c.db.NewWriteBatch()
defer batch.Cancel() defer batch.Cancel()
createdAt := time.Now()
err := func() error { err := func() error {
for _, item := range items { for _, item := range items {
if ctx.Err() != nil { if ctx.Err() != nil {
return ctx.Err() return ctx.Err()
} }
key := c.prefixedStr(item.Articul) item.CreatedAt = createdAt
value, err := c.s.Serialize(item) value, err := c.s.Serialize(item)
if err != nil { if err != nil {
return fmt.Errorf("serializing item: %w", err) return fmt.Errorf("serializing item: %w", err)
} }
key := c.prefixedStr(item.Articul)
idxValue := make([]byte, len(key)) idxValue := make([]byte, len(key))
copy(idxValue, key) copy(idxValue, key)