summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Keiser <jkeiser@opscode.com>2014-07-16 17:08:35 -0700
committerJohn Keiser <jkeiser@opscode.com>2014-07-23 19:21:23 -0600
commit16dfd6a8016eed76834b24b5c0cb1d0926ebf109 (patch)
treeb5fccbfaea40b894f560f6c36b3fdf00a8d8f80c
parentfa62b97a687a37df2fdcca317eeca91ebd7949cb (diff)
downloadchef-zero-16dfd6a8016eed76834b24b5c0cb1d0926ebf109.tar.gz
Add /users/NAME/association_requests/...
-rw-r--r--lib/chef_zero/data_normalizer.rb8
-rw-r--r--lib/chef_zero/data_store/default_facade.rb3
-rw-r--r--lib/chef_zero/endpoints/organization_association_request_endpoint.rb13
-rw-r--r--lib/chef_zero/endpoints/organization_association_requests_endpoint.rb15
-rw-r--r--lib/chef_zero/endpoints/user_association_request_endpoint.rb29
-rw-r--r--lib/chef_zero/endpoints/user_association_requests_count_endpoint.rb17
-rw-r--r--lib/chef_zero/endpoints/user_association_requests_endpoint.rb18
-rw-r--r--lib/chef_zero/server.rb9
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) ],