server: added server start
This commit is contained in:
parent
9b3e5263ff
commit
94e5a3b127
30
cli/cli.go
30
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)
|
||||
}
|
||||
|
|
29
cli/config.go
Normal file
29
cli/config.go
Normal file
|
@ -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)
|
||||
}
|
|
@ -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
|
||||
},
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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",
|
||||
}
|
||||
|
|
4
go.mod
4
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
|
||||
|
|
9
go.sum
9
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=
|
||||
|
|
8
server/routes/api/api.go
Normal file
8
server/routes/api/api.go
Normal file
|
@ -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)
|
||||
}
|
10
server/routes/api/health_check.go
Normal file
10
server/routes/api/health_check.go
Normal file
|
@ -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"}`))
|
||||
}
|
5
server/routes/htmx/htmx.go
Normal file
5
server/routes/htmx/htmx.go
Normal file
|
@ -0,0 +1,5 @@
|
|||
package htmx
|
||||
|
||||
import "github.com/go-chi/chi/v5"
|
||||
|
||||
func Register(router chi.Router) {}
|
29
server/server.go
Normal file
29
server/server.go
Normal file
|
@ -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,
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue