From 7bee4233823614a826cc120af451e8badddd7bf6 Mon Sep 17 00:00:00 2001 From: Abhishek Shroff Date: Wed, 7 Aug 2024 21:23:58 +0530 Subject: [PATCH] Merge app and core packages --- server/internal/api/api.go | 4 ++-- server/internal/api/auth/auth.go | 2 +- server/internal/api/auth/auth_bearer.go | 6 +++--- server/internal/api/routes/auth.go | 8 ++++---- server/internal/app/resources.go | 7 ------- server/internal/command/appcmd/appcmd.go | 4 ++-- server/internal/command/appcmd/resource.go | 13 ++++++------ server/internal/command/appcmd/serve.go | 10 +++++----- server/internal/command/appcmd/user.go | 8 ++++---- server/internal/{app => core}/app.go | 20 ++++--------------- server/internal/{app => core}/auth.go | 7 +++---- server/internal/{app => }/core/filesystem.go | 0 server/internal/{app => }/core/resource.go | 0 server/internal/{app => }/core/user.go | 0 .../{app/users.go => core/user_manager.go} | 13 ++++++------ server/internal/webdav/auth_basic.go | 6 +++--- server/internal/webdav/handler.go | 7 +++---- server/internal/webdav/impl/file.go | 2 +- server/internal/webdav/impl/prop.go | 2 +- server/internal/webdav/impl/serve_resource.go | 2 +- server/internal/webdav/impl/webdav.go | 2 +- 21 files changed, 50 insertions(+), 73 deletions(-) delete mode 100644 server/internal/app/resources.go rename server/internal/{app => core}/app.go (76%) rename server/internal/{app => core}/auth.go (94%) rename server/internal/{app => }/core/filesystem.go (100%) rename server/internal/{app => }/core/resource.go (100%) rename server/internal/{app => }/core/user.go (100%) rename server/internal/{app/users.go => core/user_manager.go} (87%) diff --git a/server/internal/api/api.go b/server/internal/api/api.go index 2b839163..0e6ee04e 100644 --- a/server/internal/api/api.go +++ b/server/internal/api/api.go @@ -5,10 +5,10 @@ import ( "github.com/shroff/phylum/server/internal/api/auth" "github.com/shroff/phylum/server/internal/api/errors" "github.com/shroff/phylum/server/internal/api/routes" - "github.com/shroff/phylum/server/internal/app" + "github.com/shroff/phylum/server/internal/core" ) -func Setup(r *gin.RouterGroup, a *app.App) { +func Setup(r *gin.RouterGroup, a *core.App) { r.Use(handleApiError) // Unauthenticated routes diff --git a/server/internal/api/auth/auth.go b/server/internal/api/auth/auth.go index 9638a862..b4de807d 100644 --- a/server/internal/api/auth/auth.go +++ b/server/internal/api/auth/auth.go @@ -2,7 +2,7 @@ package auth import ( "github.com/gin-gonic/gin" - "github.com/shroff/phylum/server/internal/app/core" + "github.com/shroff/phylum/server/internal/core" ) const keyFileSystem = "filesystem" diff --git a/server/internal/api/auth/auth_bearer.go b/server/internal/api/auth/auth_bearer.go index 800ac0f1..115574b4 100644 --- a/server/internal/api/auth/auth_bearer.go +++ b/server/internal/api/auth/auth_bearer.go @@ -6,14 +6,14 @@ import ( "github.com/gin-gonic/gin" "github.com/shroff/phylum/server/internal/api/errors" - "github.com/shroff/phylum/server/internal/app" + "github.com/shroff/phylum/server/internal/core" "github.com/sirupsen/logrus" ) const errCodeAuthRequred = "auth_required" const errCodeTokenInvalid = "token_invalid" -func CreateBearerAuthHandler(a *app.App) func(c *gin.Context) { +func CreateBearerAuthHandler(a *core.App) func(c *gin.Context) { return func(c *gin.Context) { authHeader := c.GetHeader("Authorization") if authHeader == "" { @@ -29,7 +29,7 @@ func CreateBearerAuthHandler(a *app.App) func(c *gin.Context) { userID, err := a.VerifyAccessToken(authParts[1]) if err != nil { - if errors.Is(err, app.ErrTokenExpired) || errors.Is(err, app.ErrTokenInvalid) { + if errors.Is(err, core.ErrTokenExpired) || errors.Is(err, core.ErrTokenInvalid) { panic(errors.Err{Status: 401, Code: errCodeTokenInvalid}) } panic(err) diff --git a/server/internal/api/routes/auth.go b/server/internal/api/routes/auth.go index 54e35c83..1b0bb4e6 100644 --- a/server/internal/api/routes/auth.go +++ b/server/internal/api/routes/auth.go @@ -5,15 +5,15 @@ import ( "github.com/gin-gonic/gin" "github.com/shroff/phylum/server/internal/api/errors" - "github.com/shroff/phylum/server/internal/app" + "github.com/shroff/phylum/server/internal/core" ) -func SetupAuthRoutes(r *gin.RouterGroup, a *app.App) { +func SetupAuthRoutes(r *gin.RouterGroup, a *core.App) { group := r.Group("/auth") group.POST("/login", createLoginRouteHandler(a)) } -func createLoginRouteHandler(a *app.App) func(c *gin.Context) { +func createLoginRouteHandler(a *core.App) func(c *gin.Context) { return func(c *gin.Context) { username, ok := c.GetQuery("username") if !ok { @@ -25,7 +25,7 @@ func createLoginRouteHandler(a *app.App) func(c *gin.Context) { } if token, err := a.CreateAccessToken(username, password); err != nil { - if errors.Is(err, app.ErrCredentialsInvalid) { + if errors.Is(err, core.ErrCredentialsInvalid) { panic(errors.New(http.StatusUnauthorized, "credentials_invalid", "")) } panic(err) diff --git a/server/internal/app/resources.go b/server/internal/app/resources.go deleted file mode 100644 index 86f067be..00000000 --- a/server/internal/app/resources.go +++ /dev/null @@ -1,7 +0,0 @@ -package app - -import ( - "errors" -) - -var ErrResourceNotFound = errors.New("resource not found") diff --git a/server/internal/command/appcmd/appcmd.go b/server/internal/command/appcmd/appcmd.go index b8d072fe..27b9843d 100644 --- a/server/internal/command/appcmd/appcmd.go +++ b/server/internal/command/appcmd/appcmd.go @@ -1,7 +1,7 @@ package appcmd import ( - "github.com/shroff/phylum/server/internal/app" + "github.com/shroff/phylum/server/internal/core" "github.com/shroff/phylum/server/internal/db" "github.com/shroff/phylum/server/internal/storage" "github.com/sirupsen/logrus" @@ -27,7 +27,7 @@ func SetupCommand(db **db.DbHandler, debug bool) *cobra.Command { if cs, err = storage.Open(*db, viper.GetString("content-dir")); err != nil { logrus.Fatal(err) } else { - if err := app.Create(*db, cs, debug); err != nil { + if err := core.Create(*db, cs, debug); err != nil { logrus.Fatal(err) } } diff --git a/server/internal/command/appcmd/resource.go b/server/internal/command/appcmd/resource.go index 61d95e0f..deb7fa02 100644 --- a/server/internal/command/appcmd/resource.go +++ b/server/internal/command/appcmd/resource.go @@ -8,8 +8,7 @@ import ( "strings" "github.com/google/uuid" - "github.com/shroff/phylum/server/internal/app" - "github.com/shroff/phylum/server/internal/app/core" + "github.com/shroff/phylum/server/internal/core" "github.com/sirupsen/logrus" "github.com/spf13/cobra" ) @@ -105,7 +104,7 @@ func setupResourceRmCommand() *cobra.Command { func setupResourceLsCommand() *cobra.Command { details := func(r core.Resource, name string) string { - if owner, err := app.Default.UserByID(context.Background(), r.Owner()); err != nil { + if owner, err := core.Default.UserByID(context.Background(), r.Owner()); err != nil { logrus.Fatal(err) return "" } else { @@ -178,7 +177,7 @@ func setupResourceChownCommand() *cobra.Command { username := args[0] path := args[1] var owner int32 - if user, err := app.Default.UserByUsername(context.Background(), username); err != nil { + if user, err := core.Default.UserByUsername(context.Background(), username); err != nil { logrus.Fatal(err) } else { owner = user.ID() @@ -237,7 +236,7 @@ func openFileSystemFromFlags(cmd *cobra.Command) { if value, err := cmd.Flags().GetInt32("user"); err != nil { logrus.Fatal(err) } else if value != 0 { - if user, err := app.Default.UserByID(context.Background(), value); err != nil { + if user, err := core.Default.UserByID(context.Background(), value); err != nil { logrus.Fatal(err) } else { user = user @@ -248,7 +247,7 @@ func openFileSystemFromFlags(cmd *cobra.Command) { if value, err := cmd.Flags().GetString("username"); err != nil { logrus.Fatal(err) } else { - if user, err := app.Default.UserByUsername(context.Background(), value); err != nil { + if user, err := core.Default.UserByUsername(context.Background(), value); err != nil { logrus.Fatal(err) } else { user = user @@ -256,7 +255,7 @@ func openFileSystemFromFlags(cmd *cobra.Command) { } var err error - fs, err = app.Default.OpenFileSystem(context.Background(), user) + fs, err = core.Default.OpenFileSystem(context.Background(), user) if err != nil { logrus.Fatal(err) } diff --git a/server/internal/command/appcmd/serve.go b/server/internal/command/appcmd/serve.go index 7fe844f3..9dc432be 100644 --- a/server/internal/command/appcmd/serve.go +++ b/server/internal/command/appcmd/serve.go @@ -8,7 +8,7 @@ import ( "github.com/gin-contrib/cors" "github.com/gin-gonic/gin" "github.com/shroff/phylum/server/internal/api" - "github.com/shroff/phylum/server/internal/app" + "github.com/shroff/phylum/server/internal/core" "github.com/shroff/phylum/server/internal/webdav" "github.com/sirupsen/logrus" "github.com/spf13/cobra" @@ -23,9 +23,9 @@ func setupServeCommand() *cobra.Command { config := viper.GetViper() engine := createEngine(config.GetBool("log_body"), config.GetBool("cors_enabled"), config.GetStringSlice("cors_origins")) - webdav.SetupHandler(engine.Group(config.GetString("webdav_prefix")), app.Default) + webdav.SetupHandler(engine.Group(config.GetString("webdav_prefix")), core.Default) - api.Setup(engine.Group("/api/v1"), app.Default) + api.Setup(engine.Group("/api/v1"), core.Default) server := endless.NewServer(config.GetString("listen"), engine) server.BeforeBegin = func(addr string) { @@ -58,11 +58,11 @@ func setupServeCommand() *cobra.Command { } func createEngine(logBody bool, corsEnabled bool, corsOrigins []string) *gin.Engine { - if !app.Default.Debug { + if !core.Default.Debug { gin.SetMode(gin.ReleaseMode) } engine := gin.Default() - if app.Default.Debug && logBody { + if core.Default.Debug && logBody { engine.Use(logBodyMiddleware) } diff --git a/server/internal/command/appcmd/user.go b/server/internal/command/appcmd/user.go index 5c01671b..66c7c00c 100644 --- a/server/internal/command/appcmd/user.go +++ b/server/internal/command/appcmd/user.go @@ -6,7 +6,7 @@ import ( "strings" "syscall" - "github.com/shroff/phylum/server/internal/app" + "github.com/shroff/phylum/server/internal/core" "github.com/sirupsen/logrus" "github.com/spf13/cobra" "golang.org/x/term" @@ -61,7 +61,7 @@ func setupUserAddCommand() *cobra.Command { } } - if err := app.Default.CreateUser(context.Background(), username, displayName, password, nil); err != nil { + if err := core.Default.CreateUser(context.Background(), username, displayName, password, nil); err != nil { logrus.Fatal(err) } }, @@ -76,7 +76,7 @@ func setupUserListCommand() *cobra.Command { Use: "list", Short: "List Users", Run: func(cmd *cobra.Command, args []string) { - users, err := app.Default.ListUsers(context.Background()) + users, err := core.Default.ListUsers(context.Background()) if err != nil { logrus.Fatal(err) } @@ -103,7 +103,7 @@ func setupUserLoginCommand() *cobra.Command { } password := string(bytes) - accessToken, err := app.Default.CreateAccessToken(username, password) + accessToken, err := core.Default.CreateAccessToken(username, password) if err != nil { logrus.Fatal(err) } diff --git a/server/internal/app/app.go b/server/internal/core/app.go similarity index 76% rename from server/internal/app/app.go rename to server/internal/core/app.go index af1fa0bd..e8c85172 100644 --- a/server/internal/app/app.go +++ b/server/internal/core/app.go @@ -1,4 +1,4 @@ -package app +package core import ( "context" @@ -6,7 +6,6 @@ import ( "github.com/google/uuid" "github.com/jackc/pgx/v5" - "github.com/shroff/phylum/server/internal/app/core" "github.com/shroff/phylum/server/internal/db" "github.com/shroff/phylum/server/internal/storage" ) @@ -15,7 +14,7 @@ const defaultUserName = "phylum" type App struct { Debug bool - rootfs core.FileSystem + rootfs FileSystem db *db.DbHandler cs storage.Storage } @@ -29,17 +28,6 @@ func Create(db *db.DbHandler, cs storage.Storage, debug bool) error { cs: cs, } - // if root, err := Default.UserByUsername(context.Background(), "phylum"); err != nil { - // return err - // } else if fs, err := Default.OpenFileSystem(context.Background(), root.ID()); err != nil { - // return err - // } else { - // Default.rootfs = fs - // if _, err := fs.ResourceByPath("/home"); err != nil { - // _, err := fs.CreateMemberResource(fs.Root(), uuid.New(), "home", true) - // return err - // } - // } return Default.setupAppData() } @@ -114,6 +102,6 @@ func (a App) setupAppData() error { }) } -func (a App) OpenFileSystem(ctx context.Context, user core.User) (core.FileSystem, error) { - return core.OpenFileSystem(a.db, ctx, a.cs, user) +func (a App) OpenFileSystem(ctx context.Context, user User) (FileSystem, error) { + return OpenFileSystem(a.db, ctx, a.cs, user) } diff --git a/server/internal/app/auth.go b/server/internal/core/auth.go similarity index 94% rename from server/internal/app/auth.go rename to server/internal/core/auth.go index 51a09825..1c81818b 100644 --- a/server/internal/app/auth.go +++ b/server/internal/core/auth.go @@ -1,4 +1,4 @@ -package app +package core import ( "context" @@ -8,7 +8,6 @@ import ( "github.com/jackc/pgx/v5" "github.com/jackc/pgx/v5/pgtype" - "github.com/shroff/phylum/server/internal/app/core" "github.com/shroff/phylum/server/internal/cryptutil" "github.com/shroff/phylum/server/internal/db" "golang.org/x/exp/rand" @@ -25,7 +24,7 @@ var ErrCredentialsInvalid = errors.New("credentials invalid") var ErrTokenInvalid = errors.New("token invalid") var ErrTokenExpired = errors.New("token expired") -func (a App) VerifyUserPassword(ctx context.Context, username, password string) (core.User, error) { +func (a App) VerifyUserPassword(ctx context.Context, username, password string) (User, error) { if user, err := a.db.Queries().UserByUsername(context.Background(), username); err != nil { if errors.Is(err, pgx.ErrNoRows) { return nil, ErrCredentialsInvalid @@ -61,7 +60,7 @@ func (a App) CreateAccessToken(username, password string) (db.AccessToken, error } } -func (a App) VerifyAccessToken(accessToken string) (core.User, error) { +func (a App) VerifyAccessToken(accessToken string) (User, error) { token, err := a.db.Queries().AccessTokenById(context.Background(), accessToken) if errors.Is(err, pgx.ErrNoRows) { return nil, ErrTokenInvalid diff --git a/server/internal/app/core/filesystem.go b/server/internal/core/filesystem.go similarity index 100% rename from server/internal/app/core/filesystem.go rename to server/internal/core/filesystem.go diff --git a/server/internal/app/core/resource.go b/server/internal/core/resource.go similarity index 100% rename from server/internal/app/core/resource.go rename to server/internal/core/resource.go diff --git a/server/internal/app/core/user.go b/server/internal/core/user.go similarity index 100% rename from server/internal/app/core/user.go rename to server/internal/core/user.go diff --git a/server/internal/app/users.go b/server/internal/core/user_manager.go similarity index 87% rename from server/internal/app/users.go rename to server/internal/core/user_manager.go index 23ef0442..62630e0f 100644 --- a/server/internal/app/users.go +++ b/server/internal/core/user_manager.go @@ -1,4 +1,4 @@ -package app +package core import ( "context" @@ -6,7 +6,6 @@ import ( "github.com/google/uuid" "github.com/jackc/pgx/v5" - "github.com/shroff/phylum/server/internal/app/core" "github.com/shroff/phylum/server/internal/cryptutil" "github.com/shroff/phylum/server/internal/db" ) @@ -39,14 +38,14 @@ func (a App) CreateUser(ctx context.Context, username, displayName, password str } } -func (a App) ListUsers(ctx context.Context) ([]core.User, error) { +func (a App) ListUsers(ctx context.Context) ([]User, error) { results, err := a.db.Queries().ListUsers(ctx) if err != nil { return nil, err } - users := make([]core.User, len(results)) + users := make([]User, len(results)) for i, r := range results { - users[i] = core.user{ + users[i] = user{ id: r.ID, username: r.Username, displayName: r.DisplayName, @@ -56,7 +55,7 @@ func (a App) ListUsers(ctx context.Context) ([]core.User, error) { return users, nil } -func (a App) UserByUsername(ctx context.Context, username string) (core.User, error) { +func (a App) UserByUsername(ctx context.Context, username string) (User, error) { result, err := a.db.Queries().UserByUsername(ctx, username) if err != nil { if errors.Is(err, pgx.ErrNoRows) { @@ -72,7 +71,7 @@ func (a App) UserByUsername(ctx context.Context, username string) (core.User, er }, nil } -func (a App) UserByID(ctx context.Context, userID int32) (core.User, error) { +func (a App) UserByID(ctx context.Context, userID int32) (User, error) { result, err := a.db.Queries().UserByID(ctx, userID) if err != nil { if errors.Is(err, pgx.ErrNoRows) { diff --git a/server/internal/webdav/auth_basic.go b/server/internal/webdav/auth_basic.go index d1ce2a69..a5ec369b 100644 --- a/server/internal/webdav/auth_basic.go +++ b/server/internal/webdav/auth_basic.go @@ -5,17 +5,17 @@ import ( "net/http" "github.com/gin-gonic/gin" - "github.com/shroff/phylum/server/internal/app" + "github.com/shroff/phylum/server/internal/core" "github.com/sirupsen/logrus" ) const keyFileSystem = "filesystem" -func createBasicAuthHandler(a *app.App) func(c *gin.Context) { +func createBasicAuthHandler(a *core.App) func(c *gin.Context) { return func(c *gin.Context) { if username, pass, ok := c.Request.BasicAuth(); !ok { } else if user, err := a.VerifyUserPassword(c.Request.Context(), username, pass); err != nil { - if errors.Is(err, app.ErrCredentialsInvalid) { + if errors.Is(err, core.ErrCredentialsInvalid) { c.Header("WWW-Authenticate", "Basic realm=\"Phylum WebDAV\"") c.AbortWithStatus(http.StatusUnauthorized) } else { diff --git a/server/internal/webdav/handler.go b/server/internal/webdav/handler.go index e46a4d66..7a92e8b7 100644 --- a/server/internal/webdav/handler.go +++ b/server/internal/webdav/handler.go @@ -10,18 +10,17 @@ import ( "github.com/gin-gonic/gin" "github.com/google/uuid" - "github.com/shroff/phylum/server/internal/app" - "github.com/shroff/phylum/server/internal/app/core" + "github.com/shroff/phylum/server/internal/core" webdav "github.com/shroff/phylum/server/internal/webdav/impl" "github.com/sirupsen/logrus" ) type handler struct { - app *app.App + app *core.App prefix string } -func SetupHandler(r *gin.RouterGroup, app *app.App) { +func SetupHandler(r *gin.RouterGroup, app *core.App) { logrus.Info("Setting up WebDAV access at " + r.BasePath()) handler := &handler{ app: app, diff --git a/server/internal/webdav/impl/file.go b/server/internal/webdav/impl/file.go index 8cdb602e..89a83125 100644 --- a/server/internal/webdav/impl/file.go +++ b/server/internal/webdav/impl/file.go @@ -12,7 +12,7 @@ import ( "path" "path/filepath" - "github.com/shroff/phylum/server/internal/app/core" + "github.com/shroff/phylum/server/internal/core" ) // A FileSystem implements access to a collection of named files. The elements diff --git a/server/internal/webdav/impl/prop.go b/server/internal/webdav/impl/prop.go index 38f4a569..9a0ff690 100644 --- a/server/internal/webdav/impl/prop.go +++ b/server/internal/webdav/impl/prop.go @@ -11,7 +11,7 @@ import ( "net/http" "strconv" - "github.com/shroff/phylum/server/internal/app/core" + "github.com/shroff/phylum/server/internal/core" ) // Proppatch describes a property update instruction as defined in RFC 4918. diff --git a/server/internal/webdav/impl/serve_resource.go b/server/internal/webdav/impl/serve_resource.go index a4f3d518..1ba9228e 100644 --- a/server/internal/webdav/impl/serve_resource.go +++ b/server/internal/webdav/impl/serve_resource.go @@ -12,7 +12,7 @@ import ( "strings" "time" - "github.com/shroff/phylum/server/internal/app/core" + "github.com/shroff/phylum/server/internal/core" ) var htmlReplacer = strings.NewReplacer( diff --git a/server/internal/webdav/impl/webdav.go b/server/internal/webdav/impl/webdav.go index 3c0bd292..488ef715 100644 --- a/server/internal/webdav/impl/webdav.go +++ b/server/internal/webdav/impl/webdav.go @@ -17,7 +17,7 @@ import ( "strings" "time" - "github.com/shroff/phylum/server/internal/app/core" + "github.com/shroff/phylum/server/internal/core" ) type Handler struct {