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

Commit 073d19f

Browse files
v3(services): add common filters to service credential bindings
[#175686797](https://www.pivotaltracker.com/story/show/175686797)
1 parent 6edaa28 commit 073d19f

6 files changed

Lines changed: 73 additions & 50 deletions

File tree

app/controllers/v3/service_credential_bindings_controller.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,7 @@ def binding_org
294294
end
295295

296296
def list_fetcher
297-
@list_fetcher ||= VCAP::CloudController::ServiceCredentialBindingListFetcher.new
297+
@list_fetcher ||= VCAP::CloudController::ServiceCredentialBindingListFetcher
298298
end
299299

300300
def fetcher

app/fetchers/service_credential_binding_fetcher.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ def fetch(guid, space_guids:)
1010
private
1111

1212
def list_fetcher
13-
ServiceCredentialBindingListFetcher.new
13+
ServiceCredentialBindingListFetcher
1414
end
1515
end
1616
end

app/fetchers/service_credential_binding_list_fetcher.rb

Lines changed: 51 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,59 +1,63 @@
1+
require 'fetchers/base_list_fetcher'
2+
13
module VCAP
24
module CloudController
3-
class ServiceCredentialBindingListFetcher
4-
def fetch(space_guids:, message: nil)
5-
dataset = case space_guids
6-
when :all
7-
ServiceCredentialBinding::View.dataset
8-
else
9-
ServiceCredentialBinding::View.where { Sequel[:space_guid] =~ space_guids }
10-
end
11-
12-
return dataset if message.nil?
13-
14-
apply_filters(dataset, message)
15-
end
5+
class ServiceCredentialBindingListFetcher < BaseListFetcher
6+
class << self
7+
FILTERABLE_PROPERTIES = %w{
8+
service_instance_name
9+
service_instance_guid
10+
name
11+
app_name
12+
app_guid
13+
type
14+
service_plan_name
15+
service_plan_guid
16+
service_offering_name
17+
service_offering_guid
18+
}.freeze
19+
20+
def fetch(space_guids:, message: nil)
21+
dataset = case space_guids
22+
when :all
23+
ServiceCredentialBinding::View.dataset
24+
else
25+
ServiceCredentialBinding::View.where { Sequel[:space_guid] =~ space_guids }
26+
end
1627

17-
private
28+
return dataset if message.nil?
1829

19-
def apply_filters(dataset, message)
20-
filters_from_message(message).each do |f|
21-
dataset = dataset.where { f }
30+
filter(dataset, message)
2231
end
2332

24-
dataset
25-
end
33+
private
2634

27-
FILTERABLE_PROPERTIES = %w{
28-
service_instance_name
29-
service_instance_guid
30-
name
31-
app_name
32-
app_guid
33-
type
34-
service_plan_name
35-
service_plan_guid
36-
service_offering_name
37-
service_offering_guid
38-
}.freeze
39-
40-
def filters_from_message(message)
41-
FILTERABLE_PROPERTIES.
42-
select { |property| message.requested?(message_param_for(property)) }.
43-
reduce([]) { |clauses, property| clauses << build_where_clause(message, property) }
44-
end
35+
def filter(dataset, message)
36+
filters_from_message(message).each do |f|
37+
dataset = dataset.where { f }
38+
end
4539

46-
def build_where_clause(message, field)
47-
message_param = message_param_for(field)
48-
Sequel[field.to_sym] =~ message.public_send(message_param)
49-
end
40+
super(message, dataset, ServiceCredentialBinding::View)
41+
end
42+
43+
def filters_from_message(message)
44+
FILTERABLE_PROPERTIES.
45+
select { |property| message.requested?(message_param_for(property)) }.
46+
reduce([]) { |clauses, property| clauses << build_where_clause(message, property) }
47+
end
48+
49+
def build_where_clause(message, field)
50+
message_param = message_param_for(field)
51+
Sequel[field.to_sym] =~ message.public_send(message_param)
52+
end
5053

51-
def message_param_for(field)
52-
case field
53-
when 'type'
54-
:type
55-
else
56-
field.pluralize.to_sym
54+
def message_param_for(field)
55+
case field
56+
when 'type'
57+
:type
58+
else
59+
field.pluralize.to_sym
60+
end
5761
end
5862
end
5963
end

docs/v3/source/includes/experimental_resources/service_credential_bindings/_list.md.erb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@ Name | Type | Description
4141
**service_offering_guids** | _list of strings_ | Comma-delimited list of service offering guids to filter by
4242
**service_offering_names** | _list of strings_ | Comma-delimited list of service offering names to filter by
4343
**type** | _list of strings_ | Type of credential binding to filter by. Valid values are: `app` or `key`
44+
**guids** | _list of strings_ | Comma-delimited list of service route binding guids to filter by
45+
**created_ats** (*experimental*)| _[timestamp](#timestamps)_ | Timestamp to filter by. When filtering on equality, several comma-delimited timestamps may be passed. Also supports filtering with [relational operators](#relational-operators-experimental)
46+
**updated_ats** (*experimental*)| _[timestamp](#timestamps)_ | Timestamp to filter by. When filtering on equality, several comma-delimited timestamps may be passed. Also supports filtering with [relational operators](#relational-operators-experimental)
4447
**include** | _list of strings_ | Optionally include a list of unique related resources in the response. Valid values are: `app`, `service_instance`
4548
**page** | _integer_ | Page to display; valid values are integers >= 1
4649
**per_page** | _integer_ | Number of results per page; <br>valid values are 1 through 5000

spec/request/service_credential_bindings_spec.rb

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,22 @@
113113
end
114114

115115
describe 'filters' do
116+
it_behaves_like 'list_endpoint_with_common_filters' do
117+
let(:resource_klass) { VCAP::CloudController::ServiceBinding }
118+
let(:api_call) do
119+
lambda { |headers, filters| get "/v3/service_credential_bindings?#{filters}", nil, headers }
120+
end
121+
let(:headers) { admin_headers }
122+
end
123+
124+
it_behaves_like 'list_endpoint_with_common_filters' do
125+
let(:resource_klass) { VCAP::CloudController::ServiceKey }
126+
let(:api_call) do
127+
lambda { |headers, filters| get "/v3/service_credential_bindings?#{filters}", nil, headers }
128+
end
129+
let(:headers) { admin_headers }
130+
end
131+
116132
let(:some_instance) { VCAP::CloudController::ManagedServiceInstance.make(space: space) }
117133
let!(:another_key) { VCAP::CloudController::ServiceKey.make(service_instance: some_instance) }
118134
let!(:another_binding) { VCAP::CloudController::ServiceBinding.make(service_instance: some_instance) }

spec/unit/fetchers/service_credential_binding_list_fetcher_spec.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ module CloudController
77
RSpec.describe ServiceCredentialBindingListFetcher do
88
let(:params) { {} }
99
let(:message) { ServiceCredentialBindingListMessage.from_params(params) }
10-
let(:fetcher) { ServiceCredentialBindingListFetcher.new }
10+
let(:fetcher) { described_class }
1111

1212
describe 'no bindings' do
1313
it 'returns an empty result' do

0 commit comments

Comments
 (0)