Module: Grafana::FolderPermissions

Included in:
Client
Defined in:
lib/grafana/folder_permissions.rb

Overview

docs.grafana.org/http_api/folder_permissions/#folder-permissions-api

This API can be used to update/get the permissions for a folder.

Permissions with folderId=-1 are the default permissions for users with the Viewer and Editor roles. Permissions can be set for a user, a team or a role (Viewer or Editor). Permissions cannot be set for Admins - they always have access to everything.

The permission levels for the permission field:

1 = View 2 = Edit 4 = Admin

Instance Method Summary collapse

Instance Method Details

#folder_permissions(folder_id) ⇒ Object

Get permissions for a folder GET /api/folders/:uid/permissions

Gets all existing permissions for the folder with the given uid.



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/grafana/folder_permissions.rb', line 23

def folder_permissions( folder_id )

  v, mv = version.values
  return { 'status' => 404, 'message' => format( 'folder has been supported in Grafana since version 5. you use version %s', v) } if(mv < 5)

  f = folder( folder_id )

  status = f.dig('status')
  return f if( status != 200 )

  endpoint = format('/api/folders/%s/permissions', f.dig('uid') )

  @logger.debug("Getting all folders (GET #{endpoint})") if @debug
  get(endpoint)
end

#update_folder_permissions(params) ⇒ Object

Update permissions for a folder POST /api/folders/:uid/permissions

Updates permissions for a folder. This operation will remove existing permissions if they’re not included in the request.

JSON body schema:

items - The permission items to add/update. Items that are omitted from the list will be removed.

Raises:

  • (ArgumentError)


50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
# File 'lib/grafana/folder_permissions.rb', line 50

def update_folder_permissions( params )

  raise ArgumentError.new(format('wrong type. \'params\' must be an Hash, given \'%s\'', params.class.to_s)) unless( params.is_a?(Hash) )
  raise ArgumentError.new('missing \'params\'') if( params.size.zero? )

  v, mv = version.values
  return { 'status' => 404, 'message' => format( 'folder has been supported in Grafana since version 5. you use version %s', v) } if(mv < 5)

  folder      = validate( params, required: true, var: 'folder'     , type: String )
  permissions = validate( params, required: true, var: 'permissions', type: Hash )

  return { 'status' => 404, 'message' => 'no permissions given' } if( permissions.size.zero? )

  f_folder = folder(folder)
  return { 'status' => 404, 'message' => format( 'No Folder \'%s\' found', folder) } if( f_folder.dig('status') != 200 )

  folder_uid = f_folder.dig('uid')

  valid_roles = %w[View Edit Admin]
#       valid_keys  = %w[role permission teamId userId]

  c_team = permissions.dig('team')
  c_user = permissions.dig('user')
  team   = []
  user   = []

  unless(c_team.nil?)
    check_keys = []

    c_team.uniq.each do |x|
      k = x.keys.first
      v = x.values.first
      r = validate_hash( v, valid_roles )

      f_team = team(k)
      team_id = f_team.dig('id')

      next unless(( f_team.dig('status') == 200) && !check_keys.include?(team_id) && r == true )

      check_keys << team_id

      role_id = valid_roles.index(v)
      role_id += 1
      role_id += 1 if(v == 'Admin')

      team << {
        teamId: team_id,
        permission: role_id
      }
    end
  end

  unless(c_user.nil?)
    check_keys = []

    c_user.uniq.each do |x|
      k = x.keys.first
      v = x.values.first
      r = validate_hash( v, valid_roles )

      f_user = user(k)
      user_id = f_user.dig('id')

      next unless(( f_user.dig('status') == 200) && !check_keys.include?(user_id) && r == true )

      check_keys << user_id

      role_id = valid_roles.index(v)
      role_id += 1
      role_id += 1 if(v == 'Admin')

      user << {
        userId: user_id,
        permission: role_id
      }
    end
  end

  payload = {
    items: team + user
  }
  payload.reject!{ |_, y| y.nil? }

  endpoint = format( '/api/folders/%s/permissions', folder_uid )

  post(endpoint, payload.to_json)
end