Files
openfoodnetwork/app/controllers/admin/schedules_controller.rb
2020-03-21 20:30:34 +00:00

102 lines
3.8 KiB
Ruby

require 'open_food_network/permissions'
require 'open_food_network/proxy_order_syncer'
module Admin
class SchedulesController < ResourceController
before_filter :adapt_params, only: [:create, :update]
before_filter :check_editable_order_cycle_ids, only: [:create, :update]
before_filter :check_dependent_subscriptions, only: [:destroy]
create.after :sync_subscriptions
update.after :sync_subscriptions
respond_to :json
respond_override create: { json: {
success: lambda { render_as_json @schedule, editable_schedule_ids: permissions.editable_schedules.pluck(:id) },
failure: lambda { render json: { errors: @schedule.errors.full_messages }, status: :unprocessable_entity }
} }
respond_override update: { json: {
success: lambda { render_as_json @schedule, editable_schedule_ids: permissions.editable_schedules.pluck(:id) },
failure: lambda { render json: { errors: @schedule.errors.full_messages }, status: :unprocessable_entity }
} }
def index
respond_to do |format|
format.json do
render_as_json @collection, ams_prefix: params[:ams_prefix], editable_schedule_ids: permissions.editable_schedules.pluck(:id)
end
end
end
private
def collection
return Schedule.where("1=0") unless json_request?
if params[:enterprise_id]
filter_schedules_by_enterprise_id(permissions.visible_schedules, params[:enterprise_id])
else
permissions.visible_schedules
end
end
# Filter schedules by OCs with a given coordinator id
def filter_schedules_by_enterprise_id(schedules, enterprise_id)
schedules.joins(:order_cycles).where(order_cycles: { coordinator_id: enterprise_id.to_i })
end
def collection_actions
[:index]
end
# In this controller, params like params[:name] are moved into params[:schedule] becoming params[:schedule][:name]
# For some reason in rails 4, this is not happening for params[:order_cycle_ids]
# We do it manually in this filter
def adapt_params
params[:schedule] = {} if params[:schedule].blank?
params[:schedule][:order_cycle_ids] = params[:order_cycle_ids]
end
def check_editable_order_cycle_ids
return unless params[:schedule][:order_cycle_ids]
requested = params[:schedule][:order_cycle_ids]
@existing_order_cycle_ids = @schedule.persisted? ? @schedule.order_cycle_ids : []
permitted = OrderCycle.where(id: params[:schedule][:order_cycle_ids] | @existing_order_cycle_ids).merge(OrderCycle.managed_by(spree_current_user)).pluck(:id)
result = @existing_order_cycle_ids
result |= (requested & permitted) # add any requested & permitted ids
result -= ((result & permitted) - requested) # remove any existing and permitted ids that were not specifically requested
params[:schedule][:order_cycle_ids] = result
@object.order_cycle_ids = result
end
def check_dependent_subscriptions
return if Subscription.where(schedule_id: @schedule).empty?
render json: { errors: [t('admin.schedules.destroy.associated_subscriptions_error')] }, status: :conflict
end
def permissions
return @permissions unless @permission.nil?
@permissions = OpenFoodNetwork::Permissions.new(spree_current_user)
end
def sync_subscriptions
return unless params[:schedule][:order_cycle_ids]
removed_ids = @existing_order_cycle_ids - @schedule.order_cycle_ids
new_ids = @schedule.order_cycle_ids - @existing_order_cycle_ids
return unless removed_ids.any? || new_ids.any?
subscriptions = Subscription.where(schedule_id: @schedule)
syncer = OpenFoodNetwork::ProxyOrderSyncer.new(subscriptions)
syncer.sync!
end
def permitted_resource_params
params.require(:schedule).permit(:name, order_cycle_ids: [])
end
end
end