Skip to content

Commit

Permalink
reorg app revisions controllers
Browse files Browse the repository at this point in the history
* handle env vars
* seperate controllers for app/revisions and revisions/guid/x

[finishes #163440535]

Signed-off-by: Eric Promislow <eric.promislow@suse.com>
  • Loading branch information
cwlbraa authored and Eric Promislow committed Feb 6, 2019
1 parent 298dee8 commit 90bbdda
Show file tree
Hide file tree
Showing 12 changed files with 425 additions and 420 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
module VCAP::CloudController
class AppRevisionsUpdate
class RevisionsUpdate
class InvalidAppRevisions < StandardError
end

Expand Down
44 changes: 0 additions & 44 deletions app/controllers/v3/app_revisions_controller.rb
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
require 'messages/app_revisions_list_message'
require 'fetchers/app_fetcher'
require 'fetchers/app_revisions_fetcher'
require 'messages/app_revisions_update_message'
require 'actions/app_revisions_update'
require 'presenters/v3/revision_presenter'
require 'controllers/v3/mixins/app_sub_resource'
require 'presenters/v3/revision_environment_variables_presenter'
Expand All @@ -26,46 +24,4 @@ def index
message: message
)
end

def show
revision = fetch_revision(hashed_params[:revision_guid])
render status: :ok, json: Presenters::V3::RevisionPresenter.new(revision)
end

def update
message = AppRevisionsUpdateMessage.new(hashed_params[:body])
unprocessable!(message.errors.full_messages) unless message.valid?

revision = fetch_revision(hashed_params[:revision_guid], needs_write_permissions: true)

revision = AppRevisionsUpdate.new.update(revision, message)

render status: :ok, json: Presenters::V3::RevisionPresenter.new(revision)
end

def show_environment_variables
app, space, org = AppFetcher.new.fetch(hashed_params[:guid])
app_not_found! unless app && permission_queryer.can_read_from_space?(space.guid, org.guid)
unauthorized! unless permission_queryer.can_read_secrets_in_space?(space.guid, org.guid)

revision = RevisionModel.find(guid: hashed_params[:revision_guid])
resource_not_found!(:revision) unless revision && revision.app_guid == app.guid

render status: :ok, json: Presenters::V3::RevisionEnvironmentVariablesPresenter.new(revision)
end

private

def fetch_revision(guid, needs_write_permissions: false)
revision = RevisionModel.find(guid: guid)
resource_not_found!(:revision) unless revision

app = revision.app
space = app.space
org = space.organization
app_not_found! unless permission_queryer.can_read_from_space?(space.guid, org.guid)
unauthorized! if needs_write_permissions && !permission_queryer.can_write_to_space?(space.guid)

revision
end
end
43 changes: 43 additions & 0 deletions app/controllers/v3/revisions_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
require 'messages/revisions_update_message'
require 'actions/revisions_update'
require 'presenters/v3/revision_presenter'
require 'presenters/v3/revision_environment_variables_presenter'

class RevisionsController < ApplicationController
def show
revision = fetch_revision(hashed_params[:revision_guid])
render status: :ok, json: Presenters::V3::RevisionPresenter.new(revision)
end

def update
message = RevisionsUpdateMessage.new(hashed_params[:body])
unprocessable!(message.errors.full_messages) unless message.valid?

revision = fetch_revision(hashed_params[:revision_guid], needs_write_permissions: true)

revision = RevisionsUpdate.new.update(revision, message)

render status: :ok, json: Presenters::V3::RevisionPresenter.new(revision)
end

def show_environment_variables
revision = fetch_revision(hashed_params[:revision_guid], needs_secrets_read_permission: true)
render status: :ok, json: Presenters::V3::RevisionEnvironmentVariablesPresenter.new(revision)
end

private

def fetch_revision(guid, needs_write_permissions: false, needs_secrets_read_permission: false)
revision = RevisionModel.find(guid: guid)
resource_not_found!(:revision) unless revision

