diff options
Diffstat (limited to 'pkg/adapters/xml')
| -rw-r--r-- | pkg/adapters/xml/registry.go | 51 | ||||
| -rw-r--r-- | pkg/adapters/xml/xml.go | 113 |
2 files changed, 164 insertions, 0 deletions
diff --git a/pkg/adapters/xml/registry.go b/pkg/adapters/xml/registry.go new file mode 100644 index 0000000..f7b0507 --- /dev/null +++ b/pkg/adapters/xml/registry.go @@ -0,0 +1,51 @@ +package xml + +import ( + "errors" + "fmt" + "strings" + "time" + + "airlines/pkg/model" +) + +func (u XMLUser) ToUser() (*model.User, error) { + return &model.User{ + Nick: "", + Name: strings.ToUpper(strings.TrimSpace(u.Name.First)), + Surname: strings.ToUpper(strings.TrimSpace(u.Name.Last)), + Fathersname: "", + Sex: model.SexUnknown, + Birthday: model.SentinelBirthday(), + }, nil +} + +func (c XMLCard) ToCard() (*model.Card, error) { + prefix, number, _ := model.ParseCardLine(c.Number) + if prefix == "" && number == 0 && strings.TrimSpace(c.Program) == "" { + return nil, errors.New("bad card") + } + return &model.Card{ + Prefix: prefix, + Number: number, + Bonusprogramm: strings.TrimSpace(c.Program), + }, nil +} + +func (a XMLActivity) ToFlight() (*model.Flight, error) { + fromIATA := strings.ToUpper(strings.TrimSpace(a.Departure)) + toIATA := strings.ToUpper(strings.TrimSpace(a.Arrival)) + + d, err := time.Parse("2006-01-02", strings.TrimSpace(a.Date)) + if err != nil { + return nil, fmt.Errorf("invalid Date %q for flight %q: %w", a.Date, a.Code, err) + } + departUTC := time.Date(d.Year(), d.Month(), d.Day(), 0, 0, 0, 0, time.UTC) + + return &model.Flight{ + Number: strings.TrimSpace(a.Code), + From: fromIATA, + To: toIATA, + Date: departUTC, + }, nil +} diff --git a/pkg/adapters/xml/xml.go b/pkg/adapters/xml/xml.go new file mode 100644 index 0000000..3350c01 --- /dev/null +++ b/pkg/adapters/xml/xml.go @@ -0,0 +1,113 @@ +package xml + +import ( + "airlines/pkg/model" + "encoding/xml" + "fmt" + "os" + + "github.com/schollz/progressbar/v3" +) + +type PointzAggregatorUsers struct { + XMLName xml.Name `xml:"PointzAggregatorUsers"` + Users []XMLUser `xml:"user"` +} + +type XMLUser struct { + UID string `xml:"uid,attr"` + Name Name `xml:"name"` + Cards Cards `xml:"cards"` +} + +type Name struct { + First string `xml:"first,attr"` + Last string `xml:"last,attr"` +} + +type Cards struct { + Type string `xml:"type,attr"` + Card []XMLCard `xml:"card"` +} + +type XMLCard struct { + Number string `xml:"number,attr"` + Program string `xml:"bonusprogramm"` + Activities Activities `xml:"activities"` +} + +type Activities struct { + Type string `xml:"type,attr"` + Activitys []XMLActivity `xml:"activity"` +} + +type XMLActivity struct { + Type string `xml:"type,attr"` + Code string `xml:"Code"` + Date string `xml:"Date"` + Departure string `xml:"Departure"` + Arrival string `xml:"Arrival"` + Fare string `xml:"Fare"` +} + +func UnmarshalXml(path string) (*PointzAggregatorUsers, error) { + + data, err := os.ReadFile(path) + if err != nil { + return nil, err + } + + var p PointzAggregatorUsers + if err := xml.Unmarshal(data, &p); err != nil { + return nil, err + } + return &p, nil +} + +func (u *PointzAggregatorUsers) DumpToDb(store model.Store) error { + // var err error + bar := progressbar.Default(int64(len(u.Users)), "dumping xml") + + for _, u := range u.Users { + dbUser, err := u.ToUser() + if err != nil { + panic(err) + } + dbUser, err = store.SaveUser(dbUser) + if err != nil { + panic(err) + } + // fmt.Println(dbUser) + + + for _, card := range u.Cards.Card { + dbCard, err := card.ToCard() + if err != nil { + fmt.Println(err) + continue + } + dbCard.UserID = dbUser.ID + _, err = store.SaveCard(dbCard) + // данные говно + if err != nil { + fmt.Println(err) + } + + for _, activity := range card.Activities.Activitys { + + dbFlight, err := activity.ToFlight() + if err != nil { + fmt.Println(err) + } + dbFlight.UserID = dbUser.ID + _, err = store.SaveFlight(dbFlight) + if err != nil { + fmt.Println(err) + } + } + } + bar.Add(1) + } + + return nil +} |
