UpdateRole updates an existing role.
(ctx context.Context, patch *UpdateRoleMessage)
| 210 | |
| 211 | // UpdateRole updates an existing role. |
| 212 | func (s *Store) UpdateRole(ctx context.Context, patch *UpdateRoleMessage) (*RoleMessage, error) { |
| 213 | set := qb.Q() |
| 214 | if v := patch.Name; v != nil { |
| 215 | set.Comma("name = ?", *v) |
| 216 | } |
| 217 | if v := patch.Description; v != nil { |
| 218 | set.Comma("description = ?", *v) |
| 219 | } |
| 220 | if v := patch.Permissions; v != nil { |
| 221 | p := &storepb.RolePermissions{} |
| 222 | for k := range *v { |
| 223 | p.Permissions = append(p.Permissions, k) |
| 224 | } |
| 225 | permissionBytes, err := protojson.Marshal(p) |
| 226 | if err != nil { |
| 227 | return nil, err |
| 228 | } |
| 229 | set.Comma("permissions = ?", permissionBytes) |
| 230 | } |
| 231 | if set.Len() == 0 { |
| 232 | return nil, errors.New("no fields to update") |
| 233 | } |
| 234 | |
| 235 | q := qb.Q().Space(` |
| 236 | UPDATE role |
| 237 | SET ? |
| 238 | WHERE resource_id = ? AND workspace = ? |
| 239 | RETURNING name, description, permissions |
| 240 | `, set, patch.ResourceID, patch.Workspace) |
| 241 | |
| 242 | query, args, err := q.ToSQL() |
| 243 | if err != nil { |
| 244 | return nil, errors.Wrapf(err, "failed to build sql") |
| 245 | } |
| 246 | |
| 247 | role := &RoleMessage{ |
| 248 | ResourceID: patch.ResourceID, |
| 249 | Permissions: map[permission.Permission]bool{}, |
| 250 | } |
| 251 | var permissionBytes []byte |
| 252 | if err := s.GetDB().QueryRowContext(ctx, query, args...).Scan(&role.Name, &role.Description, &permissionBytes); err != nil { |
| 253 | return nil, err |
| 254 | } |
| 255 | s.rolesCache.Remove(patch.ResourceID) |
| 256 | var rolePermissions storepb.RolePermissions |
| 257 | if err := common.ProtojsonUnmarshaler.Unmarshal(permissionBytes, &rolePermissions); err != nil { |
| 258 | return nil, err |
| 259 | } |
| 260 | for _, v := range rolePermissions.Permissions { |
| 261 | role.Permissions[v] = true |
| 262 | } |
| 263 | |
| 264 | s.rolesCache.Add(role.ResourceID, role) |
| 265 | return role, nil |
| 266 | } |
| 267 | |
| 268 | // DeleteRole deletes an existing role. |
| 269 | func (s *Store) DeleteRole(ctx context.Context, workspace string, resourceID string) error { |