lens @ 1ab181d1d7d75fd66c97d231d6eb77e1f05e0b3e

feat: Move params to flags

Start using flags to set some params like key and database connection.
As a flag parse I opt for a lib that uses posix style params.
  1diff --git a/.gitignore b/.gitignore
  2index b06c8abc37de3837d42f95e6a132cf7d0b810f1f..eff712c758daabaa7a6949a31353757063409a7f 100644
  3--- a/.gitignore
  4+++ b/.gitignore
  5@@ -5,3 +5,4 @@ media_cache/
  6 
  7 .env
  8 *.db
  9+*.db-journal
 10diff --git a/Makefile b/Makefile
 11index 9d82dd93b49920d80cc38fee9643687ecb0fc8ea..39c579c0bb9e29d7a7407c5f2178d1e6178f32ee 100644
 12--- a/Makefile
 13+++ b/Makefile
 14@@ -12,7 +12,10 @@ build:
 15 	$(GO_BUILD) -o $(OUT) $(SERVER)
 16 
 17 run: sass
 18-	$(GO_RUN) $(SERVER)
 19+	$(GO_RUN) $(SERVER) \
 20+		--log-level error \
 21+		--aes-key=6368616e676520746869732070617373 \
 22+		--root=${HOME} \
 23 
 24 sass:
 25 	@mkdir -p static
 26diff --git a/cmd/server/main.go b/cmd/server/main.go
 27index 59ea957fb60a560bf7e1d3f8c39cf748535f9332..e9314ec813338fb63cf8b4e536eab2ce20a8a446 100644
 28--- a/cmd/server/main.go
 29+++ b/cmd/server/main.go
 30@@ -3,12 +3,16 @@
 31 import (
 32 	"context"
 33 	"encoding/hex"
 34+	"errors"
 35 	"os"
 36 	"os/signal"
 37 
 38 	"github.com/fasthttp/router"
 39 	"github.com/sirupsen/logrus"
 40+	flag "github.com/spf13/pflag"
 41 	"github.com/valyala/fasthttp"
 42+	"gorm.io/driver/mysql"
 43+	"gorm.io/driver/postgres"
 44 	"gorm.io/driver/sqlite"
 45 	"gorm.io/gorm"
 46 
 47@@ -22,13 +26,31 @@ 	"git.sr.ht/~gabrielgio/img/pkg/view"
 48 	"git.sr.ht/~gabrielgio/img/pkg/worker"
 49 )
 50 
 51-const root = "/home/gabrielgio"
 52+func main() {
 53+	var (
 54+		key      = flag.String("aes-key", "", "AES key, either 16, 24, or 32 bytes string to select AES-128, AES-192, or AES-256")
 55+		dbType   = flag.String("db-type", "sqlite", "Database to be used. Choose either mysql, psql or sqlite")
 56+		dbCon    = flag.String("db-con", "main.db", "Database string connection for given database type. Ref: https://gorm.io/docs/connecting_to_the_database.html")
 57+		logLevel = flag.String("log-level", "error", "Log level: Choose either trace, debug, info, warning, error, fatal or panic")
 58 
 59-func main() {
 60+		// TODO: this will later be replaced by user specific root folder
 61+		root = flag.String("root", "", "root folder for the whole application. All the workers will use it as working directory")
 62+	)
 63+
 64+	flag.Parse()
 65+
 66+	l, err := logrus.ParseLevel(*logLevel)
 67+	if err != nil {
 68+		panic("failed to parse log level" + err.Error())
 69+	}
 70 	logger := logrus.New()
 71-	logger.SetLevel(logrus.ErrorLevel)
 72+	logger.SetLevel(l)
 73+
 74+	d, err := OpenDatabase(*dbType, *dbCon)
 75+	if err != nil {
 76+		panic("failed to parse database strings" + err.Error())
 77+	}
 78 
 79-	d := sqlite.Open("test.db")
 80 	db, err := gorm.Open(d, &gorm.Config{
 81 		Logger: ext.Wraplog(logger.WithField("context", "sql")),
 82 	})
 83@@ -40,13 +62,16 @@ 	if err = sql.Migrate(db); err != nil {
 84 		panic("failed to migrate database: " + err.Error())
 85 	}
 86 
 87-	// TODO: properly set this up
 88-	key, _ := hex.DecodeString("6368616e676520746869732070617373")
 89+	hexKey, err := hex.DecodeString(*key)
 90+	if err != nil {
 91+		panic("failed to decode key database: " + err.Error())
 92+	}
 93+
 94 	r := router.New()
 95 	r.ServeFiles("/static/{filepath:*}", "./static")
 96 	r.NotFound = ext.NotFoundHTML
 97 
 98-	authMiddleware := ext.NewAuthMiddleware(key, logger.WithField("context", "auth"))
 99+	authMiddleware := ext.NewAuthMiddleware(hexKey, logger.WithField("context", "auth"))
100 	logMiddleware := ext.NewLogMiddleare(logger.WithField("context", "http"))
101 
102 	extRouter := ext.NewRouter(r)
103@@ -60,7 +85,7 @@ 	// repository
104 	var (
105 		userRepository       = sql.NewUserRepository(db)
106 		settingsRepository   = sql.NewSettingsRespository(db)
107-		fileSystemRepository = localfs.NewFileSystemRepository(root)
108+		fileSystemRepository = localfs.NewFileSystemRepository(*root)
109 		mediaRepository      = sql.NewMediaRepository(db)
110 	)
111 
112@@ -69,7 +94,7 @@ 	userRepository.EnsureAdmin(context.Background())
113 
114 	// controller
115 	var (
116-		userController       = auth.NewController(userRepository, key)
117+		userController       = auth.NewController(userRepository, hexKey)
118 		fileSystemController = filesystem.NewController(fileSystemRepository)
119 	)
120 
121@@ -86,8 +111,8 @@
122 	// worker
123 	var (
124 		serverWorker = worker.NewServerWorker(&fasthttp.Server{Handler: r.Handler})
125-		fileScanner  = worker.NewFileScanner(root, mediaRepository)
126-		exifScanner  = worker.NewEXIFScanner(root, mediaRepository)
127+		fileScanner  = worker.NewFileScanner(*root, mediaRepository)
128+		exifScanner  = worker.NewEXIFScanner(*root, mediaRepository)
129 	)
130 
131 	pool := worker.NewWorkerPool()
132@@ -101,3 +126,16 @@
133 	pool.Start(ctx)
134 	pool.Wait()
135 }
136+
137+func OpenDatabase(dbType string, dbConn string) (gorm.Dialector, error) {
138+	switch dbType {
139+	case "sqlite":
140+		return sqlite.Open(dbConn), nil
141+	case "psql":
142+		return postgres.Open(dbConn), nil
143+	case "mysql":
144+		return mysql.Open(dbConn), nil
145+	default:
146+		return nil, errors.New("No valid db type given")
147+	}
148+}