Class: GoodData::UserGroup

Inherits:
Rest::Resource show all
Includes:
Mixin::Author, Mixin::Contributor, Mixin::Links, Mixin::UriGetter
Defined in:
lib/gooddata/models/user_group.rb

Overview

Representation of User Group

Use user groups to manage user access to dashboards on the GoodData Portal. Create groups to more quickly manage permissions for users with the the same role or who need similar access to dashboards. Groups can be part of groups.

Constant Summary collapse

EMPTY_OBJECT =
{
  'userGroup' => {
    'content' => {
      'name' => nil,
      'description' => nil,
      'project' => nil
    }
  }
}

Instance Attribute Summary

Attributes inherited from Rest::Object

#client, #json, #project

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Mixin::UriGetter

#uri

Methods included from Mixin::Links

#links

Methods included from Mixin::Contributor

#contributor

Methods included from Mixin::Author

#author, #author_uri

Methods included from Mixin::ObjId

#obj_id

Methods inherited from Rest::Object

client, default_client, #saved?

Methods included from Mixin::DataPropertyReader

#data_property_reader

Methods included from Mixin::DataPropertyWriter

#data_property_writer

Methods included from Mixin::MetaPropertyReader

#metadata_property_reader

Methods included from Mixin::MetaPropertyWriter

#metadata_property_writer

Methods included from Mixin::MetaGetter

#meta

Methods included from Mixin::DataGetter

#data

Methods included from Mixin::RootKeyGetter

#root_key

Methods included from Mixin::ContentGetter

#content

Constructor Details

#initialize(json) ⇒ UserGroup

Initialize object with json



113
114
115
116
# File 'lib/gooddata/models/user_group.rb', line 113

def initialize(json)
  @json = json
  self
end

Class Method Details

.[](id, opts = {}) ⇒ Array<GoodData::Segment>

Returns list of all clients or a particular client

Parameters:

  • id (String|Symbol)

    Uri of the segment required or :all for all segments.

Returns:



45
46
47
48
49
50
51
52
53
54
55
# File 'lib/gooddata/models/user_group.rb', line 45

def [](id, opts = {})
  # TODO: Replace with GoodData.get_client_and_project(opts)
  project = opts[:project]
  fail 'Project has to be passed in options' unless project
  fail 'Project has to be of type GoodData::Project' unless project.is_a?(GoodData::Project)
  client = project.client

  results = client.get('/gdc/userGroups', params: { :project => project.pid, :user => opts[:user] }.compact)
  groups = GoodData::Helpers.get_path(results, %w(userGroups items)).map { |i| client.create(GoodData::UserGroup, i, :project => project) }
  id == :all ? groups : groups.find { |g| g.obj_id == id || g.name == id }
end

.construct_payload(users, operation) ⇒ Hash

Constructs payload for user management/manipulation

Returns:

  • (Hash)

    Created payload



82
83
84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/gooddata/models/user_group.rb', line 82

def construct_payload(users, operation)
  users = users.is_a?(Array) ? users : [users]

  {
    modifyMembers: {
      operation: operation,
      items: users.map do |user|
        uri = user.respond_to?(:uri) ? user.uri : user
        fail 'You cannot add group as member of another group as of now.' if uri =~ %r{^\/gdc\/userGroups\/}
        uri
      end
    }
  }
end

.create(data) ⇒ UserGroup

Create new user group

Should not be called directly. Use GoodData::Project.add_user_group.

Parameters:

  • data (Hash)

    Initial data

Options Hash (data):

Returns:



65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/gooddata/models/user_group.rb', line 65

def create(data)
  new_data = GoodData::Helpers.deep_dup(EMPTY_OBJECT).tap do |d|
    d['userGroup']['content']['name'] = data[:name]
    d['userGroup']['content']['description'] = data[:description]
    d['userGroup']['content']['project'] = data[:project].uri
  end

  client = data[:project].client

  group = client.create(GoodData::UserGroup, GoodData::Helpers.stringify_keys(new_data))
  group.project = data[:project]
  group
end

.modify_users(client, users, operation, uri) ⇒ String

URI used for membership manipulation/managementv

Parameters:

  • client (Client)

    Client used for communication with platform

  • users (User | String | Array<User> | Array<String>)

    User(s) to be modified

  • operation (String)

    Operation to be performed - ADD, SET, REMOVE

  • uri (String)

    URI to be used for operation

Returns:

  • (String)

    URI used for membership manipulation/management



104
105
106
107
# File 'lib/gooddata/models/user_group.rb', line 104

def modify_users(client, users, operation, uri)
  payload = construct_payload(users, operation)
  client.post(uri, payload)
end

Instance Method Details

#==(other) ⇒ Boolean

Checks if two user groups are same

