From 94e5a3b12720f57c0ce4864849e369ebf27fd103 Mon Sep 17 00:00:00 2001 From: Tigor Hutasuhut Date: Sun, 7 Apr 2024 12:11:25 +0700 Subject: [PATCH] server: added server start --- cli/cli.go | 30 +++++++++++++++++++++++++++++- cli/config.go | 29 +++++++++++++++++++++++++++++ cli/serve.go | 9 ++++++++- config/builder.go | 13 ++++++++++++- config/default.go | 5 ++++- go.mod | 4 +++- go.sum | 9 +++++++++ server/routes/api/api.go | 8 ++++++++ server/routes/api/health_check.go | 10 ++++++++++ server/routes/htmx/htmx.go | 5 +++++ server/server.go | 29 +++++++++++++++++++++++++++++ 11 files changed, 146 insertions(+), 5 deletions(-) create mode 100644 cli/config.go create mode 100644 server/routes/api/api.go create mode 100644 server/routes/api/health_check.go create mode 100644 server/routes/htmx/htmx.go create mode 100644 server/server.go diff --git a/cli/cli.go b/cli/cli.go index 1e4bc95..91ab4cc 100644 --- a/cli/cli.go +++ b/cli/cli.go @@ -1,8 +1,36 @@ package cli -import "github.com/spf13/cobra" +import ( + "fmt" + + "github.com/spf13/cobra" + "github.com/tigorlazuardi/redmage/config" +) var RootCmd = &cobra.Command{ Use: "redmage", Short: "Redmage is an HTTP server to download images from Reddit.", } + +func init() { + flags := RootCmd.PersistentFlags() + for key, value := range config.DefaultConfig { + const usage = "" + switch v := value.(type) { + case bool: + flags.Bool(key, v, usage) + case string: + flags.String(key, v, usage) + case int: + flags.Int(key, v, usage) + case float32: + flags.Float32(key, v, usage) + case float64: + flags.Float64(key, v, usage) + default: + flags.String(key, fmt.Sprintf("%v", v), usage) + } + } + + cobra.OnInitialize(initConfig) +} diff --git a/cli/config.go b/cli/config.go new file mode 100644 index 0000000..25b16d1 --- /dev/null +++ b/cli/config.go @@ -0,0 +1,29 @@ +package cli + +import ( + "github.com/adrg/xdg" + "github.com/tigorlazuardi/redmage/config" + "github.com/tigorlazuardi/redmage/pkg/log" +) + +var cfg *config.Config + +func initConfig() { + xdgJson, _ := xdg.ConfigFile("redmage/config.json") + xdgYaml, _ := xdg.ConfigFile("redmage/config.yaml") + + cfg = config.NewConfigBuilder(). + LoadDefault(). + LoadJSONFile("/etc/redmage/config.json"). + LoadYamlFile("/etc/redmage/config.yaml"). + LoadJSONFile(xdgJson). + LoadYamlFile(xdgYaml). + LoadJSONFile("config.json"). + LoadYamlFile("config.yaml"). + LoadEnv(). + LoadFlags(RootCmd.PersistentFlags()). + Build() + + handler := log.NewHandler(cfg) + log.SetDefault(handler) +} diff --git a/cli/serve.go b/cli/serve.go index ff553dd..dd1c54f 100644 --- a/cli/serve.go +++ b/cli/serve.go @@ -1,12 +1,19 @@ package cli -import "github.com/spf13/cobra" +import ( + "github.com/spf13/cobra" + "github.com/tigorlazuardi/redmage/pkg/log" +) var serveCmd = &cobra.Command{ Use: "serve", Short: "Starts the HTTP Server", SilenceUsage: true, RunE: func(cmd *cobra.Command, args []string) error { + hostPort := cfg.String("http.host") + ":" + cfg.String("http.port") + + log.Log(cmd.Context()).Info("starting http server", "host", hostPort) + return nil }, } diff --git a/config/builder.go b/config/builder.go index 77ce5ed..46e8c39 100644 --- a/config/builder.go +++ b/config/builder.go @@ -9,8 +9,10 @@ import ( "github.com/knadh/koanf/providers/confmap" "github.com/knadh/koanf/providers/env" "github.com/knadh/koanf/providers/file" + "github.com/knadh/koanf/providers/posflag" "github.com/knadh/koanf/providers/rawbytes" "github.com/knadh/koanf/v2" + "github.com/spf13/pflag" ) type ConfigBuilder struct { @@ -31,7 +33,7 @@ func (builder *ConfigBuilder) BuildHandle() (*Config, error) { } func (builder *ConfigBuilder) LoadDefault() *ConfigBuilder { - provider := confmap.Provider(defaultConfig, ".") + provider := confmap.Provider(DefaultConfig, ".") _ = builder.koanf.Load(provider, nil) return builder @@ -90,3 +92,12 @@ func (builder *ConfigBuilder) LoadEnv() *ConfigBuilder { _ = builder.koanf.Load(provider, nil) return builder } + +func (builder *ConfigBuilder) LoadFlags(flags *pflag.FlagSet) *ConfigBuilder { + provider := posflag.Provider(flags, ".", nil) + if err := builder.koanf.Load(provider, nil); err != nil { + builder.err = err + } + + return builder +} diff --git a/config/default.go b/config/default.go index f0da1be..79e763e 100644 --- a/config/default.go +++ b/config/default.go @@ -1,6 +1,6 @@ package config -var defaultConfig = map[string]any{ +var DefaultConfig = map[string]any{ "log.enable": true, "log.source": true, "log.format": "pretty", @@ -10,4 +10,7 @@ var defaultConfig = map[string]any{ "db.driver": "sqlite3", "db.string": "data.db", "db.automigrate": true, + + "http.port": "8080", + "http.host": "0.0.0.0", } diff --git a/go.mod b/go.mod index 7d31305..6f1db7e 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module github.com/tigorlazuardi/redmage go 1.22.1 require ( + github.com/adrg/xdg v0.4.0 github.com/fatih/color v1.16.0 github.com/go-chi/chi/v5 v5.0.12 github.com/knadh/koanf/parsers/json v0.1.0 @@ -10,6 +11,7 @@ require ( github.com/knadh/koanf/providers/confmap v0.1.0 github.com/knadh/koanf/providers/env v0.1.0 github.com/knadh/koanf/providers/file v0.1.0 + github.com/knadh/koanf/providers/posflag v0.1.0 github.com/knadh/koanf/providers/rawbytes v0.1.0 github.com/knadh/koanf/v2 v2.1.1 github.com/mattn/go-colorable v0.1.13 @@ -17,6 +19,7 @@ require ( github.com/mattn/go-sqlite3 v1.14.6 github.com/pressly/goose/v3 v3.19.2 github.com/spf13/cobra v1.8.0 + github.com/spf13/pflag v1.0.5 ) require ( @@ -28,7 +31,6 @@ require ( github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/sethvargo/go-retry v0.2.4 // indirect - github.com/spf13/pflag v1.0.5 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/sync v0.6.0 // indirect golang.org/x/sys v0.16.0 // indirect diff --git a/go.sum b/go.sum index 3198b24..c888023 100644 --- a/go.sum +++ b/go.sum @@ -10,6 +10,8 @@ github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migc github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= +github.com/adrg/xdg v0.4.0 h1:RzRqFcjH4nE5C6oTAxhBtoE2IRyjBSa62SCbyPidvls= +github.com/adrg/xdg v0.4.0/go.mod h1:N6ag73EX4wyxeaoeHctc1mas01KZgsj5tYiAIwqJE/E= github.com/andybalholm/brotli v1.0.6 h1:Yf9fFpf49Zrxb9NlQaluyE92/+X7UVHlhMNJN2sxfOI= github.com/andybalholm/brotli v1.0.6/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230512164433-5d1fd1a340c9 h1:goHVqTbFX3AIo0tzGr14pgfAW2ZfPChKO21Z9MGf/gk= @@ -19,6 +21,7 @@ github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyY github.com/containerd/continuity v0.4.3 h1:6HVkalIp+2u1ZLH1J/pYX2oBVXlJZvh1X1A7bEZ9Su8= github.com/containerd/continuity v0.4.3/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ= github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/docker/cli v24.0.7+incompatible h1:wa/nIwYFW7BVTGa7SWPVyyXU9lgORqUb1xfI36MSkFg= @@ -91,6 +94,8 @@ github.com/knadh/koanf/providers/env v0.1.0 h1:LqKteXqfOWyx5Ab9VfGHmjY9BvRXi+clw github.com/knadh/koanf/providers/env v0.1.0/go.mod h1:RE8K9GbACJkeEnkl8L/Qcj8p4ZyPXZIQ191HJi44ZaQ= github.com/knadh/koanf/providers/file v0.1.0 h1:fs6U7nrV58d3CFAFh8VTde8TM262ObYf3ODrc//Lp+c= github.com/knadh/koanf/providers/file v0.1.0/go.mod h1:rjJ/nHQl64iYCtAW2QQnF0eSmDEX/YZ/eNFj5yR6BvA= +github.com/knadh/koanf/providers/posflag v0.1.0 h1:mKJlLrKPcAP7Ootf4pBZWJ6J+4wHYujwipe7Ie3qW6U= +github.com/knadh/koanf/providers/posflag v0.1.0/go.mod h1:SYg03v/t8ISBNrMBRMlojH8OsKowbkXV7giIbBVgbz0= github.com/knadh/koanf/providers/rawbytes v0.1.0 h1:dpzgu2KO6uf6oCb4aP05KDmKmAmI51k5pe8RYKQ0qME= github.com/knadh/koanf/providers/rawbytes v0.1.0/go.mod h1:mMTB1/IcJ/yE++A2iEZbY1MLygX7vttU+C+S/YmPu9c= github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= @@ -151,6 +156,8 @@ github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/tursodatabase/libsql-client-go v0.0.0-20240220085343-4ae0eb9d0898 h1:1MvEhzI5pvP27e9Dzz861mxk9WzXZLSJwzOU67cKTbU= @@ -183,6 +190,7 @@ golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -202,6 +210,7 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +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= howett.net/plist v1.0.0 h1:7CrbWYbPPO/PyNy38b2EB/+gYbjCe2DXBxgtOOZbSQM= diff --git a/server/routes/api/api.go b/server/routes/api/api.go new file mode 100644 index 0000000..e32ca8d --- /dev/null +++ b/server/routes/api/api.go @@ -0,0 +1,8 @@ +package api + +import "github.com/go-chi/chi/v5" + +func Register(router chi.Router) { + router.Get("/", HealthCheck) + router.Get("/health", HealthCheck) +} diff --git a/server/routes/api/health_check.go b/server/routes/api/health_check.go new file mode 100644 index 0000000..f2c5195 --- /dev/null +++ b/server/routes/api/health_check.go @@ -0,0 +1,10 @@ +package api + +import ( + "net/http" +) + +func HealthCheck(rw http.ResponseWriter, r *http.Request) { + rw.Header().Add("Content-Type", "application/json") + _, _ = rw.Write([]byte(`{"status":"ok"}`)) +} diff --git a/server/routes/htmx/htmx.go b/server/routes/htmx/htmx.go new file mode 100644 index 0000000..597fb1f --- /dev/null +++ b/server/routes/htmx/htmx.go @@ -0,0 +1,5 @@ +package htmx + +import "github.com/go-chi/chi/v5" + +func Register(router chi.Router) {} diff --git a/server/server.go b/server/server.go new file mode 100644 index 0000000..71681de --- /dev/null +++ b/server/server.go @@ -0,0 +1,29 @@ +package server + +import ( + "net/http" + + "github.com/go-chi/chi/v5" + "github.com/tigorlazuardi/redmage/config" + "github.com/tigorlazuardi/redmage/server/routes/api" + "github.com/tigorlazuardi/redmage/server/routes/htmx" +) + +type Server struct { + handler http.Handler +} + +func (svr *Server) Serve() { +} + +func New(cfg *config.Config) *Server { + router := chi.NewRouter() + + router.Route("/api", api.Register) + + router.Route("/htmx", htmx.Register) + + return &Server{ + handler: router, + } +}