aboutsummaryrefslogtreecommitdiff
path: root/pkg/adapters/json/json.go
blob: 47a563e82e518aad97c763452a650960091c9231 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
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
}

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)
			}
		}
	}
}