diff --git a/server/internal/app/core/filesystem.go b/server/internal/app/core/filesystem.go index 4d706512..a9378b9c 100644 --- a/server/internal/app/core/filesystem.go +++ b/server/internal/app/core/filesystem.go @@ -101,7 +101,7 @@ func (f filesystem) ResourceByPath(path string) (Resource, error) { func (f filesystem) ResourceByID(id uuid.UUID) (Resource, error) { res, err := f.db.Queries().ResourceByIdWithPermissions(f.ctx, sql.ResourceByIdWithPermissionsParams{Root: f.root.ID(), ResourceID: id, UserID: f.user}) - if err == pgx.ErrNoRows || res.Permission.Int32 == 0 { + if err == pgx.ErrNoRows || res.Permission.(int32) == 0 { err = fs.ErrNotExist } if err != nil { @@ -110,7 +110,7 @@ func (f filesystem) ResourceByID(id uuid.UUID) (Resource, error) { return resource{ id: res.ID, - permission: res.Permission.Int32, + permission: res.Permission.(int32), parentID: res.Parent, name: res.Name, size: res.Size.Int64, diff --git a/server/internal/sql/permissions.sql.go b/server/internal/sql/permissions.sql.go index fe0628b2..64c7d4d4 100644 --- a/server/internal/sql/permissions.sql.go +++ b/server/internal/sql/permissions.sql.go @@ -19,35 +19,32 @@ WITH RECURSIVE nodes(id, parent, permission) AS ( LEFT JOIN permissions p on r.id = p.resource_id AND p.user_id = $2::int - WHERE r.id = $3::uuid + WHERE r.id = $1::uuid UNION ALL - SELECT r.id, r.parent, CASE WHEN (n.permission IS NULL OR p.permission > n.permission) THEN p.permission ELSE n.permission END + SELECT r.id, r.parent, p.permission FROM resources r JOIN nodes n ON r.id = n.parent LEFT JOIN permissions p ON r.id = p.resource_id AND p.user_id = $2::int - WHERE r.parent = $1::uuid - OR r.parent = '00000000-0000-0000-0000-000000000000' + WHERE n.id != $3::uuid ) -SELECT n.id, n.parent, permission, r.id, r.parent, name, dir, created, modified, deleted, size, etag FROM nodes n +SELECT MAX(n.permission) AS permission, r.id, r.parent, r.name, r.dir, r.created, r.modified, r.deleted, r.size, r.etag FROM nodes n JOIN resources r ON n.id = r.id -WHERE n.parent = $1::uuid +WHERE n.id = $1::uuid ` type ResourceByIdWithPermissionsParams struct { - Root uuid.UUID - UserID int32 ResourceID uuid.UUID + UserID int32 + Root uuid.UUID } type ResourceByIdWithPermissionsRow struct { + Permission interface{} ID uuid.UUID Parent uuid.UUID - Permission pgtype.Int4 - ID_2 uuid.UUID - Parent_2 uuid.UUID Name string Dir bool Created pgtype.Timestamp @@ -58,14 +55,12 @@ type ResourceByIdWithPermissionsRow struct { } func (q *Queries) ResourceByIdWithPermissions(ctx context.Context, arg ResourceByIdWithPermissionsParams) (ResourceByIdWithPermissionsRow, error) { - row := q.db.QueryRow(ctx, resourceByIdWithPermissions, arg.Root, arg.UserID, arg.ResourceID) + row := q.db.QueryRow(ctx, resourceByIdWithPermissions, arg.ResourceID, arg.UserID, arg.Root) var i ResourceByIdWithPermissionsRow err := row.Scan( + &i.Permission, &i.ID, &i.Parent, - &i.Permission, - &i.ID_2, - &i.Parent_2, &i.Name, &i.Dir, &i.Created, diff --git a/server/sql/queries/permissions.sql b/server/sql/queries/permissions.sql index 50e84c7b..f78bb1ad 100644 --- a/server/sql/queries/permissions.sql +++ b/server/sql/queries/permissions.sql @@ -14,13 +14,12 @@ WITH RECURSIVE nodes(id, parent, permission) AS ( ON r.id = n.parent LEFT JOIN permissions p ON r.id = p.resource_id AND p.user_id = @user_id::int - WHERE r.parent = @root::uuid - OR r.parent = '00000000-0000-0000-0000-000000000000' + WHERE n.id != @root::uuid ) SELECT * FROM nodes n JOIN resources r ON n.id = r.id -WHERE n.parent = @root::uuid; +WHERE n.id = @resource_id::uuid; -- name: UpdatePermissionsForResource :exec INSERT INTO permissions(resource_id, user_id, permission)