Skip to content
This repository was archived by the owner on Jun 2, 2021. It is now read-only.

Commit e7ee7a1

Browse files
Get name of service broker in service offering request
[#172379562](https://www.pivotaltracker.com/story/show/172379562)
1 parent 035915d commit e7ee7a1

13 files changed

Lines changed: 140 additions & 55 deletions

app/controllers/v3/service_offerings_controller.rb

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
require 'fetchers/service_plan_visibility_fetcher'
44
require 'presenters/v3/service_offering_presenter'
55
require 'messages/service_offerings_list_message'
6+
require 'messages/service_offerings_show_message'
67
require 'messages/metadata_update_message'
78
require 'messages/purge_message'
89
require 'actions/service_offering_delete'
@@ -52,7 +53,13 @@ def show
5253
service_offering_not_found! if service_offering.nil?
5354
service_offering_not_found! unless visible_to_current_user?(service: service_offering)
5455

55-
presenter = Presenters::V3::ServiceOfferingPresenter.new(service_offering)
56+
message = ServiceOfferingsShowMessage.from_params(query_params)
57+
invalid_param!(message.errors.full_messages) unless message.valid?
58+
59+
decorators = []
60+
decorators << FieldServiceOfferingServiceBrokerDecorator.new(message.fields) if FieldServiceOfferingServiceBrokerDecorator.match?(message.fields)
61+
62+
presenter = Presenters::V3::ServiceOfferingPresenter.new(service_offering, decorators: decorators)
5663
render status: :ok, json: presenter.to_json
5764
end
5865

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
module VCAP::CloudController
2+
class ServiceOfferingsShowMessage < BaseMessage
3+
register_allowed_keys [:fields]
4+
5+
validates_with NoAdditionalParamsValidator
6+
validates :fields, allow_nil: true, fields: {
7+
allowed: {
8+
'service_broker' => ['guid', 'name']
9+
}
10+
}
11+
12+
def self.from_params(params)
13+
super(params, [], fields: %w(fields))
14+
end
15+
end
16+
end

app/presenters/v3/service_offering_presenter.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class ServiceOfferingPresenter < BasePresenter
1212
def to_hash
1313
metadata = broker_metadata
1414

15-
{
15+
hash = {
1616
guid: service_offering.guid,
1717
name: service_offering.label,
1818
description: service_offering.description,
@@ -41,6 +41,10 @@ def to_hash
4141
},
4242
links: build_links,
4343
}
44+
45+
@decorators.reduce(hash) { |memo, d| d.decorate(memo, [service_offering]) }
46+
47+
hash
4448
end
4549

4650
private

docs/v3/source/includes/experimental_resources/service_offerings/_get.md.erb

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,19 @@ This endpoint retrieves the service offering by GUID.
2626
#### Definition
2727
`GET /v3/service_offerings/:guid`
2828

29+
#### Query parameters
30+
31+
Name | Type | Description
32+
---- | ---- | ------------
33+
**fields** | [_fields parameter_](#fields-parameter) | [_Allowed values_](#service-offering-fields)
34+
35+
##### Service Offering Fields
36+
37+
Resource | Allowed Keys
38+
------------------- | ----
39+
service_broker| `guid`, `name`
40+
41+
2942
#### Permitted roles
3043
|
3144
--- | ---

spec/field_message_spec_shared_examples.rb

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,3 +40,19 @@
4040
))
4141
end
4242
end
43+
44+
RSpec.shared_examples 'fields query hash' do
45+
it 'validates `fields` is a hash' do
46+
message = described_class.from_params({ 'fields' => 'foo' }.with_indifferent_access)
47+
expect(message).not_to be_valid
48+
expect(message.errors[:fields][0]).to include('must be an object')
49+
end
50+
51+
it 'does not accept fields resources that are not allowed' do
52+
message = described_class.from_params({ 'fields' => { 'space.foo': 'name' } })
53+
expect(message).not_to be_valid
54+
expect(message.errors[:fields]).to include(include(
55+
'[space.foo] valid resources are:'
56+
))
57+
end
58+
end

spec/request/service_offerings_spec.rb

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,19 @@
183183
})
184184
end
185185
end
186+
187+
describe 'fields' do
188+
let!(:service_offering) { VCAP::CloudController::Service.make }
189+
190+
it 'can include service broker name and guid' do
191+
get "/v3/service_offerings/#{service_offering.guid}?fields[service_broker]=name,guid", nil, admin_headers
192+
expect(last_response).to have_status_code(200)
193+
194+
expect(parsed_response['included']['service_brokers']).to have(1).elements
195+
expect(parsed_response['included']['service_brokers'][0]['guid']).to eq(service_offering.service_broker.guid)
196+
expect(parsed_response['included']['service_brokers'][0]['name']).to eq(service_offering.service_broker.name)
197+
end
198+
end
186199
end
187200

