agile-alliance-brazil/submissions

View on GitHub
app/controllers/session_types_controller.rb

Summary

Maintainability
A
50 mins
Test Coverage
B
88%
# frozen_string_literal: true

class SessionTypesController < ApplicationController
  skip_before_action :authenticate_user!, only: %i[index]
  respond_to :json, :html

  def index
    @session_types = resource_class.for_conference(@conference).includes(:translated_contents)
  end

  def create
    @session_type = resource_class.new(session_type_params)
    respond_with @session_type do |format|
      format.html do
        handle_html_response(t('flash.session_type.create.success')) { @session_type.save }
      end
      format.json { handle_json_response { @session_type.save } }
    end
  end

  def update
    @session_type = resource_class.where(id: params[:id]).first
    respond_with @session_type do |format|
      format.html do
        handle_html_response(t('flash.session_type.update.success')) { @session_type.update(session_type_params) }
      end
      format.json { handle_json_response { @session_type.update(session_type_params) } }
    end
  end

  private

  def resource_class
    SessionType
  end

  def session_type_params
    allowed_params = []
    if @session_type.nil? || !@conference.visible?
      allowed_params << :needs_audience_limit
      allowed_params << :needs_mechanics
      allowed_params << { valid_durations: [] }
    end
    allowed_params << { translated_contents_attributes: %i[id language title content] }
    attrs = params.require(:session_type).permit(allowed_params)
    attrs = attrs.merge(conference_id: @conference.id)
    attrs[:valid_durations].nil? ||
      attrs[:valid_durations] = attrs[:valid_durations].map(&:to_i)
    attrs
  end

  def handle_html_response(notice)
    result = yield
    if result
      redirect_to conference_session_types_path(@conference), notice: notice
    else
      render_conference_page_for_error
    end
  end

  def render_conference_page_for_error
    @tags = ActsAsTaggableOn::Tag.where('name like ? and (expiration_year IS NULL or expiration_year >= ?)', 'tags.%', @conference.year).to_a
    @new_track = Track.new(conference: @conference)
    @new_session_type = @session_type
    @new_audience_level = AudienceLevel.new(conference: @conference)
    @new_page = Page.new(conference: @conference)
    @conference.supported_languages.each do |code|
      @new_track.translated_contents.build(language: code)
      @new_audience_level.translated_contents.build(language: code)
      @new_page.translated_contents.build(language: code)
    end

    missing_langs = @conference.supported_languages - @session_type.translated_contents.map(&:language)
    missing_langs.each do |code|
      @session_type.translated_contents.build(language: code)
    end
    flash.now[:error] = 'Something went wrong'
    render template: 'conferences/edit'
  end

  def handle_json_response
    result = yield
    json_level = {
      valid_durations: @session_type.valid_durations,
      needs_audience_limit: @session_type.needs_audience_limit?,
      needs_mechanics: @session_type.needs_mechanics?,
      translations: @conference.languages.map do |l|
        c = @session_type.translated_contents.where(language: l[:code]).first
        { id: c.id, title: c.title, description: c.content, language: l }
      end
    }
    if result
      render json: json_level.merge(id: @session_type.id)
    else
      render json: json_level.merge(errors: @session_type.errors)
    end
  end
end