diff --git a/cmd/archive.go b/cmd/archive.go index 9492ec0..af6a495 100644 --- a/cmd/archive.go +++ b/cmd/archive.go @@ -4,10 +4,11 @@ Copyright © 2024 NAME HERE package cmd import ( - "fmt" - "github.com/spf13/cobra" "github.com/spf13/viper" + + "git.alecodes.page/alecodes/miniflux-archiver/internal/app" + "git.alecodes.page/alecodes/miniflux-archiver/internal/miniflux" ) var Services = []string{ @@ -28,8 +29,21 @@ var archiveCmd = &cobra.Command{ Args: cobra.MatchAll(cobra.ExactArgs(1), cobra.OnlyValidArgs), ValidArgs: Services, Run: func(cmd *cobra.Command, args []string) { - // service := args[0] - fmt.Printf("%v", viper.AllSettings()) + service := args[0] + + serviceConfig := app.ServiceConfig{ + Service: service, + Host: service_host, + User: service_user, + Token: service_token, + } + + minifluxConfig := miniflux.MinifluxConfig{ + Host: viper.GetString("miniflux_host"), + Token: viper.GetString("miniflux_token"), + } + + app.Archive(minifluxConfig, serviceConfig) }, } diff --git a/go.mod b/go.mod index 7a7f991..6cbb854 100644 --- a/go.mod +++ b/go.mod @@ -25,8 +25,9 @@ require ( go.uber.org/atomic v1.9.0 // indirect go.uber.org/multierr v1.9.0 // indirect golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect - golang.org/x/sys v0.18.0 // indirect - golang.org/x/text v0.14.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.20.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect + miniflux.app/v2 v2.2.3 // indirect ) diff --git a/go.sum b/go.sum index c17479d..e1274c6 100644 --- a/go.sum +++ b/go.sum @@ -67,8 +67,12 @@ golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjs golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug= +golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -77,3 +81,5 @@ gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +miniflux.app/v2 v2.2.3 h1:zY0nSSRApk2nT7oPK+1FctmAgYE3SZZMr/1fmAZYhBg= +miniflux.app/v2 v2.2.3/go.mod h1:eawZVTTxQGXFhyOLem1798qDovYWqgoRgLa6hVigRWc= diff --git a/internal/app/archive.go b/internal/app/archive.go new file mode 100644 index 0000000..8479ae1 --- /dev/null +++ b/internal/app/archive.go @@ -0,0 +1,17 @@ +package app + +import ( + "fmt" + + "git.alecodes.page/alecodes/miniflux-archiver/internal/logger" + "git.alecodes.page/alecodes/miniflux-archiver/internal/miniflux" +) + +func Archive(minifluxConfig miniflux.MinifluxConfig, serviceConfig ServiceConfig) { + mf, err := miniflux.NewMiniflux(minifluxConfig) + if err != nil { + logger.Fatal("Could not connect to the miniflux server: %v", err) + } + + fmt.Println(mf) +} diff --git a/internal/app/service.go b/internal/app/service.go new file mode 100644 index 0000000..cf3a046 --- /dev/null +++ b/internal/app/service.go @@ -0,0 +1,8 @@ +package app + +type ServiceConfig struct { + Service string + Host string + User string + Token string +} diff --git a/internal/logger/logger.go b/internal/logger/logger.go new file mode 100644 index 0000000..6ffcf49 --- /dev/null +++ b/internal/logger/logger.go @@ -0,0 +1,88 @@ +package logger + +import ( + "fmt" + "io" + "log" + "os" + "strings" + "time" + + "github.com/spf13/viper" +) + +const ( + verbose = 1 << iota + info + error + debug +) + +func getLogger(level int, prefix string) *log.Logger { + var output io.Writer + + if level == error { + output = os.Stderr + } else { + output = os.Stdout + } + + // TODO: get from config + configLevel := debug + + if configLevel < level { + output = io.Discard + } + + prefix = fmt.Sprintf("%-*s", 6, prefix) + + logger := log.New(output, prefix, log.Ldate|log.Ltime|log.Lmicroseconds|log.Lmsgprefix) + + return logger +} + +func logMessage(level string, message string) { + currentLevel := viper.GetString("log_level") + + levels := map[string]int{ + "verbose": 1, + "info": 2, + "error": 3, + "debug": 4, + } + + if levels[currentLevel] <= levels[level] { + timestamp := time.Now().Format("2006-01-02 15:04:05") + prefix := strings.ToUpper(level) + fmt.Printf("%-7s %s %s\n", prefix, timestamp, message) + } +} + +func Verbose(message string) { + logger := getLogger(verbose, "VERB") + logger.Println(message) +} + +func Info(message string, args ...any) { + logger := getLogger(info, "INFO") + msg := fmt.Sprintf(message, args...) + logger.Println(msg) +} + +func Error(message string, args ...any) { + logger := getLogger(error, "ERROR") + msg := fmt.Sprintf(message, args...) + logger.Println(msg) +} + +func Debug(message string, args ...any) { + logger := getLogger(debug, "DEBUG") + msg := fmt.Sprintf(message, args...) + logger.Println(msg) +} + +func Fatal(message string, args ...any) { + logger := getLogger(error, "FATAL") + msg := fmt.Sprintf(message, args...) + logger.Fatalln(msg) +} diff --git a/internal/miniflux/miniflux.go b/internal/miniflux/miniflux.go new file mode 100644 index 0000000..9810a5a --- /dev/null +++ b/internal/miniflux/miniflux.go @@ -0,0 +1,33 @@ +package miniflux + +import ( + "git.alecodes.page/alecodes/miniflux-archiver/internal/logger" + mfApi "miniflux.app/v2/client" +) + +type MinifluxConfig struct { + Host string + User string + Token string +} + +type Miniflux struct { + MinifluxConfig + client *mfApi.Client +} + +func NewMiniflux(config MinifluxConfig) (*Miniflux, error) { + mf := &Miniflux{ + MinifluxConfig: config, + client: mfApi.NewClient(config.Host, config.Token), + } + + version, err := mf.client.Version() + if err != nil { + return nil, err + } + + logger.Info("Miniflux server version: %v", version.Version) + + return mf, nil +}