mirror of
https://codeberg.org/shroff/phylum.git
synced 2026-02-09 04:59:36 -06:00
59 lines
1.3 KiB
Go
59 lines
1.3 KiB
Go
package fs
|
|
|
|
import (
|
|
"encoding/json"
|
|
|
|
"github.com/shroff/phylum/server/internal/core/db"
|
|
)
|
|
|
|
func (r Resource) UpdatePermissions(username string, permission Permission) (Resource, error) {
|
|
if !r.hasPermission(PermissionShare) {
|
|
return Resource{}, ErrInsufficientPermissions
|
|
}
|
|
// Do not grant more than what you have
|
|
permission = permission & r.userPermission
|
|
|
|
ctx := r.f.ctx
|
|
err := r.f.db.WithTx(ctx, func(dbh *db.DbHandler) error {
|
|
if permission == PermissionNone {
|
|
if err := dbh.RevokeUserPermissionForResource(ctx, db.RevokeUserPermissionForResourceParams{
|
|
ResourceID: r.ID(),
|
|
Username: username,
|
|
}); err != nil {
|
|
return err
|
|
}
|
|
} else {
|
|
if err := dbh.GrantUserPermissionForResource(ctx, db.GrantUserPermissionForResourceParams{
|
|
ResourceID: r.ID(),
|
|
Username: username,
|
|
Permission: permission,
|
|
}); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return dbh.RecomputePermissions(ctx, r.ID())
|
|
})
|
|
if err != nil {
|
|
return Resource{}, err
|
|
}
|
|
p := make(map[string]Permission)
|
|
if r.permissions != nil {
|
|
if err := json.Unmarshal(r.permissions, &p); err != nil {
|
|
return Resource{}, err
|
|
}
|
|
}
|
|
if permission == 0 {
|
|
delete(p, username)
|
|
} else {
|
|
p[username] = permission
|
|
}
|
|
res, err := json.Marshal(p)
|
|
if err != nil {
|
|
return Resource{}, err
|
|
}
|
|
|
|
r.permissions = res
|
|
return r, nil
|
|
}
|