fablabbcn/fablabs

View on GitHub
app/controllers/labs_controller.rb

Summary

Maintainability
A
1 hr
Test Coverage
# frozen_string_literal: true

class LabsController < ApplicationController
  include LabsOperations

  before_action :require_login, except: [:index, :map, :show, :mapdata, :embed, :list]
  after_action :allow_iframe, only: [:embed, :list]

  before_action :require_login, except: %i[index map show mapdata embed list]
  after_action :allow_iframe, only: %i[embed list]

  # authorize_actions_for Lab, actions: { map: :read, manage_admins: :update}

  rescue_from ActiveRecord::RecordNotFound, :with => :record_not_found

  def embed
    @labs = Lab.with_approved_state
    # render :embed, layout: false
    render layout: 'embed'
  end

  def map
    @labs = Lab.with_approved_state
  end

  def list
    ## the country code is stored as lowercase in the db
    if params[:country]
      params['country'].downcase!
      # params['country'].upcase!
    end
    @labs = Lab.with_approved_state.order('LOWER(name) ASC').in_country_code(params['country']).page(params['page']).per(params['per'])
    render layout: 'embed'
  end

  def mapdata
    @labs = Lab.with_approved_state
    render json: @labs, each_serializer: MapSerializer
  end


  def index
    all_labs = Lab.with_approved_state
    @countries = Lab.country_list_for(all_labs)

    @q = all_labs.ransack(params[:q])
    @labs = @q.result(distinct: :true).page(params[:page]).per(params['per'])

    respond_to do |format|
      format.html
      format.json { redirect_to "https://api.fablabs.io/0/labs.json" }
      # format.csv { send_data @labs.to_csv }
    end
  end

  def new
    @lab = current_user.created_labs.build
    @lab.employees.build
    @lab.links.build
    @lab.kind = Lab::KINDS[0]
    @lab.activity_status = Lab::ACTIVITY_STATUS[0]
    authorize_action_for @lab
  end

  def create
    @lab = current_user.created_labs.build lab_params
    @lab.employees.first.assign_attributes(user: current_user, lab: @lab)
    authorize_action_for @lab
    if @lab.save
      sends_emails('submitted')
      redirect_to labs_path, notice: 'Thanks for adding your lab. We shall review your application and be in touch.'
    else
      # @lab.employees.build if @lab.employees.empty?
      @lab.links.build
      render :new
    end
  end

  def show
    @lab = with_approved_or_pending_state(params[:id])
    # @people = [@lab.creator]
    @employees = @lab.employees.includes(:user).active.order('employees.id ASC')
    @machines = @lab.machines.includes(:brand, :tags)
    @events = @lab.events.order('starts_at ASC').includes(:lab)
    @academics = @lab.academics.includes(:user).order('users.first_name ASC')
    @years = @academics.map(&:started_in).uniq.sort.reverse
    @nearby_labs = @lab.nearby_labs(false, 1000)
    @nearby_labs = @nearby_labs.limit(5) if @nearby_labs
    authorize_action_for @lab
  end

  def destroy
    @lab = Lab.friendly.find(params[:id])
    authorize_action_for @lab
    @lab.delete
    redirect_to labs_path, notice: 'Lab deleted'
  end

  def edit
    @lab = Lab.friendly.find(params[:id])
    @lab.links.build
    authorize_action_for @lab
  end

  def update
    @lab = Lab.friendly.find(params[:id])
    authorize_action_for @lab
    if @lab.update_attributes lab_params
      track_activity @lab
      update_workflow_state
      redirect_to lab_url(@lab), notice: 'Lab was successfully updated'
    else
      @lab.links.build
      render :edit
    end
  end

  def manage_admins
    @lab = Lab.friendly.find(params[:id])
    authorize_action_for @lab
    @admins = @lab.admins
    @users = User.all # - User.with_role(:admin) - [current_user]
  end

  def docs
    render template: "labs/docs/#{params[:page]}"
  end

  private

  def allow_iframe
    response.headers.delete 'X-Frame-Options'
    #  From http://jerodsanto.net/2013/12/rails-4-let-specific-actions-be-embedded-as-iframes/
  end

  def record_not_found
    respond_to do |format|
      format.html { render "404", :status => :not_found }
      format.all { head :not_found }
    end
  end

  def lab_params
    params.require(:lab).permit(
      :activity_status,
      :activity_start_at,
      :activity_inaugurated_at,
      :activity_closed_at,
      :avatar,
      :charter,
      :header,
      :kind,
      :parent_id,
      :referee_id,
      :tools_list,
      :geocomplete,
      :name,
      :blurb,
      :description,
      :slug,
      :address_1,
      :address_2,
      :city,
      :county,
      :postal_code,
      :country_code,
      :latitude,
      :longitude,
      :zoom,
      :address_notes,
      :phone,
      :email,
      :application_notes,
      :public,
      :tools_list,
      :tools,
      :network,
      :programs,
      :improve_approval_application,
      lab_tag_ids: [],
      capabilities: [],
      machine_ids: [],
      links_attributes: [:id, :link_id, :url, '_destroy'],
      referee_approval_processes_attributes: [:referee_lab_id, '_destroy'],
      employees_attributes: %i[id job_title description]
    )
  end
end