cartodb/app/controllers/carto/admin/mobile_apps_controller.rb
2020-06-15 10:58:47 +08:00

153 lines
5.7 KiB
Ruby

require_dependency 'helpers/avatar_helper'
require_dependency 'cartodb/central'
require_dependency 'helpers/organization_notifications_helper'
class Carto::Admin::MobileAppsController < Admin::AdminController
include Carto::ControllerHelper
include MobileAppsHelper
include AvatarHelper
include OrganizationNotificationsHelper
ssl_required :index, :show, :new, :create, :update, :destroy
before_filter :invalidate_browser_cache
before_filter :login_required
before_filter :check_user_permissions
before_filter :initialize_cartodb_central_client
before_filter :load_organization_notifications
before_filter :validate_id, only: [:show, :update, :destroy]
before_filter :load_mobile_app, only: [:show, :update]
before_filter :setup_avatar_upload, only: [:new, :create, :show, :update]
rescue_from Carto::LoadError, with: :render_404
layout 'application'
def index
response = @cartodb_central_client.get_mobile_apps(current_user.username).deep_symbolize_keys
@mobile_apps = response[:mobile_apps].map { |a| Carto::MobileApp.new(a) }
@open_monthly_users = response[:monthly_users][:open]
@private_monthly_users = response[:monthly_users][:private]
rescue CartoDB::CentralCommunicationFailure => e
@mobile_apps = []
CartoDB::Logger.error(message: 'Error loading mobile apps from Central', exception: e)
flash.now[:error] = 'Unable to connect to license server. Try again in a moment.'
end
def show
end
def new
@mobile_app = Carto::MobileApp.new
end
def create
@mobile_app = Carto::MobileApp.new(params[:mobile_app])
@mobile_app.icon_url = get_default_avatar unless @mobile_app.icon_url.present?
unless @mobile_app.valid?
flash.now[:error] = @mobile_app.errors.full_messages.join(', ')
render :new
return
end
attributes = @mobile_app.as_json.symbolize_keys.slice(:name, :description, :icon_url, :platform, :app_id, :app_type)
@cartodb_central_client.create_mobile_app(current_user.username, attributes)
redirect_to CartoDB.url(self, 'mobile_apps'), flash: { success: 'Your app has been added succesfully!' }
rescue CartoDB::CentralCommunicationFailure => e
if e.response_code == 422
if e.errors.any? { |e| e['app_id'] }
@mobile_app.errors["app_id"] = 'has already been taken'
flash.now[:error] = "That application ID has already been taken. Please make sure that it is unique."
else
flash.now[:error] = e.errors.join('. ')
end
else
CartoDB::Logger.error(message: 'Error creating mobile_app in Central', exception: e)
flash.now[:error] = 'Unable to connect to license server. Try again in a moment.'
end
render :new
end
def update
updated_attributes = params[:mobile_app].symbolize_keys.slice(:name, :description, :icon_url, :app_type)
@mobile_app.name = updated_attributes[:name]
@mobile_app.icon_url = updated_attributes[:icon_url]
@mobile_app.description = updated_attributes[:description]
unless @mobile_app.valid?
flash.now[:error] = @mobile_app.errors.full_messages.join(', ')
render :show
return
end
@cartodb_central_client.update_mobile_app(current_user.username, @app_id, updated_attributes)
redirect_to(CartoDB.url(self, 'mobile_app', params: { id: @app_id }),
flash: { success: 'Your app has been updated succesfully!' })
rescue CartoDB::CentralCommunicationFailure => e
if e.response_code == 422
flash.now[:error] = e.errors
else
CartoDB::Logger.error(message: 'Error updating mobile_app in Central', exception: e)
flash.now[:error] = 'Unable to connect to license server. Try again in a moment.'
end
render :show
end
def destroy
valid_password_confirmation
@cartodb_central_client.delete_mobile_app(current_user.username, @app_id)
redirect_to CartoDB.url(self, 'mobile_apps'), flash: { success: 'Your app has been deleted succesfully!' }
rescue Carto::PasswordConfirmationError => e
flash[:error] = e.message
redirect_to(CartoDB.url(self, 'mobile_app', params: { id: @app_id }))
rescue CartoDB::CentralCommunicationFailure => e
raise Carto::LoadError.new('Mobile app not found') if e.response_code == 404
CartoDB::Logger.error(message: 'Error deleting mobile app from Central', exception: e, app_id: @app_id)
redirect_to(CartoDB.url(self, 'mobile_app', params: { id: @app_id }),
flash: { error: 'Unable to connect to license server. Try again in a moment.' })
end
private
def check_user_permissions
raise Carto::LoadError.new('Mobile apps disabled') unless current_user.mobile_sdk_enabled?
end
def initialize_cartodb_central_client
raise Carto::LoadError.new('Mobile apps disabled') unless Cartodb::Central.sync_data_with_cartodb_central?
@cartodb_central_client ||= Cartodb::Central.new
end
def validate_id
@app_id = uuid_parameter(:id)
end
def setup_avatar_upload
@icon_valid_extensions = AVATAR_VALID_EXTENSIONS
end
def load_mobile_app
@mobile_app = Carto::MobileApp.new(@cartodb_central_client.get_mobile_app(current_user.username, @app_id))
rescue CartoDB::CentralCommunicationFailure => e
raise Carto::LoadError.new('Mobile app not found') if e.response_code == 404
CartoDB::Logger.error(message: 'Error loading mobile app from Central', exception: e, app_id: @app_id)
redirect_to(CartoDB.url(self, 'mobile_apps'),
flash: { error: 'Unable to connect to license server. Try again in a moment.' })
end
def get_default_avatar
if Cartodb.asset_path
"#{Cartodb.asset_path}/assets/unversioned/images/avatars/mobile_app_default_avatar.png"
else
"#{relative_url_root}/#{frontend_version}/images/avatars/mobile_app_default_avatar.png"
end
end
end