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 }