allow to skip item by created
This commit is contained in:
@ -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 {
|
||||||
|
|||||||
@ -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")
|
||||||
|
|
||||||
|
|||||||
@ -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()
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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 {
|
||||||
|
|||||||
@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user