Files
openfoodnetwork/app/controllers/admin/schedules_controller.rb
Pau Perez 9a29e634fc Deal with Schedule creation in its own controller
This way it can assign the order cycles to the schedule when this is
persisted. An OrderCycleSchedule (the join table) can't be created until
both schedule and order_cycle got an id.

Also, we do not call `#adapt_params` when creating the Schedule as that
assigns `order_cycle_ids` to `@object.attributes` thus, attempting to
create the OrderCycleSchedule without a schedule_id.
2020-05-28 17:49:36 +02:00

121 lines
4.4 KiB
Ruby

require 'open_food_network/permissions'
require 'order_management/subscriptions/proxy_order_syncer'
module Admin
class SchedulesController < ResourceController
before_filter :adapt_params, only: [: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
def create
invoke_callbacks(:create, :before)
@object.attributes = permitted_resource_params
@object.save!
@object.order_cycle_ids = params[:order_cycle_ids]
if @object.save
invoke_callbacks(:create, :after)
flash[:success] = flash_message_for(@object, :successfully_created)
respond_with(@object) do |format|
format.html { redirect_to location_after_save }
format.js { render layout: false }
end
else
invoke_callbacks(:create, :fails)
respond_with(@object)
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 = OrderManagement::Subscriptions::ProxyOrderSyncer.new(subscriptions)
syncer.sync!
end
def permitted_resource_params
params.require(:schedule).permit(:id, :name)
end
end
end