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/localstore/export.go | 241 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 241 insertions(+) create mode 100644 pkg/localstore/export.go (limited to 'pkg/localstore/export.go') diff --git a/pkg/localstore/export.go b/pkg/localstore/export.go new file mode 100644 index 0000000..fa92810 --- /dev/null +++ b/pkg/localstore/export.go @@ -0,0 +1,241 @@ +package localstore + +import ( + csvwriter "airlines/pkg/csvWriter" + "errors" + "fmt" + "os" + "path/filepath" + "strconv" + "strings" + "time" +) + +func (s *Store) ExportUsersCSV(w *csvwriter.CsvWriter) error { + s.mu.RLock() + defer s.mu.RUnlock() + + if err := w.Write([]string{"id", "nick", "name", "surname", "fathersname", "sex", "birthday", "total_flights", "total_codes", "total_countries", "total_cards"}); err != nil { + return err + } + + for i := 1; i < len(s.users); i++ { + u := s.users[i] + if u == nil { + continue + } + bday := "" + if !u.Birthday.IsZero() && u.Birthday.Year() != 1 { + bday = u.Birthday.UTC().Format("2006-01-02") + } + row := []string{ + strconv.FormatUint(u.ID, 10), + u.Nick, + u.Name, + u.Surname, + u.Fathersname, + strconv.Itoa(int(u.Sex)), + bday, + strconv.Itoa(len(s.userFlights[u.ID])), + strconv.Itoa(len(s.codesByUser[u.ID])), + strconv.Itoa(len(s.countriesByUser[u.ID])), + strconv.Itoa(len(s.cardsByUser[u.ID])), + } + if err := w.Write(row); err != nil { + return err + } + } + + return w.Sync() +} + +func (s *Store) ExportCardsCSV(w *csvwriter.CsvWriter) error { + s.mu.RLock() + defer s.mu.RUnlock() + + if err := w.Write([]string{"id", "prefix", "number", "bonusprogramm", "user_id"}); err != nil { + return err + } + for i := 1; i < len(s.cards); i++ { + c := s.cards[i] + if c == nil { + continue + } + row := []string{ + strconv.FormatUint(c.ID, 10), + c.Prefix, + strconv.FormatUint(c.Number, 10), + c.Bonusprogramm, + strconv.FormatUint(c.UserID, 10), + } + if err := w.Write(row); err != nil { + return err + } + } + return w.Sync() +} + +func (s *Store) ExportFlightsCSV(w *csvwriter.CsvWriter) error { + s.mu.RLock() + defer s.mu.RUnlock() + + if err := w.Write([]string{ + "id", "number", "from", "to", "fromlat", "fromlon", "tolat", "tolon", + "dep_date", "has_time", "dep_time", "dep_iso", + }); err != nil { + return err + } + for i := 1; i < len(s.flights); i++ { + f := s.flights[i] + if f == nil { + continue + } + depDate := f.Date.UTC().Format("2006-01-02") + depTime := "" + depISO := "" + if f.HasTime { + depTime = f.Date.Format("15:04:05") + depISO = f.Date.Format(time.RFC3339) + } + row := []string{ + strconv.FormatUint(f.ID, 10), + f.Number, + f.From, + f.To, + fmt.Sprint(f.FromCoords.Lat), + fmt.Sprint(f.FromCoords.Long), + fmt.Sprint(f.ToCoords.Lat), + fmt.Sprint(f.ToCoords.Long), + depDate, + strconv.FormatBool(f.HasTime), + depTime, + depISO, + } + if err := w.Write(row); err != nil { + return err + } + } + return w.Sync() +} + +func (s *Store) ExportUserFlightsCSV(w *csvwriter.CsvWriter) error { + s.mu.RLock() + defer s.mu.RUnlock() + + if err := w.Write([]string{"user_id", "flight_id"}); err != nil { + return err + } + for uid, set := range s.userFlights { + for fid := range set { + if fid == 0 || int(fid) >= len(s.flights) || s.flights[fid] == nil { + continue + } + if err := w.Write([]string{strconv.FormatUint(uid, 10), strconv.FormatUint(fid, 10)}); err != nil { + return err + } + } + } + return w.Sync() +} + +func (s *Store) ExportCardFlightsCSV(w *csvwriter.CsvWriter) error { + s.mu.RLock() + defer s.mu.RUnlock() + + if err := w.Write([]string{"card_id", "flight_id"}); err != nil { + return err + } + for cid, set := range s.cardFlights { + for fid := range set { + if fid == 0 || int(fid) >= len(s.flights) || s.flights[fid] == nil { + continue + } + if err := w.Write([]string{strconv.FormatUint(cid, 10), strconv.FormatUint(fid, 10)}); err != nil { + return err + } + } + } + return w.Sync() +} + + +func (s *Store) ExportAllCSVs(dir string) error { + if dir == "" { + return errors.New("empty directory path") + } + if err := os.MkdirAll(dir, 0o755); err != nil { + return err + } + if !strings.HasSuffix(dir, string(filepath.Separator)) { + dir += string(filepath.Separator) + } + + // users.csv + uw, err := csvwriter.NewCsvWriter(dir + "users.csv") + if err != nil { + return err + } + if err := s.ExportUsersCSV(uw); err != nil { + _ = uw.Close() + return err + } + if err := uw.Close(); err != nil { + return err + } + + // cards.csv + cw, err := csvwriter.NewCsvWriter(dir + "cards.csv") + if err != nil { + return err + } + if err := s.ExportCardsCSV(cw); err != nil { + _ = cw.Close() + return err + } + if err := cw.Close(); err != nil { + return err + } + + // flights.csv + fw, err := csvwriter.NewCsvWriter(dir + "flights.csv") + if err != nil { + return err + } + if err := s.ExportFlightsCSV(fw); err != nil { + _ = fw.Close() + return err + } + if err := fw.Close(); err != nil { + return err + } + + // user_flights.csv + ufw, err := csvwriter.NewCsvWriter(dir + "user_flights.csv") + if err != nil { + return err + } + if err := s.ExportUserFlightsCSV(ufw); err != nil { + _ = ufw.Close() + return err + } + if err := ufw.Close(); err != nil { + return err + } + + // card_flights.csv + cfw, err := csvwriter.NewCsvWriter(dir + "card_flights.csv") + if err != nil { + return err + } + if err := s.ExportCardFlightsCSV(cfw); err != nil { + _ = cfw.Close() + return err + } + if err := cfw.Close(); err != nil { + return err + } + + cfw.Close() + + return nil +} -- cgit v1.2.3