Scott Seago
2009-May-11 16:24 UTC
[Ovirt-devel] [PATCH server] converted the quota controller to use the service layer.
Signed-off-by: Scott Seago <sseago at redhat.com> --- src/app/controllers/quota_controller.rb | 61 ++++-------------- src/app/services/quota_service.rb | 100 +++++++++++++++++++++++++++++++ 2 files changed, 114 insertions(+), 47 deletions(-) create mode 100644 src/app/services/quota_service.rb diff --git a/src/app/controllers/quota_controller.rb b/src/app/controllers/quota_controller.rb index d4fbcd0..fcdd672 100644 --- a/src/app/controllers/quota_controller.rb +++ b/src/app/controllers/quota_controller.rb @@ -18,78 +18,45 @@ # also available at http://www.gnu.org/copyleft/gpl.html. class QuotaController < ApplicationController + include QuotaService # GETs should be safe (see http://www.w3.org/2001/tag/doc/whenToUseGet.html) verify :method => :post, :only => [ :destroy, :create, :update ], :redirect_to => { :controller => 'dashboard' } - def redirect_to_parent - redirect_to :controller => @quota.pool.get_controller, :action => 'show', :id => @quota.pool - end - def show - @quota = Quota.find(params[:id]) - authorize_view + svc_show(params[:id]) end def new + svc_new(params[:pool_id]) render :layout => 'popup' end def create - begin - @quota.save! - render :json => { :object => "quota", :success => true, - :alert => "Quota was successfully created." } - rescue - render :json => { :object => "quota", :success => false, - :errors => @quota.errors.localize_error_messages.to_a} - end + alert = svc_create(params[:quota]) + render :json => { :object => "quota", :success => true, :alert => alert } end def edit + svc_modify(params[:id]) render :layout => 'popup' end def update - begin - @quota.update_attributes!(params[:quota]) - render :json => { :object => "quota", :success => true, - :alert => "Quota was successfully updated." } - rescue - render :json => { :object => "quota", :success => false, - :errors => @quota.errors.localize_error_messages.to_a, - :alert => $!.to_s} - end + alert = svc_update(params[:id], params[:quota]) + render :json => { :object => "quota", :success => true, :alert => alert } end def destroy - pool = @quota.pool - if @quota.destroy - alert="Quota was successfully deleted." - success=true - else - alert="Failed to delete quota." - success=false - end - render :json => { :object => "quota", :success => success, :alert => alert } + alert = svc_destroy(params[:id]) + render :json => { :object => "quota", :success => true, :alert => alert } end - protected - def pre_new - @quota = Quota.new( { :pool_id => params[:pool_id]}) - set_perms(@quota.pool) - end - def pre_create - @quota = Quota.new(params[:quota]) - set_perms(@quota.pool) - end - def pre_show - @quota = Quota.find(params[:id]) - set_perms(@quota.pool) + # FIXME: remove these when service transition is complete. these are here + # to keep from running permissions checks and other setup steps twice + def tmp_pre_update end - def pre_edit - @quota = Quota.find(params[:id]) - set_perms(@quota.pool) + def tmp_authorize_admin end end diff --git a/src/app/services/quota_service.rb b/src/app/services/quota_service.rb new file mode 100644 index 0000000..ca6f2db --- /dev/null +++ b/src/app/services/quota_service.rb @@ -0,0 +1,100 @@ +# +# Copyright (C) 2009 Red Hat, Inc. +# Written by Scott Seago <sseago at redhat.com>, +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; version 2 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +# MA 02110-1301, USA. A copy of the GNU General Public License is +# also available at http://www.gnu.org/copyleft/gpl.html. +# Mid-level API: Business logic around quotas +module QuotaService + include ApplicationService + + # Load the Quota with +id+ for viewing + # + # === Instance variables + # [<tt>@quota</tt>] stores the Quota with +id+ + # === Required permissions + # [<tt>Privilege::VIEW</tt>] on quota's Pool + def svc_show(id) + lookup(id,Privilege::VIEW) + end + + # Load the Quota with +id+ for editing + # + # === Instance variables + # [<tt>@quota</tt>] stores the Quota with +id+ + # === Required permissions + # [<tt>Privilege::MODIFY</tt>] on quota's Pool + def svc_modify(id) + lookup(id,Privilege::MODIFY) + end + + # Update attributes for the Quota with +id+ + # + # === Instance variables + # [<tt>@quota</tt>] stores the Quota with +id+ + # === Required permissions + # [<tt>Privilege::MODIFY</tt>] for the Quota's Pool + def svc_update(id, quota_hash) + lookup(id,Privilege::MODIFY) + @quota.update_attributes!(quota_hash) + return "Quota was successfully updated." + end + + # Load a new Quota for creating + # + # === Instance variables + # [<tt>@quota</tt>] loads a new Quota object into memory + # === Required permissions + # [<tt>Privilege::MODIFY</tt>] for the quota's Pool as specified by + # +pool_id+ + def svc_new(pool_id) + @quota = Quota.new( { :pool_id => pool_id}) + authorized!(Privilege::MODIFY, at quota.pool) + + end + + # Save a new Quota + # + # === Instance variables + # [<tt>@quota</tt>] the newly saved quota + # === Required permissions + # [<tt>Privilege::MODIFY</tt>] for the quota's Pool as specified by + # +pool_id+ + def svc_create(quota_hash) + @quota = Quota.new( quota_hash) + authorized!(Privilege::MODIFY, at quota.pool) + @quota.save! + return "Quota was successfully created." + end + + # Destroys for the Quota with +id+ + # + # === Instance variables + # [<tt>@quota</tt>] stores the Quota with +id+ + # === Required permissions + # [<tt>Privilege::MODIFY</tt>] on quota's Pool + def svc_destroy(id) + lookup(id,Privilege::MODIFY) + @quota.destroy + return "Quota was successfully deleted." + end + + private + def lookup(id, priv) + @quota = Quota.find(id) + authorized!(priv, at quota.pool) + end + +end -- 1.6.0.6