From 2d35000b41e5ccb63a42eee24c4de063efd9071e Mon Sep 17 00:00:00 2001 From: leshe4ka46 Date: Sat, 11 Oct 2025 16:12:19 +0300 Subject: json tests --- pkg/adapters/json/json.go | 129 +++++++++++++++++++++++++++++++++++++++++++++ pkg/adapters/json/model.go | 77 +++++++++++++++++++++++++++ 2 files changed, 206 insertions(+) create mode 100644 pkg/adapters/json/model.go (limited to 'pkg/adapters/json') diff --git a/pkg/adapters/json/json.go b/pkg/adapters/json/json.go index c9ce212..8da149e 100644 --- a/pkg/adapters/json/json.go +++ b/pkg/adapters/json/json.go @@ -1,3 +1,132 @@ 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) + } + } + } +} diff --git a/pkg/adapters/json/model.go b/pkg/adapters/json/model.go new file mode 100644 index 0000000..a010367 --- /dev/null +++ b/pkg/adapters/json/model.go @@ -0,0 +1,77 @@ +package json + +import ( + "strconv" + "time" + "unicode" + + "airlines/pkg/model" +) + +/* ---------- helpers ---------- */ + +func sOrEmpty(p *string) string { + if p == nil { + return "" + } + return *p +} + +func toDateUTC(d DateYMD) time.Time { + if !d.Valid { + return time.Time{} + } + return time.Date(d.Time.Year(), d.Time.Month(), d.Time.Day(), 0, 0, 0, 0, time.UTC) +} + +func onlyDigits(s string) string { + out := make([]rune, 0, len(s)) + for _, r := range s { + if unicode.IsDigit(r) { + out = append(out, r) + } + } + return string(out) +} + +func (jp JsonProfile) ToUser() *model.User { + return &model.User{ + Name: sOrEmpty(jp.RealName.FirstName), + Surname: sOrEmpty(jp.RealName.LastName), + Nick: sOrEmpty(&jp.NickName), + Fathersname: "", + Sex: jp.Sex, + Birthday: model.SentinelBirthday(), + } +} + +func (jf JsonFlight) ToFlight() *model.Flight { + d := toDateUTC(jf.Date) + 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: d, + } +} + +func (jc JsonCard) ToCard() (*model.Card, error) { + numStr := onlyDigits(string(jc.Number)) + var num uint64 + if numStr != "" { + v, err := strconv.ParseUint(numStr, 10, 64) + if err != nil { + return nil, err + } + num = v + } + return &model.Card{ + Prefix: jc.Program, + Number: num, + Bonusprogramm: jc.Status, + }, nil +} -- cgit v1.2.3