Codeminer42/Punchclock

View on GitHub
app/controllers/new_admin/regional_holidays_controller.rb

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
# frozen_string_literal: true

module NewAdmin
  class RegionalHolidaysController < NewAdminController
    load_and_authorize_resource

    before_action :set_regional_holiday, only: %i[show edit update destroy]
    before_action :load_cities_with_holidays, only: :index

    def index
      @regional_holidays = paginate_record(regional_holidays)
    end

    def show; end

    def new
      @regional_holiday = RegionalHoliday.new
    end

    def create
      @regional_holiday = RegionalHoliday.new(regional_holiday_params)

      if @regional_holiday.save
        redirect_on_success new_admin_regional_holidays_path, message_scope: "create"
      else
        render_on_failure :new
      end
    end

    def edit; end

    def update
      if @regional_holiday.update(regional_holiday_params)
        redirect_on_success new_admin_show_regional_holiday_path(id: @regional_holiday.id), message_scope: "update"
      else
        render_on_failure :edit
      end
    end

    def destroy
      if @regional_holiday.destroy
        redirect_on_success new_admin_regional_holidays_path, message_scope: "destroy"
      else
        render_on_failure :index
      end
    end

    private

    def regional_holidays
      RegionalHolidaysQuery.new(**filter_params).call
    end

    def redirect_on_success(url, message_scope:)
      flash[:notice] = I18n.t(:notice, scope: "flash.actions.#{message_scope}",
                                       resource_name: RegionalHoliday.model_name.human)
      redirect_to url
    end

    def render_on_failure(template)
      flash.now[:alert] = @regional_holiday.errors.full_messages.to_sentence
      render template, status: :unprocessable_entity
    end

    def filter_params
      params.permit(
        :regional_holiday_id,
        :month,
        city_ids: []
      ).to_h
    end

    def regional_holiday_params
      params.require(:regional_holiday).permit(:name, :day, :month, :city_ids)
    end

    def set_regional_holiday
      @regional_holiday = RegionalHoliday.find(params[:id])
    end

    def load_cities_with_holidays
      @cities_with_holidays = City.with_holidays
    end
  end
end