app = revision.app
space = app.space
org = space.organization
resource_not_found!(:revision) unless permission_queryer.can_read_from_space?(space.guid, org.guid)
unauthorized! if needs_write_permissions && !permission_queryer.can_write_to_space?(space.guid)
unauthorized! if needs_secrets_read_permission && !permission_queryer.can_read_secrets_in_space?(space.guid, org.guid)

revision
end
end
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
require 'messages/metadata_base_message'

module VCAP::CloudController
class AppRevisionsUpdateMessage < MetadataBaseMessage
class RevisionsUpdateMessage < MetadataBaseMessage
register_allowed_keys []

validates_with NoAdditionalKeysValidator
Expand Down
4 changes: 2 additions & 2 deletions app/presenters/v3/revision_environment_variables_presenter.rb
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,8 @@ def build_links
url_builder = VCAP::CloudController::Presenters::ApiUrlBuilder.new

{
self: { href: url_builder.build_url(path: "/v3/apps/#{revision.app.guid}/revisions/#{revision.guid}/environment_variables") },
revision: { href: url_builder.build_url(path: "/v3/apps/#{revision.app.guid}/revisions/#{revision.guid}") },
self: { href: url_builder.build_url(path: "/v3/revisions/#{revision.guid}/environment_variables") },
revision: { href: url_builder.build_url(path: "/v3/revisions/#{revision.guid}") },
app: { href: url_builder.build_url(path: "/v3/apps/#{revision.app.guid}") }
}
end
Expand Down
8 changes: 5 additions & 3 deletions config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,11 @@

# app revisions
get '/apps/:guid/revisions', to: 'app_revisions#index'
get '/apps/:guid/revisions/:revision_guid/environment_variables', to: 'app_revisions#show_environment_variables'
patch '/revisions/:revision_guid', to: 'app_revisions#update'
get '/revisions/:revision_guid', to: 'app_revisions#show'

# revisions
get '/revisions/:revision_guid/environment_variables', to: 'revisions#show_environment_variables'
patch '/revisions/:revision_guid', to: 'revisions#update'
get '/revisions/:revision_guid', to: 'revisions#show'

# environment variables
get '/apps/:guid/environment_variables', to: 'apps_v3#show_environment_variables'
Expand Down
6 changes: 3 additions & 3 deletions spec/request/revisions_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -292,7 +292,7 @@
}

it 'gets the environment variables for the revision' do
get "/v3/apps/#{app_model.reload.guid}/revisions/#{revision2.guid}/environment_variables", nil, user_header
get "/v3/revisions/#{revision2.guid}/environment_variables", nil, user_header
expect(last_response.status).to eq(200), last_response.body

parsed_response = MultiJson.load(last_response.body)
Expand All @@ -302,8 +302,8 @@
'key' => 'value'
},
'links' => {
'self' => { 'href' => "#{link_prefix}/v3/apps/#{app_model.guid}/revisions/#{revision2.guid}/environment_variables" },
'revision' => { 'href' => "#{link_prefix}/v3/apps/#{app_model.guid}/revisions/#{revision2.guid}" },
'self' => { 'href' => "#{link_prefix}/v3/revisions/#{revision2.guid}/environment_variables" },
'revision' => { 'href' => "#{link_prefix}/v3/revisions/#{revision2.guid}" },
'app' => { 'href' => "#{link_prefix}/v3/apps/#{app_model.guid}" },
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
require 'spec_helper'
require 'actions/app_revisions_update'
require 'actions/revisions_update'

module VCAP::CloudController
RSpec.describe AppRevisionsUpdate do
subject(:revision_update) { AppRevisionsUpdate.new }
RSpec.describe RevisionsUpdate do
subject(:revision_update) { RevisionsUpdate.new }

describe '#update' do
let(:body) do
Expand All @@ -19,7 +19,7 @@ module VCAP::CloudController
}
end
let(:revision) { RevisionModel.make }
let(:message) { AppRevisionsUpdateMessage.new(body) }
let(:message) { RevisionsUpdateMessage.new(body) }

it 'updates the revision metadata' do
expect(message).to be_valid
Expand Down
Loading

0 comments on commit 90bbdda

Please sign in to comment.