From a9e45ddbc22968643b5f519d48d94d69faf91ae4 Mon Sep 17 00:00:00 2001 From: Abhishek Shroff Date: Tue, 6 Aug 2024 23:04:54 +0530 Subject: [PATCH] Update resource owner --- server/internal/app/core/filesystem.go | 12 ++++ server/internal/command/appcmd/resource.go | 71 ++++++++++++++++++++++ server/internal/sql/resources.sql.go | 18 ++++++ server/sql/queries/resources.sql | 7 +++ 4 files changed, 108 insertions(+) diff --git a/server/internal/app/core/filesystem.go b/server/internal/app/core/filesystem.go index 286407c5..30e54f58 100644 --- a/server/internal/app/core/filesystem.go +++ b/server/internal/app/core/filesystem.go @@ -28,6 +28,7 @@ type FileSystem interface { UpdateName(r Resource, name string) error UpdateParent(r Resource, parent uuid.UUID) error UpdatePermissions(r Resource, userID int32, permission int32) error + UpdateOwner(r Resource, userID int32) error } var rootUUID = uuid.UUID{} @@ -275,3 +276,14 @@ func (f filesystem) UpdatePermissions(r Resource, userID int32, permission int32 Permission: permission, }) } + +func (f filesystem) UpdateOwner(r Resource, userID int32) error { + if r.Owner() != f.user { + return ErrInsufficientPermissions + } + + return f.db.Queries().UpdateResourceOwner(f.ctx, sql.UpdateResourceOwnerParams{ + ID: r.ID(), + Owner: userID, + }) +} diff --git a/server/internal/command/appcmd/resource.go b/server/internal/command/appcmd/resource.go index 0516bb58..c34dc962 100644 --- a/server/internal/command/appcmd/resource.go +++ b/server/internal/command/appcmd/resource.go @@ -26,6 +26,7 @@ func setupResourceCommand() *cobra.Command { setupResourceMkdirCommand(), setupResourceRmCommand(), setupResourceLsCommand(), + setupResourceChownCommand(), }...) return cmd } @@ -177,6 +178,76 @@ func setupResourceLsCommand() *cobra.Command { return &cmd } +func setupResourceChownCommand() *cobra.Command { + cmd := cobra.Command{ + Use: "chown user ", + Short: "Change Resource Owner", + Args: cobra.ExactArgs(2), + PreRun: func(cmd *cobra.Command, args []string) { + readUserIDFromFlagsreadUsername(cmd) + }, + Run: func(cmd *cobra.Command, args []string) { + username := args[0] + var owner int32 + if user, err := app.Default.UserByUsername(context.Background(), username); err != nil { + logrus.Fatal(err) + } else { + owner = user.ID() + } + + path := args[1] + fs, err := app.Default.OpenFileSystem(context.Background(), userID) + if err != nil { + logrus.Fatal(err) + } + var r core.Resource + if path[0] != '/' { + var id uuid.UUID + var err error + if id, err = uuid.Parse(path); err != nil { + logrus.Fatal(err) + } + + if r, err = fs.ResourceByID(id); err != nil { + if errors.Is(err, iofs.ErrNotExist) { + logrus.Fatal("Resource not found: " + path) + } else { + logrus.Fatal(err.Error()) + } + } + } else { + var err error + if r, err = fs.ResourceByPath(path); err != nil { + if errors.Is(err, iofs.ErrNotExist) { + logrus.Fatal("Resource not found: " + path) + } else { + logrus.Fatal(err.Error()) + } + } + } + if err := fs.UpdateOwner(r, owner); err != nil { + logrus.Fatal(err) + } + + // if r.IsDir() { + // if recursive, err := cmd.Flags().GetBool("recursive"); err != nil { + // logrus.Fatal("Must use -r to delete collections") + // } else { + // if recursive { + // } else { + // } + // } + // } + + }, + } + // flags := cmd.Flags() + // flags.BoolP("recursive", "r", false, "Recursively change ownership") + setupUsernameFlags(&cmd) + + return &cmd +} + func readUserIDFromFlagsreadUsername(cmd *cobra.Command) { if value, err := cmd.Flags().GetInt32("user"); err != nil { logrus.Fatal(err) diff --git a/server/internal/sql/resources.sql.go b/server/internal/sql/resources.sql.go index 3aa2cda8..d844af58 100644 --- a/server/internal/sql/resources.sql.go +++ b/server/internal/sql/resources.sql.go @@ -182,6 +182,24 @@ func (q *Queries) UpdateResourceName(ctx context.Context, arg UpdateResourceName return err } +const updateResourceOwner = `-- name: UpdateResourceOwner :exec +UPDATE resources +SET + owner = $1::int, + modified = NOW() +WHERE id = $2::uuid +` + +type UpdateResourceOwnerParams struct { + Owner int32 + ID uuid.UUID +} + +func (q *Queries) UpdateResourceOwner(ctx context.Context, arg UpdateResourceOwnerParams) error { + _, err := q.db.Exec(ctx, updateResourceOwner, arg.Owner, arg.ID) + return err +} + const updateResourceParent = `-- name: UpdateResourceParent :exec UPDATE resources SET diff --git a/server/sql/queries/resources.sql b/server/sql/queries/resources.sql index 726c416a..4d007f1d 100644 --- a/server/sql/queries/resources.sql +++ b/server/sql/queries/resources.sql @@ -29,6 +29,13 @@ SET modified = NOW() WHERE id = @id::uuid; +-- name: UpdateResourceOwner :exec +UPDATE resources +SET + owner = @owner::int, + modified = NOW() +WHERE id = @id::uuid; + -- name: UpdateResourceName :exec UPDATE resources SET