|
7 | 7 | require 'messages/service_credential_binding_list_message' |
8 | 8 | require 'messages/service_credential_binding_show_message' |
9 | 9 | require 'messages/service_credential_binding_create_message' |
| 10 | +require 'messages/service_credential_app_binding_create_message' |
| 11 | +require 'messages/service_credential_key_binding_create_message' |
10 | 12 | require 'decorators/include_binding_app_decorator' |
11 | 13 | require 'decorators/include_binding_service_instance_decorator' |
12 | 14 | require 'jobs/v3/create_service_credential_binding_job_actor' |
@@ -40,26 +42,30 @@ def show |
40 | 42 | end |
41 | 43 |
|
42 | 44 | def create |
43 | | - message = ServiceCredentialBindingCreateMessage.new(hashed_params[:body]) |
44 | | - unprocessable!(message.errors.full_messages) unless message.valid? |
45 | | - |
46 | | - service_instance = VCAP::CloudController::ServiceInstance.first(guid: message.service_instance_guid) |
47 | | - resource_not_accessible!('service instance', message.service_instance_guid) unless can_read_service_instance?(service_instance) |
48 | | - |
49 | | - app = VCAP::CloudController::AppModel.first(guid: message.app_guid) |
50 | | - resource_not_accessible!('app', message.app_guid) unless can_access_resource?(app) |
51 | | - unauthorized! unless can_write_to_space?(app.space) |
52 | | - |
53 | | - action = V3::ServiceCredentialBindingCreate.new(user_audit_info, message.audit_hash) |
54 | | - binding = action.precursor(service_instance, app: app, name: message.name, volume_mount_services_enabled: volume_services_enabled?) |
55 | | - |
56 | | - case service_instance |
57 | | - when ManagedServiceInstance |
58 | | - pollable_job_guid = enqueue_bind_job(binding.guid, message) |
59 | | - head :accepted, 'Location' => url_builder.build_url(path: "/v3/jobs/#{pollable_job_guid}") |
60 | | - when UserProvidedServiceInstance |
61 | | - action.bind(binding) |
62 | | - render status: :created, json: Presenters::V3::ServiceCredentialBindingPresenter.new(binding).to_hash |
| 45 | + message = build_create_message(hashed_params[:body]) |
| 46 | + |
| 47 | + if message.type == 'app' |
| 48 | + service_instance = VCAP::CloudController::ServiceInstance.first(guid: message.service_instance_guid) |
| 49 | + resource_not_accessible!('service instance', message.service_instance_guid) unless can_read_service_instance?(service_instance) |
| 50 | + |
| 51 | + app = VCAP::CloudController::AppModel.first(guid: message.app_guid) |
| 52 | + resource_not_accessible!('app', message.app_guid) unless can_access_resource?(app) |
| 53 | + unauthorized! unless can_write_to_space?(app.space) |
| 54 | + |
| 55 | + action = V3::ServiceCredentialBindingCreate.new(user_audit_info, message.audit_hash) |
| 56 | + binding = action.precursor(service_instance, app: app, name: message.name, volume_mount_services_enabled: volume_services_enabled?) |
| 57 | + |
| 58 | + case service_instance |
| 59 | + when ManagedServiceInstance |
| 60 | + pollable_job_guid = enqueue_bind_job(binding.guid, message) |
| 61 | + head :accepted, 'Location' => url_builder.build_url(path: "/v3/jobs/#{pollable_job_guid}") |
| 62 | + when UserProvidedServiceInstance |
| 63 | + action.bind(binding) |
| 64 | + render status: :created, json: Presenters::V3::ServiceCredentialBindingPresenter.new(binding).to_hash |
| 65 | + end |
| 66 | + else |
| 67 | + head :not_implemented |
| 68 | + return |
63 | 69 | end |
64 | 70 | rescue V3::ServiceCredentialBindingCreate::UnprocessableCreate => e |
65 | 71 | unprocessable!(e.message) |
@@ -122,6 +128,20 @@ def parameters |
122 | 128 |
|
123 | 129 | private |
124 | 130 |
|
| 131 | + def build_create_message(params) |
| 132 | + generic_message = ServiceCredentialBindingCreateMessage.new(params) |
| 133 | + unprocessable!(generic_message.errors.full_messages) unless generic_message.valid? |
| 134 | + |
| 135 | + specific_message = if generic_message.type == 'app' |
| 136 | + ServiceCredentialAppBindingCreateMessage.new(params) |
| 137 | + else |
| 138 | + ServiceCredentialKeyBindingCreateMessage.new(params) |
| 139 | + end |
| 140 | + |
| 141 | + unprocessable!(specific_message.errors.full_messages) unless specific_message.valid? |
| 142 | + specific_message |
| 143 | + end |
| 144 | + |
125 | 145 | def enqueue_bind_job(binding_guid, message) |
126 | 146 | bind_job = VCAP::CloudController::V3::CreateBindingAsyncJob.new( |
127 | 147 | :credential, |
|
0 commit comments