From 53bcb26e896e59e60b83b05a9233712c188bc6f3 Mon Sep 17 00:00:00 2001 From: Umputun Date: Tue, 26 Dec 2017 02:11:46 -0600 Subject: [PATCH] move all import and backup to migrator --- app/main.go | 61 +++++------------------------------ app/migrator/migrator.go | 69 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 76 insertions(+), 54 deletions(-) diff --git a/app/main.go b/app/main.go index 26d45ff7..8b8c8df2 100644 --- a/app/main.go +++ b/app/main.go @@ -1,16 +1,13 @@ package main import ( - "compress/gzip" "fmt" "log" "os" - "time" "github.com/gorilla/sessions" "github.com/hashicorp/logutils" "github.com/jessevdk/go-flags" - "github.com/pkg/errors" "github.com/umputun/remark/app/migrator" "github.com/umputun/remark/app/rest" @@ -61,7 +58,13 @@ func main() { } if p.Active != nil && p.Command.Find("import") == p.Active { - if err := importComments(dataStore); err != nil { + params := migrator.ImportParams{ + DataStore: dataStore, + InputFile: opts.ImportCommand.InputFile, + Provider: opts.ImportCommand.Provider, + SiteID: opts.ImportCommand.SiteID, + } + if err := migrator.ImportComments(params); err != nil { log.Fatalf("[ERROR] failed to import, %+v", err) } return @@ -95,58 +98,10 @@ func main() { log.Printf("[WARN] running in dev mode, no auth!") } - go autoBackup(&exporter) + go migrator.AutoBackup(&exporter, opts.BackupLocation) srv.Run() } -func importComments(dataStore store.Interface) error { - log.Printf("[INFO] import from %s (%s) to %s", - opts.ImportCommand.InputFile, opts.ImportCommand.Provider, opts.ImportCommand.SiteID) - - var importer migrator.Importer - switch opts.ImportCommand.Provider { - case "disqus": - importer = &migrator.Disqus{DataStore: dataStore} - case "native": - importer = &migrator.Remark{DataStore: dataStore} - default: - return errors.Errorf("unsupported import provider %s", opts.ImportCommand.Provider) - } - - fh, err := os.Open(opts.ImportCommand.InputFile) - if err != nil { - return errors.Wrapf(err, "can't open import file %s", opts.ImportCommand.InputFile) - } - - defer func() { - if err = fh.Close(); err != nil { - log.Printf("[WARN] can't close %s, %s", opts.ImportCommand.InputFile, err) - } - }() - - return importer.Import(fh, opts.ImportCommand.SiteID) -} - -func autoBackup(exporter migrator.Exporter) { - log.Print("[INFO] activate auto-backup") - tick := time.NewTicker(24 * time.Hour) - for _ = range tick.C { - log.Print("[DEBUG] make backup") - fh, err := os.Create(fmt.Sprintf("%s/backup-%s.gz", opts.BackupLocation, time.Now().Format("20060102"))) - if err != nil { - log.Printf("[WARN] can't create backup file, %s", err) - continue - } - gz := gzip.NewWriter(fh) - - if err = exporter.Export(gz, ""); err != nil { - log.Printf("[WARN] export failed, %+v", err) - } - _ = gz.Close() - _ = fh.Close() - } -} - func setupLog(dbg bool) { filter := &logutils.LevelFilter{ Levels: []logutils.LogLevel{"DEBUG", "INFO", "WARN", "ERROR"}, diff --git a/app/migrator/migrator.go b/app/migrator/migrator.go index 31d788a0..62df2d5b 100644 --- a/app/migrator/migrator.go +++ b/app/migrator/migrator.go @@ -1,6 +1,16 @@ package migrator -import "io" +import ( + "compress/gzip" + "fmt" + "io" + "log" + "os" + "time" + + "github.com/pkg/errors" + "github.com/umputun/remark/app/store" +) // Importer defines interface to convert posts from external sources type Importer interface { @@ -11,3 +21,60 @@ type Importer interface { type Exporter interface { Export(w io.Writer, siteID string) error } + +// ImportParams defines everyting needed to run import +type ImportParams struct { + DataStore store.Interface + InputFile string + Provider string + SiteID string +} + +// ImportComments imports from given provider format and saves to store +func ImportComments(p ImportParams) error { + log.Printf("[INFO] import from %s (%s) to %s", p.InputFile, p.Provider, p.SiteID) + + var importer Importer + switch p.Provider { + case "disqus": + importer = &Disqus{DataStore: p.DataStore} + case "native": + importer = &Remark{DataStore: p.DataStore} + default: + return errors.Errorf("unsupported import provider %s", p.Provider) + } + + fh, err := os.Open(p.InputFile) + if err != nil { + return errors.Wrapf(err, "can't open import file %s", p.InputFile) + } + + defer func() { + if err = fh.Close(); err != nil { + log.Printf("[WARN] can't close %s, %s", p.InputFile, err) + } + }() + + return importer.Import(fh, p.SiteID) +} + +// AutoBackup runs daily export to local files +func AutoBackup(exporter Exporter, backupLocation string) { + log.Print("[INFO] activate auto-backup") + tick := time.NewTicker(24 * time.Hour) + for _ = range tick.C { + log.Print("[DEBUG] make backup") + fh, err := os.Create(fmt.Sprintf("%s/backup-%s.gz", backupLocation, time.Now().Format("20060102"))) + if err != nil { + log.Printf("[WARN] can't create backup file, %s", err) + continue + } + gz := gzip.NewWriter(fh) + + if err = exporter.Export(gz, ""); err != nil { + log.Printf("[WARN] export failed, %+v", err) + } + _ = gz.Close() + _ = fh.Close() + } +}