diff options
| author | John Keiser <jkeiser@opscode.com> | 2014-07-16 17:08:35 -0700 |
|---|---|---|
| committer | John Keiser <jkeiser@opscode.com> | 2014-07-23 19:21:23 -0600 |
| commit | 16dfd6a8016eed76834b24b5c0cb1d0926ebf109 (patch) | |
| tree | b5fccbfaea40b894f560f6c36b3fdf00a8d8f80c | |
| parent | fa62b97a687a37df2fdcca317eeca91ebd7949cb (diff) | |
| download | chef-zero-16dfd6a8016eed76834b24b5c0cb1d0926ebf109.tar.gz | |
Add /users/NAME/association_requests/...
8 files changed, 90 insertions, 22 deletions
diff --git a/lib/chef_zero/data_normalizer.rb b/lib/chef_zero/data_normalizer.rb index 7c87d7a..a8a0381 100644 --- a/lib/chef_zero/data_normalizer.rb +++ b/lib/chef_zero/data_normalizer.rb @@ -39,14 +39,6 @@ module ChefZero container end - def self.normalize_association_request(request, id, username, orgname) - request['id'] ||= id || "#{username}-#{orgname}" - request['name'] ||= username || if id =~ /(.+)-#{orgname}$/ - $1 - end - request - end - def self.normalize_user(user, name) user['name'] ||= name user['admin'] ||= false diff --git a/lib/chef_zero/data_store/default_facade.rb b/lib/chef_zero/data_store/default_facade.rb index 4ef19ae..2454df6 100644 --- a/lib/chef_zero/data_store/default_facade.rb +++ b/lib/chef_zero/data_store/default_facade.rb @@ -298,7 +298,8 @@ module ChefZero 'roles' => {}, 'sandboxes' => {} }, - 'association_requests' => {} + 'association_requests' => {}, + 'members' => {} } if single_org diff --git a/lib/chef_zero/endpoints/organization_association_request_endpoint.rb b/lib/chef_zero/endpoints/organization_association_request_endpoint.rb index be92c84..08f64fb 100644 --- a/lib/chef_zero/endpoints/organization_association_request_endpoint.rb +++ b/lib/chef_zero/endpoints/organization_association_request_endpoint.rb @@ -1,16 +1,21 @@ require 'json' -require 'chef_zero/endpoints/rest_list_endpoint' +require 'chef_zero/rest_base' module ChefZero module Endpoints # /organizations/ORG/association_requests/ID class OrganizationAssociationRequestEndpoint < RestBase def delete(request) - data = JSON.parse(get_data(request), :create_additions => false) - delete_data(request) orgname = request.rest_path[1] id = request.rest_path[3] - json_response(200, DataNormalizer.normalize_association_request(data, id, nil, orgname)) + if id !~ /(.+)-#{orgname}$/ + raise HttpErrorResponse.new(404, "Invalid ID #{id}. Must be of the form username-#{orgname}") + end + username = $1 + path = request.rest_path[0..-2] + [username] + data = JSON.parse(get_data(request, path), :create_additions => false) + delete_data(request, path) + json_response(200, { "id" => id, "username" => username }) end end end diff --git a/lib/chef_zero/endpoints/organization_association_requests_endpoint.rb b/lib/chef_zero/endpoints/organization_association_requests_endpoint.rb index c4bb09d..a048796 100644 --- a/lib/chef_zero/endpoints/organization_association_requests_endpoint.rb +++ b/lib/chef_zero/endpoints/organization_association_requests_endpoint.rb @@ -1,5 +1,5 @@ require 'json' -require 'chef_zero/endpoints/rest_list_endpoint' +require 'chef_zero/rest_base' module ChefZero module Endpoints @@ -10,16 +10,19 @@ module ChefZero username = json['user'] orgname = request.rest_path[1] id = "#{username}-#{orgname}" - create_data(request, request.rest_path, id, '{}') + + if !exists_data?(request, [ 'organizations', orgname, 'members', username ]) + RestErrorResponse.new(409, "User #{username} is already in organization #{orgname}") + end + + create_data(request, request.rest_path, username, '{}') json_response(201, { "uri" => build_uri(request.base_uri, request.rest_path + [ id ]) }) end def get(request) requests = list_data(request) - result = list_data(request).map do |id| - json = JSON.parse(get_data(request, request.rest_path + [ id ]), :create_additions => false) - DataNormalizer.normalize_association_request(json, id, nil, request.rest_path[1]) - end + orgname = request.rest_path[1] + result = list_data(request).map { |username| { "id" => "#{username}-#{orgname}", 'username' => username } } json_response(200, result) end end diff --git a/lib/chef_zero/endpoints/user_association_request_endpoint.rb b/lib/chef_zero/endpoints/user_association_request_endpoint.rb new file mode 100644 index 0000000..2cce39c --- /dev/null +++ b/lib/chef_zero/endpoints/user_association_request_endpoint.rb @@ -0,0 +1,29 @@ +require 'json' +require 'chef_zero/rest_base' + +module ChefZero + module Endpoints + # /users/USER/association_requests/ID + class UserAssociationRequestEndpoint < RestBase + def put(request) + username = request.rest_path[1] + id = request.rest_path[3] + if id !~ /^#{username}-(.+)/ + raise RestErrorResponse.new(400, "Association request #{id} is invalid. Must be #{username}-orgname.") + end + orgname = $1 + + json = JSON.parse(request.body, :create_additions => false) + if json['response'] == 'accept' + create_data(request, [ 'organizations', orgname, 'members' ], username, '{}') + delete_data(request, [ 'organizations', orgname, 'association_requests', username ]) + elsif json['response'] == 'reject' + delete_data(request, [ 'organizations', orgname, 'association_requests', username ]) + else + raise RestErrorResponse.new(400, "response parameter was missing or set to the wrong value (must be accept or reject)") + end + already_json_response(200, request.body) + end + end + end +end diff --git a/lib/chef_zero/endpoints/user_association_requests_count_endpoint.rb b/lib/chef_zero/endpoints/user_association_requests_count_endpoint.rb new file mode 100644 index 0000000..0019bdc --- /dev/null +++ b/lib/chef_zero/endpoints/user_association_requests_count_endpoint.rb @@ -0,0 +1,17 @@ +require 'json' +require 'chef_zero/rest_base' + +module ChefZero + module Endpoints + # /users/NAME/association_requests/count + class UserAssociationRequestsCountEndpoint < RestBase + def get(request) + username = request.rest_path[1] + result = list_data(request, [ 'organizations' ]).select do |org| + exists_data?(request, [ 'organizations', org, 'association_requests', username ]) + end + json_response(200, { "value" => result.size }) + end + end + end +end diff --git a/lib/chef_zero/endpoints/user_association_requests_endpoint.rb b/lib/chef_zero/endpoints/user_association_requests_endpoint.rb new file mode 100644 index 0000000..24cb77e --- /dev/null +++ b/lib/chef_zero/endpoints/user_association_requests_endpoint.rb @@ -0,0 +1,18 @@ +require 'json' +require 'chef_zero/rest_base' + +module ChefZero + module Endpoints + # /users/USER/association_requests + class UserAssociationRequestsEndpoint < RestBase + def get(request) + username = request.rest_path[1] + result = list_data(request, [ 'organizations' ]).select do |org| + exists_data?(request, [ 'organizations', org, 'association_requests', username ]) + end + result = result.map { |org| { "id" => "#{username}-#{org}", "orgname" => org } } + json_response(200, result) + end + end + end +end diff --git a/lib/chef_zero/server.rb b/lib/chef_zero/server.rb index a9adbff..1ae50c2 100644 --- a/lib/chef_zero/server.rb +++ b/lib/chef_zero/server.rb @@ -69,6 +69,9 @@ require 'chef_zero/endpoints/sandboxes_endpoint' require 'chef_zero/endpoints/sandbox_endpoint' require 'chef_zero/endpoints/searches_endpoint' require 'chef_zero/endpoints/search_endpoint' +require 'chef_zero/endpoints/user_association_requests_endpoint' +require 'chef_zero/endpoints/user_association_requests_count_endpoint' +require 'chef_zero/endpoints/user_association_request_endpoint' require 'chef_zero/endpoints/file_store_file_endpoint' require 'chef_zero/endpoints/not_found_endpoint' @@ -426,9 +429,9 @@ module ChefZero # [ "/organizations/*/members", RestObjectEndpoint.new(self) ], [ "/organizations/*/association_requests", OrganizationAssociationRequestsEndpoint.new(self) ], [ "/organizations/*/association_requests/*", OrganizationAssociationRequestEndpoint.new(self) ], - # [ "/users/*/association_requests", UserAssocationRequestsEndpoint.new(self) ], - # [ "/users/*/association_requests/count", UserAssocationRequestsCountEndpoint.new(self) ], - # [ "/users/*/association_requests/*", UserAssociationRequestEndpoint.new(self) ], + [ "/users/*/association_requests", UserAssociationRequestsEndpoint.new(self) ], + [ "/users/*/association_requests/count", UserAssociationRequestsCountEndpoint.new(self) ], + [ "/users/*/association_requests/*", UserAssociationRequestEndpoint.new(self) ], [ "/organizations/*/containers", ContainersEndpoint.new(self) ], [ "/organizations/*/containers/*", ContainerEndpoint.new(self) ], |
