81 lines
2.3 KiB
Go
81 lines
2.3 KiB
Go
package repository
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"fmt"
|
|
"os"
|
|
"time"
|
|
|
|
dbgen "github.com/SamuelTariku/FortuneBet-Backend/gen/db"
|
|
"github.com/SamuelTariku/FortuneBet-Backend/internal/domain"
|
|
"github.com/jackc/pgx/v5/pgtype"
|
|
)
|
|
|
|
func (s *Store) SaveNonLiveOdd(ctx context.Context, m domain.Market) error {
|
|
rawOddsBytes, _ := json.Marshal(m.Odds)
|
|
|
|
params := dbgen.InsertNonLiveOddParams{
|
|
EventID: pgtype.Text{String: m.EventID, Valid: m.EventID != ""},
|
|
Fi: pgtype.Text{String: m.FI, Valid: m.FI != ""},
|
|
RawEventID: pgtype.Text{String: m.EventID, Valid: m.EventID != ""},
|
|
MarketType: m.MarketType,
|
|
MarketName: pgtype.Text{String: m.MarketName, Valid: m.MarketName != ""},
|
|
MarketCategory: pgtype.Text{String: m.MarketCategory, Valid: m.MarketCategory != ""},
|
|
MarketID: pgtype.Text{String: m.MarketID, Valid: m.MarketID != ""},
|
|
Header: pgtype.Text{String: "", Valid: false},
|
|
Name: pgtype.Text{String: "", Valid: false},
|
|
Handicap: pgtype.Text{String: "", Valid: false},
|
|
OddsValue: pgtype.Float8{Float64: 0, Valid: false},
|
|
Section: m.MarketCategory,
|
|
Category: pgtype.Text{String: "", Valid: false},
|
|
RawOdds: rawOddsBytes,
|
|
}
|
|
|
|
err := s.queries.InsertNonLiveOdd(ctx, params)
|
|
if err != nil {
|
|
fmt.Printf("❌ Failed to insert/upsert market: event_id=%s | market_type=%s | err=%v\n",
|
|
m.EventID, m.MarketType, err)
|
|
_ = writeFailedMarketLog(m, err)
|
|
} else {
|
|
fmt.Printf("✅ Upserted market: event_id=%s | market_type=%s\n", m.EventID, m.MarketType)
|
|
}
|
|
|
|
return err
|
|
}
|
|
|
|
func writeFailedMarketLog(m domain.Market, err error) error {
|
|
logDir := "logs"
|
|
logFile := logDir + "/failed_markets.log"
|
|
|
|
if mkErr := os.MkdirAll(logDir, 0755); mkErr != nil {
|
|
return mkErr
|
|
}
|
|
|
|
f, fileErr := os.OpenFile(logFile, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
|
|
if fileErr != nil {
|
|
return fileErr
|
|
}
|
|
defer f.Close()
|
|
|
|
entry := struct {
|
|
Time string `json:"time"`
|
|
Error string `json:"error"`
|
|
Record domain.Market `json:"record"`
|
|
}{
|
|
Time: time.Now().Format(time.RFC3339),
|
|
Error: err.Error(),
|
|
Record: m,
|
|
}
|
|
|
|
jsonData, _ := json.MarshalIndent(entry, "", " ")
|
|
_, writeErr := f.WriteString(string(jsonData) + "\n\n")
|
|
return writeErr
|
|
}
|
|
|
|
|
|
|
|
func (s *Store) GetUpcomingEventIDs(ctx context.Context) ([]string, error) {
|
|
return s.queries.GetUpcomingEventIDs(ctx)
|
|
}
|