From 270faf288a25e5e8da91b5bd11012915a66013dc Mon Sep 17 00:00:00 2001 From: Abhishek Shroff Date: Tue, 22 Oct 2024 01:51:42 +0530 Subject: [PATCH] [server][core] Remove functionality from App --- server/internal/api/v1/auth_api.go | 2 +- server/internal/api/v1/login/login.go | 2 +- server/internal/api/v1/my/my.go | 4 +-- server/internal/api/webdav/handler.go | 2 +- server/internal/command/command.go | 12 +++++++-- server/internal/command/common/common.go | 31 ++++-------------------- server/internal/command/fs/chperm.go | 9 ++++--- server/internal/command/schema/cmd.go | 5 ++-- server/internal/command/user/add.go | 2 +- server/internal/command/user/cmd.go | 5 ++-- server/internal/core/app/app.go | 8 +----- server/internal/core/db/db_handler.go | 18 +++++++++++++- server/internal/core/storage/storage.go | 16 +++++++++++- server/internal/core/user/manager.go | 7 ++++++ server/internal/core/user/user.go | 9 ------- 15 files changed, 72 insertions(+), 60 deletions(-) diff --git a/server/internal/api/v1/auth_api.go b/server/internal/api/v1/auth_api.go index 210576d3..616046fb 100644 --- a/server/internal/api/v1/auth_api.go +++ b/server/internal/api/v1/auth_api.go @@ -31,7 +31,7 @@ func CreateApiAuthHandler(a app.App) func(c *gin.Context) { } func extractUserDetails(a app.App, c *gin.Context) (user.User, error) { - userManager := a.OpenUserManager(c.Request.Context()) + userManager := user.CreateManager(c.Request.Context()) if header := c.Request.Header.Get("Authorization"); header == "" { return user.User{}, auth.ErrRequired } else if auth, ok := checkAuthHeader(header, "basic"); ok { diff --git a/server/internal/api/v1/login/login.go b/server/internal/api/v1/login/login.go index 81e14e2d..7005939f 100644 --- a/server/internal/api/v1/login/login.go +++ b/server/internal/api/v1/login/login.go @@ -30,7 +30,7 @@ func createLoginRouteHandler(a app.App) func(c *gin.Context) { panic(errors.NewError(http.StatusBadRequest, "missing_password", "Password Not Specified")) } - userManager := a.OpenUserManager(c.Request.Context()) + userManager := user.CreateManager(c.Request.Context()) if user, err := userManager.VerifyUserPassword(email, password); err != nil { panic(err) } else { diff --git a/server/internal/api/v1/my/my.go b/server/internal/api/v1/my/my.go index 21b60dab..69dc7001 100644 --- a/server/internal/api/v1/my/my.go +++ b/server/internal/api/v1/my/my.go @@ -40,8 +40,8 @@ func handleMyHomeRoute(c *gin.Context) { func createMySharedRouteHandler(a app.App) func(*gin.Context) { return func(c *gin.Context) { - user := auth.GetUser(c) - shared, err := a.OpenUserManager(c.Request.Context()).GetSharedResources(user) + u := auth.GetUser(c) + shared, err := user.CreateManager(c.Request.Context()).GetSharedResources(u) if err != nil { panic(err) } diff --git a/server/internal/api/webdav/handler.go b/server/internal/api/webdav/handler.go index c640b396..f51497b0 100644 --- a/server/internal/api/webdav/handler.go +++ b/server/internal/api/webdav/handler.go @@ -25,7 +25,7 @@ func createBasicAuthHandler(a app.App) func(c *gin.Context) { authSuccess := false if username, pass, ok := c.Request.BasicAuth(); ok { ctx := c.Request.Context() - if u, err := a.OpenUserManager(ctx).VerifyUserPassword(username, pass); err == nil { + if u, err := user.CreateManager(ctx).VerifyUserPassword(username, pass); err == nil { auth.Set(c, u, a.OpenFileSystem(ctx, u)) authSuccess = true } else if !errors.Is(err, user.ErrCredentialsInvalid) { diff --git a/server/internal/command/command.go b/server/internal/command/command.go index 29d37082..413e868d 100644 --- a/server/internal/command/command.go +++ b/server/internal/command/command.go @@ -8,8 +8,10 @@ import ( "github.com/shroff/phylum/server/internal/command/fs" "github.com/shroff/phylum/server/internal/command/schema" "github.com/shroff/phylum/server/internal/command/serve" - "github.com/shroff/phylum/server/internal/command/storage" + storagecmd "github.com/shroff/phylum/server/internal/command/storage" "github.com/shroff/phylum/server/internal/command/user" + "github.com/shroff/phylum/server/internal/core/db" + "github.com/shroff/phylum/server/internal/core/storage" "github.com/sirupsen/logrus" "github.com/spf13/cobra" "github.com/spf13/viper" @@ -45,6 +47,12 @@ func SetupCommand() { os.Mkdir(workDir, 0750) os.Chdir(workDir) } + + db.DatabaseURL = viper.GetString("database_url") + db.TraceSQL = viper.GetBool("debug") && viper.GetBool("trace_sql") + db.AutoMigrate = viper.GetBool("auto_migrate") + + storage.DefaultStorageDir = viper.GetString("default_storage_dir") } defer func() { @@ -55,7 +63,7 @@ func SetupCommand() { rootCmd.AddCommand([]*cobra.Command{ schema.SetupCommand(), user.SetupCommand(), - storage.SetupCommand(), + storagecmd.SetupCommand(), fs.SetupCommand(), serve.SetupCommand(), }...) diff --git a/server/internal/command/common/common.go b/server/internal/command/common/common.go index 5ff94305..f0e48084 100644 --- a/server/internal/command/common/common.go +++ b/server/internal/command/common/common.go @@ -11,39 +11,18 @@ import ( "github.com/shroff/phylum/server/internal/core/storage" "github.com/shroff/phylum/server/internal/core/user" "github.com/spf13/cobra" - "github.com/spf13/viper" ) -var d *db.DbHandler var s storage.Storage var a app.App var f fs.FileSystem func DB() *db.DbHandler { - if d == nil { - databaseURL := viper.GetString("database_url") - traceSQL := viper.GetBool("debug") && viper.GetBool("trace_sql") - autoMigrate := viper.GetBool("auto_migrate") - if db, err := db.Create(context.Background(), databaseURL, traceSQL, autoMigrate); err != nil { - fmt.Println("could create database: " + err.Error()) - os.Exit(1) - } else { - d = db - } - } - return d + return db.Get() } func Storage() storage.Storage { - if s == nil { - if storage, err := storage.Create(context.Background(), DB(), viper.GetString("default_storage_dir")); err != nil { - fmt.Println("could not open storage: " + err.Error()) - os.Exit(2) - } else { - s = storage - } - } - return s + return storage.Get() } func App() app.App { @@ -60,7 +39,7 @@ func App() app.App { func RootFileSystem() fs.FileSystem { var rootUser user.User - if user, err := App().OpenUserManager(context.Background()).UserByEmail(user.DefaultUserUsername); err != nil { + if user, err := user.CreateManager(context.Background()).UserByEmail(user.DefaultUserUsername); err != nil { fmt.Println("unable to find root user: " + err.Error()) os.Exit(1) } else { @@ -76,11 +55,11 @@ func UserFileSystem(cmd *cobra.Command) fs.FileSystem { fmt.Println("could not read user: " + err.Error()) os.Exit(4) } else { - if user, err := App().OpenUserManager(context.Background()).UserByEmail(value); err != nil { + if u, err := user.CreateManager(context.Background()).UserByEmail(value); err != nil { fmt.Println("could not find user '" + value + "': " + err.Error()) os.Exit(5) } else { - f = App().OpenFileSystem(context.Background(), user) + f = App().OpenFileSystem(context.Background(), u) } } } diff --git a/server/internal/command/fs/chperm.go b/server/internal/command/fs/chperm.go index e680f315..b547fdce 100644 --- a/server/internal/command/fs/chperm.go +++ b/server/internal/command/fs/chperm.go @@ -7,6 +7,7 @@ import ( "github.com/shroff/phylum/server/internal/command/common" "github.com/shroff/phylum/server/internal/core/fs" + "github.com/shroff/phylum/server/internal/core/user" "github.com/spf13/cobra" ) @@ -24,9 +25,9 @@ func setupChpermCommand() *cobra.Command { os.Exit(1) } - user := args[1] - if _, err := common.App().OpenUserManager(context.Background()).UserByEmail(user); err != nil { - fmt.Println("cannot update permissions for user '" + user + "': " + err.Error()) + username := args[1] + if _, err := user.CreateManager(context.Background()).UserByEmail(username); err != nil { + fmt.Println("cannot update permissions for user '" + username + "': " + err.Error()) os.Exit(1) } @@ -44,7 +45,7 @@ func setupChpermCommand() *cobra.Command { os.Exit(1) } - if _, err := f.UpdatePermissions(r, user, permission); err != nil { + if _, err := f.UpdatePermissions(r, username, permission); err != nil { fmt.Println("cannot update permissions for '" + pathOrUUID + "': " + err.Error()) os.Exit(1) } diff --git a/server/internal/command/schema/cmd.go b/server/internal/command/schema/cmd.go index ae34be6d..e19b5957 100644 --- a/server/internal/command/schema/cmd.go +++ b/server/internal/command/schema/cmd.go @@ -7,6 +7,7 @@ import ( "strconv" "github.com/shroff/phylum/server/internal/command/common" + "github.com/shroff/phylum/server/internal/core/db" "github.com/spf13/cobra" "github.com/spf13/viper" ) @@ -49,10 +50,10 @@ func setupSchemaMigrateCommand() *cobra.Command { Run: func(cmd *cobra.Command, args []string) { ctx := context.Background() if args[0] == "auto" || args[0] == "latest" { - viper.Set("auto_migrate", true) + db.AutoMigrate = true common.DB() } else { - viper.Set("auto_migrate", false) + db.AutoMigrate = false if v, err := strconv.Atoi(args[0]); err != nil { fmt.Println(err.Error()) os.Exit(3) diff --git a/server/internal/command/user/add.go b/server/internal/command/user/add.go index f5e2ebc6..ea7993a4 100644 --- a/server/internal/command/user/add.go +++ b/server/internal/command/user/add.go @@ -96,7 +96,7 @@ func setupUserAddCommand() *cobra.Command { ctx := context.Background() err = common.App().RunInTx(ctx, func(db *db.DbHandler) error { - userManager := common.App().OpenUserManager(ctx).WithDb(db) + userManager := user.CreateManager(ctx).WithDb(db) var u user.User if user, err := userManager.CreateUser(username, displayName, password, root); err != nil { return err diff --git a/server/internal/command/user/cmd.go b/server/internal/command/user/cmd.go index b1f96d96..82db1fed 100644 --- a/server/internal/command/user/cmd.go +++ b/server/internal/command/user/cmd.go @@ -4,6 +4,7 @@ import ( "context" "github.com/shroff/phylum/server/internal/command/common" + "github.com/shroff/phylum/server/internal/core/user" "github.com/sirupsen/logrus" "github.com/spf13/cobra" "github.com/spf13/viper" @@ -35,7 +36,7 @@ func setupUserChrootCommand() *cobra.Command { Run: func(cmd *cobra.Command, args []string) { email := args[0] idOrPath := args[1] - userManager := common.App().OpenUserManager(context.Background()) + userManager := user.CreateManager(context.Background()) if user, err := userManager.UserByEmail(email); err != nil { logrus.Fatal(err) } else { @@ -57,7 +58,7 @@ func setupUserListCommand() *cobra.Command { Use: "list", Short: "List Users", Run: func(cmd *cobra.Command, args []string) { - users, err := common.App().OpenUserManager(context.Background()).AllUsers() + users, err := user.CreateManager(context.Background()).AllUsers() if err != nil { logrus.Fatal(err) } diff --git a/server/internal/core/app/app.go b/server/internal/core/app/app.go index 9bdc7102..fde115fc 100644 --- a/server/internal/core/app/app.go +++ b/server/internal/core/app/app.go @@ -14,7 +14,6 @@ import ( type App interface { RunInTx(ctx context.Context, fn func(*db.DbHandler) error) error OpenFileSystem(ctx context.Context, u user.User) fs.FileSystem - OpenUserManager(ctx context.Context) user.Manager } type app struct { @@ -27,8 +26,7 @@ func Create(ctx context.Context, db *db.DbHandler, cs storage.Storage) (App, err db: db, cs: cs, } - userManager := user.CreateManager(ctx, db) - if _, err := userManager.UserByEmail(user.DefaultUserUsername); err != nil { + if _, err := user.CreateManager(ctx).UserByEmail(user.DefaultUserUsername); err != nil { if errors.Is(err, user.ErrNotFound) { _, err = app.populateData(ctx) } @@ -48,10 +46,6 @@ func (a app) OpenFileSystem(ctx context.Context, u user.User) fs.FileSystem { return fs.OpenFileSystem(a.db, ctx, a.cs, u.Username, u.Root) } -func (a app) OpenUserManager(ctx context.Context) user.Manager { - return user.CreateManager(ctx, a.db) -} - func (a app) populateData(ctx context.Context) (u user.User, e error) { e = a.db.WithTx(ctx, func(dbh *db.DbHandler) error { var err error diff --git a/server/internal/core/db/db_handler.go b/server/internal/core/db/db_handler.go index ef743765..f107bb5d 100644 --- a/server/internal/core/db/db_handler.go +++ b/server/internal/core/db/db_handler.go @@ -24,7 +24,23 @@ type DbHandler struct { pool *pgxpool.Pool } -func Create(ctx context.Context, dsn string, traceSQL, autoMigrate bool) (*DbHandler, error) { +var d *DbHandler +var DatabaseURL string +var TraceSQL bool +var AutoMigrate bool + +func Get() *DbHandler { + if d == nil { + if db, err := create(context.Background(), DatabaseURL, TraceSQL, AutoMigrate); err != nil { + panic(err) + } else { + d = db + } + } + return d +} + +func create(ctx context.Context, dsn string, traceSQL, autoMigrate bool) (*DbHandler, error) { config, err := pgxpool.ParseConfig(dsn) if err != nil { return nil, errors.New("Unable to parse DSN: " + err.Error()) diff --git a/server/internal/core/storage/storage.go b/server/internal/core/storage/storage.go index fb8cab5c..aa3cadbb 100644 --- a/server/internal/core/storage/storage.go +++ b/server/internal/core/storage/storage.go @@ -27,7 +27,21 @@ type storage struct { defaultBackend Backend } -func Create(ctx context.Context, db *db.DbHandler, defaultStorageDir string) (Storage, error) { +var s Storage +var DefaultStorageDir string + +func Get() Storage { + if s == nil { + if storage, err := create(context.Background(), db.Get(), DefaultStorageDir); err != nil { + panic(err) + } else { + s = storage + } + } + return s +} + +func create(ctx context.Context, db *db.DbHandler, defaultStorageDir string) (Storage, error) { if backends, err := restoreBackends(db, ctx); err != nil { return nil, err } else if defaultBackend, err := newLocalStorage("", defaultStorageDir); err != nil { diff --git a/server/internal/core/user/manager.go b/server/internal/core/user/manager.go index c2a7b563..67ad0402 100644 --- a/server/internal/core/user/manager.go +++ b/server/internal/core/user/manager.go @@ -11,6 +11,13 @@ type manager struct { ctx context.Context } +func CreateManager(ctx context.Context) Manager { + return &manager{ + ctx: ctx, + db: db.Get(), + } +} + func (m manager) WithDb(db *db.DbHandler) Manager { return m.withDb(db) } diff --git a/server/internal/core/user/user.go b/server/internal/core/user/user.go index 7a3ed443..96ebe4cd 100644 --- a/server/internal/core/user/user.go +++ b/server/internal/core/user/user.go @@ -1,8 +1,6 @@ package user import ( - "context" - "github.com/google/uuid" "github.com/shroff/phylum/server/internal/core/db" "github.com/shroff/phylum/server/internal/core/fs" @@ -42,10 +40,3 @@ type Manager interface { // user_lists.go GetSharedResources(u User) (result []fs.Resource, err error) } - -func CreateManager(ctx context.Context, db *db.DbHandler) Manager { - return &manager{ - ctx: ctx, - db: db, - } -}