Skip to content

Commit bb0e993

Browse files
committed
Provide index, show, and destroy endpoints for usage consumers
Allows for usage consumers to de-register themselves with the cloud controller. Index and show methods allow consumers to make informed decisions before initiating a purge of usage events. Usage event endpoint re-ordered to align with convention of other resources.
1 parent 9456a25 commit bb0e993

13 files changed

+544
-2
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
module VCAP::CloudController
2+
class AppUsageConsumerDelete
3+
def delete(app_usage_consumer)
4+
app_usage_consumer.destroy
5+
rescue Sequel::Error => e
6+
raise CloudController::Errors::ApiError.new_from_details('AppUsageConsumerDeleteError', e.message)
7+
end
8+
end
9+
end
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
module VCAP::CloudController
2+
class ServiceUsageConsumerDelete
3+
def delete(service_usage_consumer)
4+
service_usage_consumer.destroy
5+
rescue Sequel::Error => e
6+
raise CloudController::Errors::ApiError.new_from_details('ServiceUsageConsumerDeleteError', e.message)
7+
end
8+
end
9+
end
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
require 'presenters/v3/app_usage_consumer_presenter'
2+
require 'messages/app_usage_consumers_list_message'
3+
require 'fetchers/app_usage_consumer_list_fetcher'
4+
require 'actions/app_usage_consumer_delete'
5+
6+
class AppUsageConsumersController < ApplicationController
7+
def index
8+
message = AppUsageConsumersListMessage.from_params(query_params)
9+
invalid_param!(message.errors.full_messages) unless message.valid?
10+
11+
app_usage_consumers = AppUsageConsumer.where(guid: [])
12+
13+
app_usage_consumers = AppUsageConsumerListFetcher.fetch_all(message, AppUsageConsumer.dataset) if permission_queryer.can_read_globally?
14+
15+
render status: :ok, json: Presenters::V3::PaginatedListPresenter.new(
16+
presenter: Presenters::V3::AppUsageConsumerPresenter,
17+
paginated_result: SequelPaginator.new.get_page(app_usage_consumers, message.try(:pagination_options)),
18+
path: '/v3/app_usage_consumers',
19+
message: message,
20+
extra_presenter_args: {}
21+
)
22+
end
23+
24+
def show
25+
app_usage_consumer = AppUsageConsumer.where(consumer_guid: params[:guid]).first
26+
resource_not_found!(:app_usage_consumer) unless app_usage_consumer && permission_queryer.can_read_globally?
27+
28+
render status: :ok, json: Presenters::V3::AppUsageConsumerPresenter.new(app_usage_consumer)
29+
end
30+
31+
def destroy
32+
unauthorized! unless permission_queryer.can_write_globally?
33+
34+
app_usage_consumer = AppUsageConsumer.where(consumer_guid: params[:guid]).first
35+
resource_not_found!(:app_usage_consumer) unless app_usage_consumer
36+
37+
AppUsageConsumerDelete.new.delete(app_usage_consumer)
38+
39+
head :no_content
40+
end
41+
end
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
require 'presenters/v3/service_usage_consumer_presenter'
2+
require 'messages/service_usage_consumers_list_message'
3+
require 'fetchers/service_usage_consumer_list_fetcher'
4+
require 'actions/service_usage_consumer_delete'
5+
6+
class ServiceUsageConsumersController < ApplicationController
7+
def index
8+
message = ServiceUsageConsumersListMessage.from_params(query_params)
9+
invalid_param!(message.errors.full_messages) unless message.valid?
10+
11+
service_usage_consumers = ServiceUsageConsumer.where(guid: [])
12+
13+
service_usage_consumers = ServiceUsageConsumerListFetcher.fetch_all(message, ServiceUsageConsumer.dataset) if permission_queryer.can_read_globally?
14+
15+
render status: :ok, json: Presenters::V3::PaginatedListPresenter.new(
16+
presenter: Presenters::V3::ServiceUsageConsumerPresenter,
17+
paginated_result: SequelPaginator.new.get_page(service_usage_consumers, message.try(:pagination_options)),
18+
path: '/v3/service_usage_consumers',
19+
message: message,
20+
extra_presenter_args: {}
21+
)
22+
end
23+
24+
def show
25+
service_usage_consumer = ServiceUsageConsumer.where(consumer_guid: params[:guid]).first
26+
resource_not_found!(:service_usage_consumer) unless service_usage_consumer && permission_queryer.can_read_globally?
27+
28+
render status: :ok, json: Presenters::V3::ServiceUsageConsumerPresenter.new(service_usage_consumer)
29+
end
30+
31+
def destroy
32+
unauthorized! unless permission_queryer.can_write_globally?
33+
34+
service_usage_consumer = ServiceUsageConsumer.where(consumer_guid: params[:guid]).first
35+
resource_not_found!(:service_usage_consumer) unless service_usage_consumer
36+
37+
ServiceUsageConsumerDelete.new.delete(service_usage_consumer)
38+
39+
head :no_content
40+
end
41+
end
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
require 'fetchers/base_list_fetcher'
2+
3+
module VCAP::CloudController
4+
class AppUsageConsumerListFetcher < BaseListFetcher
5+
class << self
6+
def fetch_all(message, dataset)
7+
dataset = filter(message, dataset, AppUsageConsumer)
8+
9+
dataset = dataset.where(consumer_guid: message.consumer_guids) if message.requested?(:consumer_guids)
10+
11+
dataset = dataset.where(last_processed_guid: message.last_processed_guids) if message.requested?(:last_processed_guids)
12+
13+
dataset
14+
end
15+
end
16+
end
17+
end
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
require 'fetchers/base_list_fetcher'
2+
3+
module VCAP::CloudController
4+
class ServiceUsageConsumerListFetcher < BaseListFetcher
5+
class << self
6+
def fetch_all(message, dataset)
7+
dataset = filter(message, dataset, ServiceUsageConsumer)
8+
9+
dataset = dataset.where(consumer_guid: message.consumer_guids) if message.requested?(:consumer_guids)
10+
11+
dataset = dataset.where(last_processed_guid: message.last_processed_guids) if message.requested?(:last_processed_guids)
12+
13+
dataset
14+
end
15+
end
16+
end
17+
end
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
require 'messages/list_message'
2+
3+
module VCAP::CloudController
4+
class AppUsageConsumersListMessage < ListMessage
5+
register_allowed_keys %i[consumer_guids last_processed_guids]
6+
7+
validates :consumer_guids, array: true, allow_nil: true
8+
validates :last_processed_guids, array: true, allow_nil: true
9+
10+
def self.from_params(params)
11+
super(params, %w[consumer_guids last_processed_guids])
12+
end
13+
end
14+
end
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
require 'messages/list_message'
2+
3+
module VCAP::CloudController
4+
class ServiceUsageConsumersListMessage < ListMessage
5+
register_allowed_keys %i[consumer_guids last_processed_guids]
6+
7+
validates :consumer_guids, array: true, allow_nil: true
8+
validates :last_processed_guids, array: true, allow_nil: true
9+
10+
def self.from_params(params)
11+
super(params, %w[consumer_guids last_processed_guids])
12+
end
13+
end
14+
end
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
require 'presenters/v3/base_presenter'
2+
3+
module VCAP::CloudController::Presenters::V3
4+
class AppUsageConsumerPresenter < BasePresenter
5+
def to_hash
6+
{
7+
guid: app_usage_consumer.consumer_guid,
8+
last_processed_guid: app_usage_consumer.last_processed_guid,
9+
created_at: app_usage_consumer.created_at,
10+
updated_at: app_usage_consumer.updated_at,
11+
links: build_links
12+
}
13+
end
14+
15+
private
16+
17+
def app_usage_consumer
18+
@resource
19+
end
20+
21+
def build_links
22+
{
23+
self: {
24+
href: url_builder.build_url(path: "/v3/app_usage_consumers/#{app_usage_consumer.consumer_guid}")
25+
}
26+
}
27+
end
28+
end
29+
end
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
require 'presenters/v3/base_presenter'
2+
3+
module VCAP::CloudController::Presenters::V3
4+
class ServiceUsageConsumerPresenter < BasePresenter
5+
def to_hash
6+
{
7+
guid: service_usage_consumer.consumer_guid,
8+
last_processed_guid: service_usage_consumer.last_processed_guid,
9+
created_at: service_usage_consumer.created_at,
10+
updated_at: service_usage_consumer.updated_at,
11+
links: build_links
12+
}
13+
end
14+
15+
private
16+
17+
def service_usage_consumer
18+
@resource
19+
end
20+
21+
def build_links
22+
{
23+
self: {
24+
href: url_builder.build_url(path: "/v3/service_usage_consumers/#{service_usage_consumer.consumer_guid}")
25+
}
26+
}
27+
end
28+
end
29+
end

0 commit comments

Comments
 (0)