Files
2026-01-17 22:45:02 +03:00

81 lines
1.9 KiB
Go

package steamreq
import (
"context"
"log/slog"
"os"
"steam_analyzer/internal/domain"
"steam_analyzer/internal/utils/slogutils"
"strconv"
"time"
)
type IRequester interface {
GetItem(query string, itemType string) ([]SteamMarketItem, error)
}
type ItemService interface {
AddItemWithHistory(ctx context.Context, item domain.SteamItem) error
}
type SteamReqWorker struct {
logger *slog.Logger
requester IRequester
itemService ItemService
reqPer time.Duration
}
func NewSteamWorker(logger *slog.Logger, requester IRequester, itemService ItemService, reqPer time.Duration) *SteamReqWorker {
return &SteamReqWorker{
logger: logger,
requester: requester,
itemService: itemService,
reqPer: reqPer,
}
}
type SteamItems struct {
Query string
ItemType string
}
func (w SteamReqWorker) Start(ctx context.Context, items []SteamItems) {
for {
for _, item := range items {
items, err := w.requester.GetItem(item.Query, item.ItemType)
if err != nil {
w.logger.Error("Error while request item from steam", slogutils.Error(err))
os.Exit(1)
}
w.logger.Info("Succesfully get items", slog.String("items count is", strconv.Itoa(len(items))))
domainItems := CreateItemsFromRequest(items)
for _, domainItem := range domainItems {
err := w.itemService.AddItemWithHistory(ctx, domainItem)
if err != nil {
w.logger.Error("Error while adding item with history", slogutils.Error(err))
}
}
}
time.Sleep(w.reqPer)
}
}
func CreateItemsFromRequest(smi []SteamMarketItem) []domain.SteamItem {
steamItem := make([]domain.SteamItem, 0, len(smi))
for _, item := range smi {
steamItem = append(steamItem, domain.SteamItem{
Name: item.Name,
ClassID: item.AssetDescription.Classid,
GameID: item.AssetDescription.Appid,
Price: item.SellPrice,
Count: item.SellListings,
})
}
return steamItem
}