aboutsummaryrefslogtreecommitdiff
path: root/pkg/localstore/export.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/localstore/export.go')
-rw-r--r--pkg/localstore/export.go241
1 files changed, 241 insertions, 0 deletions
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
+}