aboutsummaryrefslogtreecommitdiff
path: root/pkg/adapters/json
diff options
context:
space:
mode:
authorleshe4ka46 <alex9102naid1@ya.ru>2025-10-11 16:12:19 +0300
committerleshe4ka46 <alex9102naid1@ya.ru>2025-10-11 16:12:19 +0300
commit2d35000b41e5ccb63a42eee24c4de063efd9071e (patch)
tree63f2fd168942bd336113d29c8991e79382038f0a /pkg/adapters/json
parent31b2dce966be10902dd7f75a9e41dd3fd40e6680 (diff)
json tests
Diffstat (limited to 'pkg/adapters/json')
-rw-r--r--pkg/adapters/json/json.go129
-rw-r--r--pkg/adapters/json/model.go77
2 files changed, 206 insertions, 0 deletions
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
+}