Returns:

  • (Boolean)

    Return true if the two groups are same



248
249
250
# File 'lib/gooddata/models/user_group.rb', line 248

def ==(other)
  uri == other.uri
end

#add_members(user) ⇒ nil Also known as: add_member

Add member(s) to user group

Parameters:

  • Users (String | User | Array<User>)

    to add to user group

Returns:

  • (nil)

    Nothing is returned



122
123
124
# File 'lib/gooddata/models/user_group.rb', line 122

def add_members(user)
  UserGroup.modify_users(client, user, 'ADD', uri_modify_members)
end

#descriptionString

Gets user group description

Returns:

  • (String)

    User group description



147
148
149
# File 'lib/gooddata/models/user_group.rb', line 147

def description
  content['description']
end

#description=(name) ⇒ String

Sets user group description

Parameters:

  • name (String)

    New user group description

Returns:

  • (String)

    New user group description



155
156
157
# File 'lib/gooddata/models/user_group.rb', line 155

def description=(name)
  content['description'] = name
end

#member?(a_member) ⇒ Boolean

Verifies if user is in a group or any nested group and returns true if it does

Returns:

  • (Boolean)

    Retruns true if member is member of the group or any of its members



186
187
188
189
190
# File 'lib/gooddata/models/user_group.rb', line 186

def member?(a_member)
  # could be better on API directly?
  uri = a_member.respond_to?(:uri) ? a_member.uri : a_member
  members.map(&:uri).include?(uri)
end

#membersArray<GoodData::Profile>

Gets Users with this Role

Returns:



162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
# File 'lib/gooddata/models/user_group.rb', line 162

def members
  url = GoodData::Helpers.get_path(data, %w(links members))
  return [] unless url
  Enumerator.new do |y|
    loop do
      res = client.get url
      res['userGroupMembers']['paging']['next']
      res['userGroupMembers']['items'].each do |member|
        case member.keys.first
        when 'user'
          y << client.create(GoodData::Profile, client.get(GoodData::Helpers.get_path(member, %w(user links self))), :project => project)
        when 'userGroup'
          y << client.create(UserGroup, client.get(GoodData::Helpers.get_path(member, %w(userGroup links self))), :project => project)
        end
      end
      url = res['userGroupMembers']['paging']['next']
      break unless url
    end
  end
end

#nameString

Gets user group name

Returns:

  • (String)

    User group name



131
132
133
# File 'lib/gooddata/models/user_group.rb', line 131

def name
  content['name']
end

#name=(name) ⇒ String

Sets user group name

Parameters:

  • name (String)

    New user group name

Returns:

  • (String)

    New user group name



139
140
141
142
# File 'lib/gooddata/models/user_group.rb', line 139

def name=(name)
  content['name'] = name
  name
end

#remove_members(user) ⇒ nil Also known as: remove_member

Remove member(s) from user group

Parameters:

  • Users (String | User | Array<User>)

    to remove from user group

Returns:

  • (nil)

    Nothing is returned



213
214
215
# File 'lib/gooddata/models/user_group.rb', line 213

def remove_members(user)
  UserGroup.modify_users(client, user, 'REMOVE', uri_modify_members)
end

#saveUserGroup

Save user group New group is created if needed else existing one is updated

Returns:

  • (UserGroup)

    Created or updated user group



196
197
198
199
200
201
202
203
204
205
206
207
# File 'lib/gooddata/models/user_group.rb', line 196

def save
  if uri
    # get rid of unsupported keys
    data = json['userGroup']
    client.put(uri, 'userGroup' => data.except('meta', 'links'))
    @json = client.get(uri)
  else
    response = client.post('/gdc/userGroups', @json)
    @json = client.get(response['uri'])
  end
  self
end

#set_members(user) ⇒ nil Also known as: set_member

Set member(s) to user group. Only users passed to this call will be new members of user group. Old members not passed to this method will be removed!

Parameters:

  • Users (String | User | Array<User>)

    to set as members of user group

Returns:

  • (nil)

    Nothing is returned



225
226
227
# File 'lib/gooddata/models/user_group.rb', line 225

def set_members(user) # rubocop:disable Style/AccessorMethodName
  UserGroup.modify_users(client, user, 'SET', uri_modify_members)
end

#uri_modify_membersString

URI used for membership manipulation/management

Returns:

  • (String)

    URI used for membership manipulation/management



234
235
236
# File 'lib/gooddata/models/user_group.rb', line 234

def uri_modify_members
  links['modifyMembers']
end

#user_group?Boolean

Is it a user group?

Returns:

  • (Boolean)

    Return true if it is a user group



241
242
243
# File 'lib/gooddata/models/user_group.rb', line 241

def user_group?
  true
end