188201
describe 'GET /v3/service_offerings' do

spec/unit/messages/service_instance_show_message_spec.rb

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,6 @@ module VCAP::CloudController
1414

1515
it_behaves_like 'field query parameter', 'service_plan.service_offering.service_broker', 'name,guid'
1616

17-
it 'does not accept fields resources that are not allowed' do
18-
message = described_class.from_params({ 'fields' => { 'space.foo': 'name' } })
19-
expect(message).not_to be_valid
20-
expect(message.errors[:fields]).to include(
21-
'[space.foo] valid resources are: ' \
22-
"'space', 'space.organization', 'service_plan', 'service_plan.service_offering', 'service_plan.service_offering.service_broker'"
23-
)
24-
end
25-
26-
it 'does not accept other parameters' do
27-
message = described_class.from_params({ 'foobar' => 'pants' })
28-
expect(message).not_to be_valid
29-
expect(message.errors[:base][0]).to include("Unknown query parameter(s): 'foobar'")
30-
end
17+
it_behaves_like 'fields query hash'
3118
end
3219
end

spec/unit/messages/service_instances_list_message_spec.rb

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -77,11 +77,7 @@ module VCAP::CloudController
7777
end
7878

7979
context 'fields' do
80-
it 'validates `fields` is a hash' do
81-
message = described_class.from_params({ 'fields' => 'foo' }.with_indifferent_access)
82-
expect(message).not_to be_valid
83-
expect(message.errors[:fields][0]).to include('must be an object')
84-
end
80+
it_behaves_like 'fields query hash'
8581

8682
it_behaves_like 'field query parameter', 'space', 'guid,name,relationships.organization'
8783

@@ -92,14 +88,6 @@ module VCAP::CloudController
9288
it_behaves_like 'field query parameter', 'service_plan.service_offering', 'name,guid,relationships.service_broker'
9389

9490
it_behaves_like 'field query parameter', 'service_plan.service_offering.service_broker', 'name,guid'
95-
96-
it 'does not accept fields resources that are not allowed' do
97-
message = described_class.from_params({ 'fields' => { 'space.foo': 'name' } })
98-
expect(message).not_to be_valid
99-
expect(message.errors[:fields]).to include(
100-
"[space.foo] valid resources are: 'space', 'space.organization', " \
101-
"'service_plan', 'service_plan.service_offering', 'service_plan.service_offering.service_broker'")
102-
end
10391
end
10492

10593
context 'type' do
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
require 'spec_helper'
2+
require 'messages/service_offerings_show_message'
3+
require 'field_message_spec_shared_examples'
4+
5+
module VCAP::CloudController
6+
RSpec.describe ServiceOfferingsShowMessage do
7+
describe '.from_params' do
8+
let(:params) do
9+
{
10+
'fields' => { 'service_broker' => 'guid,name' },
11+
}.with_indifferent_access
12+
end
13+
14+
it 'returns the correct message' do
15+
message = described_class.from_params(params)
16+
17+
expect(message).to be_valid
18+
expect(message).to be_a(described_class)
19+
expect(message.fields).to match({ 'service_broker': ['guid', 'name'] })
20+
end
21+
22+
it 'converts requested keys to symbols' do
23+
message = described_class.from_params(params)
24+
expect(message.requested?(:fields)).to be_truthy
25+
end
26+
27+
it 'accepts an empty set' do
28+
message = described_class.from_params({})
29+
expect(message).to be_valid
30+
end
31+
32+
it 'does not accept arbitrary parameters' do
33+
message = described_class.from_params({ foobar: 'pants' }.with_indifferent_access)
34+
35+
expect(message).not_to be_valid
36+
expect(message.errors[:base][0]).to include("Unknown query parameter(s): 'foobar'")
37+
end
38+
39+
context 'fields' do
40+
it_behaves_like 'fields query hash'
41+
42+
it_behaves_like 'field query parameter', 'service_broker', 'guid,name'
43+
end
44+
end
45+
end
46+
end

spec/unit/messages/service_offerings_list_message_spec.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ module VCAP::CloudController
7474
end
7575

7676
context 'fields' do
77+
it_behaves_like 'fields query hash'
78+
7779
it_behaves_like 'field query parameter', 'service_broker', 'guid,name'
7880
end
7981
end

0 commit comments

Comments
 (0)