ncbo/bioportal_web_ui

View on GitHub
app/controllers/projects_controller.rb

Summary

Maintainability
A
0 mins
Test Coverage
# frozen_string_literal: true

class ProjectsController < ApplicationController
  layout :determine_layout

  def index
    @projects = LinkedData::Client::Models::Project.all
    @projects.reject! { |p| p.name.nil? }
    @projects.sort! { |a, b| a.name.downcase <=> b.name.downcase }
    @ontologies = LinkedData::Client::Models::Ontology.all(include_views: true)
    @ontologies_hash = Hash[@ontologies.map { |ont| [ont.id, ont] }]
    if request.xhr?
      render action: 'index', layout: false
    else
      render action: 'index'
    end
  end

  def show
    projects = LinkedData::Client::Models::Project.find_by_acronym(params[:id])
    if projects.blank?
      flash.alert = "Project not found: #{params[:id]}"
      redirect_to projects_path
      return
    end

    @project = projects.first
    @ontologies_used = []
    onts_used = @project.ontologyUsed
    onts_used.each do |ont_used|
      ont = LinkedData::Client::Models::Ontology.find(ont_used)
      @ontologies_used << Hash['name', ont.name, 'acronym', ont.acronym] unless ont.nil?
    end
    @ontologies_used.sort_by! { |o| o['name'].downcase }
  end

  def new
    if session[:user].nil?
      redirect_to controller: 'login', action: 'index'
    else
      @project = LinkedData::Client::Models::Project.new
      @user_select_list = LinkedData::Client::Models::User.all.map { |u| [u.username, u.id] }
      @user_select_list.sort! { |a, b| a[1].downcase <=> b[1].downcase }
    end
  end

  def edit
    projects = LinkedData::Client::Models::Project.find_by_acronym(params[:id])
    if projects.blank?
      flash.alert = "Project not found: #{params[:id]}"
      redirect_to projects_path
      return
    end
    @project = projects.first
    @user_select_list = LinkedData::Client::Models::User.all.map { |u| [u.username, u.id] }
    @user_select_list.sort! { |a, b| a[1].downcase <=> b[1].downcase }
    @usedOntologies = @project.ontologyUsed || []
    @ontologies = LinkedData::Client::Models::Ontology.all
  end

  def create
    @project = LinkedData::Client::Models::Project.new(values: project_params)
    @project_saved = @project.save

    # Project successfully created.
    if response_success?(@project_saved)
      flash[:notice] = 'Project successfully created'
      redirect_to project_path(@project.acronym)
      return
    end

    # Errors creating project.
    if @project_saved.status == 409
      error = OpenStruct.new existence: "Project with acronym #{params[:project][:acronym]} already exists. Please enter a unique acronym."
      @errors = Hash[:error, OpenStruct.new(acronym: error)]
    else
      @errors = response_errors(@project_saved)
    end

    @project = LinkedData::Client::Models::Project.new(values: project_params)
    @user_select_list = LinkedData::Client::Models::User.all.map { |u| [u.username, u.id] }
    @user_select_list.sort! { |a, b| a[1].downcase <=> b[1].downcase }
    render action: 'new'
  end

  def update
    projects = LinkedData::Client::Models::Project.find_by_acronym(params[:id])
    if projects.blank?
      flash.alert = "Project not found: #{params[:id]}"
      redirect_to projects_path
      return
    end
    @project = projects.first
    @project.update_from_params(project_params)
    @user_select_list = LinkedData::Client::Models::User.all.map { |u| [u.username, u.id] }
    @user_select_list.sort! { |a, b| a[1].downcase <=> b[1].downcase }
    @usedOntologies = @project.ontologyUsed || []
    @ontologies = LinkedData::Client::Models::Ontology.all
    error_response = @project.update
    if response_error?(error_response)
      @errors = response_errors(error_response)
      render :edit
    else
      flash[:notice] = 'Project successfully updated'
      redirect_to project_path(@project.acronym)
    end
  end

  def destroy
    projects = LinkedData::Client::Models::Project.find_by_acronym(params[:id])
    if projects.blank?
      flash.alert = "Project not found: #{params[:id]}"
      redirect_to projects_path
      return
    end
    @project = projects.first
    error_response = @project.delete
    if response_error?(error_response)
      @errors = response_errors(error_response)
      flash[:notice] = "Project delete failed: #{@errors}"
      respond_to do |format|
        format.html { redirect_to projects_path }
        format.xml  { head :internal_server_error }
      end
    else
      flash[:notice] = 'Project successfully deleted'
      respond_to do |format|
        format.html { redirect_to projects_path }
        format.xml  { head :ok }
      end
    end
  end

  private

  def project_params
    p = params.require(:project).permit(:name, :acronym, :institution, :contacts, { creator: [] }, :homePage,
                                        :description, { ontologyUsed: [] })
    p[:creator].reject!(&:blank?)
    p[:ontologyUsed].reject!(&:blank?)
    p.to_h
  end
end