diff --git a/app/assets/javascripts/api.js b/app/assets/javascripts/api.js index 7ebe1599fca22a548f61946098380acb700b73fd..1cab66e109e57d7b44b15a797c4f77b23994920c 100644 --- a/app/assets/javascripts/api.js +++ b/app/assets/javascripts/api.js @@ -22,16 +22,14 @@ }); }, // Return groups list. Filtered by query - // Only active groups retrieved - groups: function(query, skip_ldap, skip_groups, callback) { + groups: function(query, options, callback) { var url = Api.buildUrl(Api.groupsPath); return $.ajax({ url: url, - data: { - search: query, - skip_groups: skip_groups, - per_page: 20 - }, + data: $.extend({ + search: query, + per_page: 20 + }, options), dataType: "json" }).done(function(groups) { return callback(groups); diff --git a/app/assets/javascripts/groups_select.js b/app/assets/javascripts/groups_select.js index b275620c7996c23bf154136d91ae24b7116192f3..e3c39c895bad004f2a3408470848b9ee99cc20ed 100644 --- a/app/assets/javascripts/groups_select.js +++ b/app/assets/javascripts/groups_select.js @@ -6,15 +6,16 @@ function GroupsSelect() { $('.ajax-groups-select').each((function(_this) { return function(i, select) { - var skip_ldap, skip_groups; - skip_ldap = $(select).hasClass('skip_ldap'); + var all_available, skip_groups; + all_available = $(select).data('all-available'); skip_groups = $(select).data('skip-groups') || []; return $(select).select2({ placeholder: "Search for a group", multiple: $(select).hasClass('multiselect'), minimumInputLength: 0, query: function(query) { - return Api.groups(query.term, skip_ldap, skip_groups, function(groups) { + options = { all_available: all_available, skip_groups: skip_groups }; + return Api.groups(query.term, options, function(groups) { var data; data = { results: groups diff --git a/app/assets/javascripts/project_select.js b/app/assets/javascripts/project_select.js index b74b4ae68ff9a1e696259a5bbdb0b4e7f9f44445..e1acf3c823256347c81b05a2d5d33f13de57318b 100644 --- a/app/assets/javascripts/project_select.js +++ b/app/assets/javascripts/project_select.js @@ -24,7 +24,7 @@ data = groups.concat(projects); return finalCallback(data); }; - return Api.groups(term, false, false, groupsCallback); + return Api.groups(term, {}, groupsCallback); }; } else { projectsCallback = finalCallback; @@ -73,7 +73,7 @@ data = groups.concat(projects); return finalCallback(data); }; - return Api.groups(query.term, false, false, groupsCallback); + return Api.groups(query.term, {}, groupsCallback); }; } else { projectsCallback = finalCallback; diff --git a/app/assets/javascripts/search.js b/app/assets/javascripts/search.js index 6c2389f202ff4ff240fb1cbbc56d526e925753b8..d79e6f014f6b9acc1f18cad78780b56897af3d7b 100644 --- a/app/assets/javascripts/search.js +++ b/app/assets/javascripts/search.js @@ -11,7 +11,7 @@ filterable: true, fieldName: 'group_id', data: function(term, callback) { - return Api.groups(term, false, false, function(data) { + return Api.groups(term, {}, function(data) { data.unshift({ name: 'Any' }); diff --git a/doc/api/groups.md b/doc/api/groups.md index e81d6f9de4b0aca6b7ff8a2cf89040c9be4b5e95..b56d74d25e078a149da6836f2f7e15ecb1a44bb6 100644 --- a/doc/api/groups.md +++ b/doc/api/groups.md @@ -2,7 +2,12 @@ ## List groups -Get a list of groups. (As user: my groups, as admin: all groups) +Get a list of groups. (As user: my groups or all available, as admin: all groups). + +Parameters: + +- `all_available` (optional) - if passed, show all groups you have access to +- `skip_groups` (optional)(array of group IDs) - if passed, skip groups ``` GET /groups @@ -21,7 +26,6 @@ GET /groups You can search for groups by name or path, see below. - ## List a group's projects Get a list of projects in this group. diff --git a/lib/api/groups.rb b/lib/api/groups.rb index bfb8947502538da798550ab5d74ebc43fef35f41..a13e353b7f5e41cceade79946bb195c255c8c358 100644 --- a/lib/api/groups.rb +++ b/lib/api/groups.rb @@ -8,11 +8,14 @@ module API # # Parameters: # skip_groups (optional) - Array of group ids to exclude from list + # all_available (optional, boolean) - Show all group that you have access to # Example Request: # GET /groups get do @groups = if current_user.admin Group.all + elsif params[:all_available] + GroupsFinder.new.execute(current_user) else current_user.groups end diff --git a/spec/requests/api/groups_spec.rb b/spec/requests/api/groups_spec.rb index 3ba257256a06e7502b533b51a71c3f54a5b68c32..7b47bf5afc1d9b6d9a538cb583c47a892a245a10 100644 --- a/spec/requests/api/groups_spec.rb +++ b/spec/requests/api/groups_spec.rb @@ -37,7 +37,7 @@ describe API::API, api: true do end end - context "when authenticated as admin" do + context "when authenticated as admin" do it "admin: returns an array of all groups" do get api("/groups", admin) expect(response).to have_http_status(200) @@ -55,6 +55,17 @@ describe API::API, api: true do expect(json_response.length).to eq(1) end end + + context "when using all_available in request" do + it "returns all groups you have access to" do + public_group = create :group, :public + get api("/groups", user1), all_available: true + + expect(response).to have_http_status(200) + expect(json_response).to be_an Array + expect(json_response.first['name']).to eq(public_group.name) + end + end end describe "GET /groups/:id" do