package json import ( "bytes" "context" "encoding/json" "fmt" "strings" "time" "airlines/pkg/model" "airlines/pkg/store" ) type DateYMD struct { time.Time Valid bool } func (d *DateYMD) UnmarshalJSON(b []byte) error { nb := bytes.TrimSpace(b) if bytes.Equal(nb, []byte("null")) { *d = DateYMD{} return nil } var s string if err := json.Unmarshal(nb, &s); err != nil { return err } if s == "" { *d = DateYMD{} return nil } t, err := time.Parse("2006-01-02", s) if err != nil { return err } d.Time = t d.Valid = true return nil } /*----- Trimmed string (for loyalty Number: " 889..." ) -----*/ type Trimmed string func (t *Trimmed) UnmarshalJSON(b []byte) error { var raw *string if err := json.Unmarshal(b, &raw); err != nil { return err } if raw == nil { *t = "" return nil } *t = Trimmed(strings.TrimSpace(*raw)) return nil } type JsonRoot struct { ForumProfiles []JsonProfile `json:"Forum Profiles"` } type JsonProfile struct { NickName string `json:"NickName"` Sex model.Sex `json:"Sex"` RegisteredFlights []JsonFlight `json:"Registered Flights"` TravelDocuments []TravelDoc `json:"Travel Documents"` LoyaltyProgram []JsonCard `json:"Loyality Programm"` RealName RealName `json:"Real Name"` } type RealName struct { LastName *string `json:"Last Name"` FirstName *string `json:"First Name"` } type TravelDoc struct { Passports any `json:"Passports"` } type JsonFlight struct { Date DateYMD `json:"Date"` Codeshare bool `json:"Codeshare"` Flight string `json:"Flight"` Arrival JsonPlace `json:"Arrival"` Departure JsonPlace `json:"Departure"` } type JsonPlace struct { City string `json:"City"` Airport string `json:"Airport"` Country string `json:"Country"` } type JsonCard struct { Status string `json:"Status"` Program string `json:"programm"` Number Trimmed `json:"Number"` } func (r *JsonRoot) DumpToDb(ctx context.Context, s *store.Store) { var err error for _, user := range r.ForumProfiles { dbUser := user.ToUser() dbUser, err = s.CreateOrGetUser(ctx, dbUser) if err != nil { panic(err) } for _, card := range user.LoyaltyProgram { dbCard, err := card.ToCard() if err != nil { panic(err) } _, err = s.AddCardsToUser(ctx, dbUser.ID, dbCard) // данные говно if err != nil { fmt.Println(err) } } for _, flight := range user.RegisteredFlights { dbFlight := flight.ToFlight() _, err = s.AddFlightToUser(ctx, dbUser.ID, dbFlight) if err != nil { fmt.Println(err) } } } }