104 lines
2.8 KiB
Ruby
104 lines
2.8 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class Clover
|
|
hash_branch(:project_prefix, "private-location") do |r|
|
|
r.is do
|
|
r.get do
|
|
authorize("Location:view", @project.id)
|
|
|
|
@dataset = @project.locations_dataset
|
|
|
|
if api?
|
|
paginated_result(@dataset, Serializers::PrivateLocation)
|
|
else
|
|
@locations = @dataset.all
|
|
view "private-location/index"
|
|
end
|
|
end
|
|
|
|
r.post do
|
|
authorize("Location:create", @project.id)
|
|
handle_validation_failure("private-location/create")
|
|
name, provider_location_name, access_key, secret_key = typecast_params.nonempty_str!(["name", "provider_location_name", "access_key", "secret_key"])
|
|
|
|
Validation.validate_name(name)
|
|
Validation.validate_provider_location_name("aws", provider_location_name)
|
|
|
|
loc = nil
|
|
DB.transaction do
|
|
loc = Location.create(
|
|
display_name: name,
|
|
name: provider_location_name,
|
|
ui_name: name,
|
|
visible: true,
|
|
provider: "aws",
|
|
project_id: @project.id
|
|
)
|
|
LocationCredential.create_with_id(loc.id, access_key:, secret_key:)
|
|
audit_log(loc, "create")
|
|
end
|
|
|
|
if api?
|
|
Serializers::PrivateLocation.serialize(loc)
|
|
else
|
|
r.redirect "#{@project.path}#{loc.path}"
|
|
end
|
|
end
|
|
end
|
|
|
|
r.get(web?, "create") do
|
|
authorize("Location:create", @project.id)
|
|
view "private-location/create"
|
|
end
|
|
|
|
r.is String do |name|
|
|
@location = @project.locations.find { |loc| loc.ui_name == name }
|
|
check_found_object(@location)
|
|
|
|
r.get do
|
|
authorize("Location:view", @project.id)
|
|
|
|
if api?
|
|
Serializers::PrivateLocation.serialize(@location)
|
|
else
|
|
view "private-location/show"
|
|
end
|
|
end
|
|
|
|
r.delete do
|
|
authorize("Location:delete", @project.id)
|
|
|
|
if @location.has_resources?
|
|
fail DependencyError.new("Private location '#{@location.ui_name}' has some resources, first, delete them.")
|
|
end
|
|
|
|
DB.transaction do
|
|
@location.location_credential.destroy
|
|
@location.destroy
|
|
audit_log(@location, "destroy")
|
|
end
|
|
|
|
204
|
|
end
|
|
|
|
r.post do
|
|
authorize("Location:edit", @project.id)
|
|
name = typecast_params.nonempty_str("name")
|
|
Validation.validate_name(name)
|
|
|
|
DB.transaction do
|
|
@location.update(ui_name: name, display_name: name)
|
|
audit_log(@location, "update")
|
|
end
|
|
|
|
if api?
|
|
Serializers::PrivateLocation.serialize(@location)
|
|
else
|
|
flash["notice"] = "The location name is updated to '#{@location.ui_name}'."
|
|
r.redirect "#{@project.path}#{@location.path}"
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|