From bb833561aa74f02970aee13cdc75973b29716491 Mon Sep 17 00:00:00 2001 From: leshe4ka46 Date: Mon, 27 Oct 2025 20:36:28 +0300 Subject: # This is a combination of 2 commits. # This is the 1st commit message: unmarshal all formats, merge them in the single table, users are truly unique # This is the commit message #2: i --- pkg/adapters/json/json.go | 35 ++++++++++++++++++++++++++++------- pkg/adapters/json/model.go | 40 +++++++++++++++++++++++++++------------- 2 files changed, 55 insertions(+), 20 deletions(-) (limited to 'pkg/adapters/json') diff --git a/pkg/adapters/json/json.go b/pkg/adapters/json/json.go index 47a563e..73d3ae8 100644 --- a/pkg/adapters/json/json.go +++ b/pkg/adapters/json/json.go @@ -2,14 +2,15 @@ package json import ( "bytes" - "context" "encoding/json" "fmt" + "os" "strings" "time" "airlines/pkg/model" - "airlines/pkg/store" + + "github.com/schollz/progressbar/v3" ) type DateYMD struct { @@ -97,11 +98,29 @@ type JsonCard struct { Number Trimmed `json:"Number"` } -func (r *JsonRoot) DumpToDb(ctx context.Context, s *store.Store) { +func UnmarshalJsonRoot(path string) (*JsonRoot, error) { + f, err := os.Open(path) + if err != nil { + panic(err) + } + defer f.Close() + + dec := json.NewDecoder(f) + var root JsonRoot + if err := dec.Decode(&root); err != nil { + return nil, err + } + return &root, nil +} + +func (r *JsonRoot) DumpToDb(store model.Store) { var err error - for _, user := range r.ForumProfiles { + bar := progressbar.Default(int64(len(r.ForumProfiles)), "dumping json") + + for i, user := range r.ForumProfiles { + bar.Set(i) dbUser, _ := user.ToUser() - dbUser, err = s.CreateOrGetUser(ctx, dbUser) + dbUser, err = store.SaveUser(dbUser) if err != nil { panic(err) } @@ -111,7 +130,8 @@ func (r *JsonRoot) DumpToDb(ctx context.Context, s *store.Store) { if err != nil { panic(err) } - _, err = s.AddCardsToUser(ctx, dbUser.ID, dbCard) + dbCard.UserID = dbUser.ID + _, err = store.SaveCard(dbCard) // данные говно if err != nil { fmt.Println(err) @@ -121,7 +141,8 @@ func (r *JsonRoot) DumpToDb(ctx context.Context, s *store.Store) { for _, flight := range user.RegisteredFlights { dbFlight, _ := flight.ToFlight() - _, err = s.AddFlightToUser(ctx, dbUser.ID, dbFlight) + dbFlight.UserID = dbUser.ID + _, err = store.SaveFlight(dbFlight) if err != nil { fmt.Println(err) } diff --git a/pkg/adapters/json/model.go b/pkg/adapters/json/model.go index 2cc5d8e..86d7321 100644 --- a/pkg/adapters/json/model.go +++ b/pkg/adapters/json/model.go @@ -2,10 +2,13 @@ package json import ( "strconv" + "strings" "time" "unicode" "airlines/pkg/model" + + "airlines/pkg/airports" ) func sOrEmpty(p *string) string { @@ -34,9 +37,9 @@ func onlyDigits(s string) string { func (jp JsonProfile) ToUser() (*model.User, error) { return &model.User{ - Name: sOrEmpty(jp.RealName.FirstName), - Surname: sOrEmpty(jp.RealName.LastName), - Nick: sOrEmpty(&jp.NickName), + Name: strings.ToUpper(sOrEmpty(jp.RealName.FirstName)), + Surname: strings.ToUpper(sOrEmpty(jp.RealName.LastName)), + Nick: strings.ToUpper(sOrEmpty(&jp.NickName)), Fathersname: "", Sex: jp.Sex, Birthday: model.SentinelBirthday(), @@ -44,16 +47,27 @@ func (jp JsonProfile) ToUser() (*model.User, error) { } func (jf JsonFlight) ToFlight() (*model.Flight, error) { - return &model.Flight{ - Number: jf.Flight, - From: jf.Departure.Airport, - FromCity: jf.Departure.City, - FromCountry: jf.Departure.Country, - To: jf.Arrival.Airport, - ToCity: jf.Arrival.City, - ToCountry: jf.Arrival.Country, - Date: jf.Date.ToDateUTC(), - }, nil + // lookup IATA codes for lat lon + f := &model.Flight{ + Number: jf.Flight, + From: strings.ToUpper(jf.Departure.Airport), + To: strings.ToUpper(jf.Arrival.Airport), + Date: jf.Date.ToDateUTC(), + } + + ap, _ := airports.LookupIATA(f.From) + f.FromCoords.Lat = ap.Latitude + f.FromCoords.Long = ap.Longitude + + loc := model.TzFromAirportRecord(ap) + departLocal := time.Date(f.Date.Year(), f.Date.Month(), f.Date.Day(), 0, 0, 0, 0, loc) + f.Date = departLocal.UTC() + + ap, _ = airports.LookupIATA(jf.Arrival.Airport) + f.ToCoords.Lat = ap.Latitude + f.ToCoords.Long = ap.Longitude + + return f, nil } func (jc JsonCard) ToCard() (*model.Card, error) { -- cgit v1.2.3