From bb833561aa74f02970aee13cdc75973b29716491 Mon Sep 17 00:00:00 2001 From: leshe4ka46 Date: Mon, 27 Oct 2025 20:36:28 +0300 Subject: # This is a combination of 2 commits. # This is the 1st commit message: unmarshal all formats, merge them in the single table, users are truly unique # This is the commit message #2: i --- pkg/adapters/xlsx/xlsx.go | 84 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) (limited to 'pkg/adapters/xlsx/xlsx.go') diff --git a/pkg/adapters/xlsx/xlsx.go b/pkg/adapters/xlsx/xlsx.go index 6ef9baa..5a8427b 100644 --- a/pkg/adapters/xlsx/xlsx.go +++ b/pkg/adapters/xlsx/xlsx.go @@ -2,8 +2,14 @@ package xlsx import ( "fmt" + "os" "strings" + "sync" + "airlines/pkg/airports" + "airlines/pkg/model" + + "github.com/schollz/progressbar/v3" "github.com/xuri/excelize/v2" ) @@ -84,7 +90,85 @@ func UnmarshallXlsxFile(fname string) ([]Ticket, error) { return nil, err } + ap, _ := airports.LookupIATA(t.FromAirport) + t.FromCountry = ap.Country + t.FromCoords.Lat = ap.Latitude + t.FromCoords.Long = ap.Longitude + + ap, _ = airports.LookupIATA(t.ToAirport) + t.ToCountry = ap.Country + t.ToCoords.Lat = ap.Latitude + t.ToCoords.Long = ap.Longitude + tickets = append(tickets, t) } return tickets, nil } + +func UnmarshallXlsxFiles(baseDir string) ([]Ticket, error) { + + tickets := make([]Ticket, 0) + items, err := os.ReadDir(baseDir) + if err != nil { + panic(err) + } + + bar := progressbar.Default(int64(len(items)), "unmarshalling xlsx") + + var mu sync.Mutex + var wg sync.WaitGroup + sem := make(chan struct{}, 8) + for _, item := range items { + if !item.IsDir() { + wg.Add(1) + sem <- struct{}{} + go func(name string) { + defer func() { <-sem }() + defer wg.Done() + // fmt.Println("Processing file:", name) + parsedTickets, err := UnmarshallXlsxFile(baseDir + name) + if err != nil { + panic(err) + } + mu.Lock() + defer mu.Unlock() + tickets = append(tickets, parsedTickets...) + bar.Add(1) + }(item.Name()) + } + } + wg.Wait() + + return tickets, nil +} + +func DumpToDb(store model.Store, tickets []Ticket) { + var err error + bar := progressbar.Default(int64(len(tickets)), "dumping xlsx") + for _, ticket := range tickets { + bar.Add(1) + dbUser, _ := ticket.ToUser() + dbUser, err = store.SaveUser(dbUser) + if err != nil { + panic(err) + } + + dbCard, err := ticket.ToCard() + if err != nil { + goto processflight + } + dbCard.UserID = dbUser.ID + _, err = store.SaveCard(dbCard) + // данные говно + if err != nil { + fmt.Println(err) + } + processflight: + dbFlight, _ := ticket.ToFlight() + dbFlight.UserID = dbUser.ID + _, err = store.SaveFlight(dbFlight) + if err != nil { + fmt.Println(err) + } + } +} -- cgit v1.2.3