package json import ( "bytes" "encoding/json" "fmt" "os" "strings" "time" "airlines/pkg/model" "github.com/schollz/progressbar/v3" ) 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 } 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 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 bar := progressbar.Default(int64(len(r.ForumProfiles)), "dumping json") for i, user := range r.ForumProfiles { bar.Set(i) dbUser, _ := user.ToUser() dbUser, err = store.SaveUser(dbUser) if err != nil { panic(err) } for _, card := range user.LoyaltyProgram { dbCard, err := card.ToCard() if err != nil { panic(err) } dbCard.UserID = dbUser.ID _, err = store.SaveCard(dbCard) // данные говно if err != nil { fmt.Println(err) } } for _, flight := range user.RegisteredFlights { dbFlight, _ := flight.ToFlight() dbFlight.UserID = dbUser.ID _, err = store.SaveFlight(dbFlight) if err != nil { fmt.Println(err) } } } }