ZeusWPI/FK-enrolment

View on GitHub
app/controllers/frontend/registration_controller.rb

Summary

Maintainability
A
45 mins
Test Coverage
class Frontend::RegistrationController < Frontend::FrontendController
  include Wicked::Wizard
  # Member states are steps, except for 'initial'
  steps :authenticate, *Member::States.drop(1)

  before_filter :load_club!
  before_filter :load_member, :only => [:show, :update]
  before_filter :verify_club

  def load_member
    @member = Member.unscoped.find(session[:member_id]) if session[:member_id]
    if !@member
      redirect_to registration_index_path
    else
      send_to_correct_step
      @member.build_extra_attributes
    end
  end

  def index
    create_member
    super
  end

  def show
    set_state
    self.send step if self.respond_to? step
    render_wizard
  end

  def update
    set_state
    @member.assign_attributes params[:member] if params[:member]
    self.send step if self.respond_to? step
    render_wizard @member unless performed?
  end

  def card_type
    skip_step if @club.allowed_card_types.count == 1
  end

  def info
    load_cas_member_attributes if cas_authed?
    load_eid_member_attributes if eid_authed?
  end

  def questions
    skip_step if @member.extra_attributes.empty?
  end

  def isic
    skip_step unless @member.uses_isic?
    @member.isic_mail_card = true if @club.isic_mail_option == Club::ISIC_MAIL_CARD_FORCED
  end

  def photo
    skip_step unless @member.uses_isic? || (@member.uses_citylife? && ! @member.club.skip_photo_step)
    if params[:member]
      @member.save # Trigger paperclip callbacks
      # All image uploading and processing is done by the model
      @member.crop_photo
      render_wizard unless @member.valid_photo?
    end
  end

  def complete
    # Finish registration
    @member.enabled = true
    @member.save
    skip_step
  end

  def finish_wizard_path
    success_path
  end

  def success
    session.delete :member_id
    # Redirect to fk-books
    if session.delete :fk_books
      key = Rails.application.secrets.fkbooks_key
      signature = Digest::SHA1.hexdigest(key + @member.id.to_s)

      redirect_to Rails.application.secrets.fkbooks % [@member.id, signature]
    end
  end

  helper_method :cas_authed?
  def cas_authed?
    session[:cas] && session[:cas]['user']
  end

  helper_method :eid_authed?
  def eid_authed?
    !session[:eid].blank?
  end

  private

  def create_member
    @member = Member.new
    @member.state = 'initial'
    @member.club = @club
    @member.save!
    session[:member_id] = @member.id
  end

  def set_state step=self.step
    if Member::States.include? step
      step_index = Member::States.index(step)
      member_index = Member::States.index(@member.state)
      @member.state = step if member_index < step_index
    end
  end

  # If the steps list is changed, this method will probably
  # no longer be valid.
  def send_to_correct_step
    if Member::States.include? step
      original_state = @member.state
      set_state previous_step
      if !@member.valid?
        member_step = wizard_steps.index(original_state) || 0
        jump_to wizard_steps[member_step.next]
      end
    end
  end

  def load_cas_member_attributes
    attributes = session[:cas]["extra_attributes"]
    @member.first_name = attributes["givenname"]
    @member.last_name = attributes["surname"]
    @member.ugent_nr = attributes["ugentStudentID"]
  end

  def load_eid_member_attributes
    attributes = session[:eid]
    key_prefix = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/"

    @member.first_name = attributes[key_prefix + "givenname"]
    @member.last_name = attributes[key_prefix + "surname"]
    @member.date_of_birth = Date.parse attributes[key_prefix + "dateofbirth"]
    @member.home_street = attributes[key_prefix + "streetaddress"]
    @member.home_postal_code = attributes[key_prefix + "postalcode"]
    @member.home_city = attributes[key_prefix + "locality"]

    sex = attributes[key_prefix + "gender"]
    @member.sex = {'1' => 'm', '2' => 'f'}[sex] || @member.sex
  end

  def verify_club
    redirect_to root_path, alert: 'This club doesn\'t use website registration' unless @club.registration_method == 'website'
  end
end