153 lines
5.7 KiB
Ruby
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
|