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+}