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



109
110
111
112
# File 'lib/gooddata/models/user_group.rb', line 109

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:



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

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



78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/gooddata/models/user_group.rb', line 78

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):

  • name (String)
  • description (String)
  • project (GoodData::Project)

Returns:



63
64
65
66
67
68
69
70
71
72
73
# File 'lib/gooddata/models/user_group.rb', line 63

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

  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



100
101
102
103
# File 'lib/gooddata/models/user_group.rb', line 100

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



244
245
246
# File 'lib/gooddata/models/user_group.rb', line 244

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



118
119
120
# File 'lib/gooddata/models/user_group.rb', line 118

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

#descriptionString

Gets user group description

Returns:

  • (String)

    User group description



143
144
145
# File 'lib/gooddata/models/user_group.rb', line 143

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



151
152
153
# File 'lib/gooddata/models/user_group.rb', line 151

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



182
183
184
185
186
# File 'lib/gooddata/models/user_group.rb', line 182

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:



158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
# File 'lib/gooddata/models/user_group.rb', line 158

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



127
128
129
# File 'lib/gooddata/models/user_group.rb', line 127

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



135
136
137
138
# File 'lib/gooddata/models/user_group.rb', line 135

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



209
210
211
# File 'lib/gooddata/models/user_group.rb', line 209

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



192
193
194
195
196
197
198
199
200
201
202
203
# File 'lib/gooddata/models/user_group.rb', line 192

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



221
222
223
# File 'lib/gooddata/models/user_group.rb', line 221

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



230
231
232
# File 'lib/gooddata/models/user_group.rb', line 230

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



237
238
239
# File 'lib/gooddata/models/user_group.rb', line 237

def user_group?
  true
end