gorums/WatchIoT

View on GitHub
app/controllers/projects_controller.rb

Summary

Maintainability
A
1 hr
Test Coverage
# == Schema Information
#
# Table name: projects
#
#  id            :integer          not null, primary key
#  name          :string
#  description   :text
#  configuration :text
#  ready    :boolean          default(FALSE)
#  status        :boolean          default(TRUE)
#  user_id       :integer
#  space_id      :integer
#  user_owner_id :integer
#  created_at    :datetime         not null
#  updated_at    :datetime         not null
#

##
# Project controller
#

class ProjectsController < ApplicationController
  layout 'dashboard'

  before_filter :allow
  before_filter :allow_space
  before_filter :allow_project, :except => [:index, :create]
  before_filter :add_repo, :except => [:index, :create]

  ##
  # Get /:username/:space/projects
  #
  def index
    @project = Project.new
  end

  ##
  # Get /:username/:space/:project
  #
  def show
  end

  ##
  # Post /:username/:namespace/create
  #
  def create
    project = Project.create_new_project(project_create_params,
                                         @user, @space, me)

    flash_log('Create the project <b>' + project.name + '</b>',
              'Project was created correctly')

    redirect_to '/' + @user.username + '/' + @space.name + '/' + project.name
  rescue => ex
    flash[:error] = clear_exception ex.message
    redirect_to '/' + @user.username + '/' + @space.name
  end

  ##
  # Patch /:username/:namespace/:project
  #
  def edit
    @project.edit_project(project_edit_params[:description],
                          project_edit_params[:status])

    flash_log('Edit the project <b>' + @project.name + '</b>',
              'Project was edited correctly')

    redirect_to '/' + @user.username + '/' + @space.name + '/' + @project.name
  rescue => ex
    flash[:error] = clear_exception ex.message
    redirect_to '/' + @user.username + '/' + @space.name + '/' + @project.name
  end

  ##
  # Patch /:username/:namespace/:project/evaluate
  #
  def evaluate
    yaml = params[:evaluator]
    errors = Project.evaluate yaml
    response_eval errors
  rescue => ex
    flash.now[:error] = clear_exception ex.message
    response_js
  end

  ##
  # Patch /:username/:namespace/:project/deploy
  #
  def deploy
    yaml = params[:deploy]
    errors = Project.evaluate yaml

    num_errors = errors.nil? || errors.empty? ? 0 : errors.length
    @project.save_project_config yaml, params[:repo_name],
                                 !yaml.blank? && num_errors == 0

    notice = notice num_errors
    flash.now[:notice] = notice if num_errors == 0
    flash.now[:error]  = notice if num_errors != 0

    response_js
  rescue => ex
    flash.now[:error] = clear_exception ex.message
    response_js
  end

  ##
  # GET /:username/:namespace/:nameproject/repo/:reponame
  #
  def repo
    config_yaml = Project.config_yaml(@repo_url, params[:reponame])

    @project.configuration = config_yaml['yml']
    @project.repo_name = params[:reponame]

    render 'show'
  rescue => ex
    flash[:error] = clear_exception ex.message
    redirect_to '/' + @user.username + '/' + @space.name + '/' + @project.name
  end

  ##
  # GET /:username/:namespace/:nameproject/readme/:reponame
  #
  def readme
    @readme = Project.config_readme(@repo_url, params[:reponame])

    response_js
  rescue => ex
    flash[:error] = clear_exception ex.message
    response_js
  end

  ##
  # Get /:username/:namespace/:project/setting
  #
  def setting
  end

  ##
  # Patch /:username/:namespace/:project/setting/change
  # Change space name
  #
  def change
    old_name = @project.name
    @project.change_project(project_name_params[:name])
    new_name = @project.name
    flash_log('Change project name <b>' + old_name + '</b> by <b>' + new_name + '</b>',
              'The project name was changed correctly')

    redirect_to '/' + @user.username + '/' + @space.name + '/' + new_name + '/setting'
  rescue => ex
    flash[:error] = clear_exception ex.message
    redirect_to '/' + @user.username + '/' + @space.name + '/' + old_name + '/setting'
  end

  ##
  # Delete /:username/:namespace/setting/delete
  #
  def delete
    @project.delete_project(project_name_params[:name])

    flash_log('Delete project <b>' + project_name_params[:name] + '</b>',
              'The project was deleted correctly')
    redirect_to '/' + @user.username + '/' + @space.name
  rescue => ex
    flash[:error] = clear_exception ex.message
    redirect_to '/' + @user.username + '/' + @space.name + '/' + @project.name + '/setting'
  end

  private

  ##
  # response evaluator
  #
  def response_eval(errors)
    respond_to do |format|
      if errors.nil?
        flash.now[:notice] = 'Your configuration code look great!!! Now you can deploy!'
        format.js
      else
        format.json { render json: errors  }
      end
      format.html { redirect_to '/' + @user.username + '/' + @space.name + '/' + @project.name }
    end
  end

  ##
  # response js
  #
  def response_js
    respond_to do |format|
      format.js
      format.html { redirect_to '/' + @user.username + '/' + @space.name + '/' + @project.name }
    end
  end

  ##
  # Never trust parameters from the scary internet, only allow the white list through.
  #
  def project_create_params
    params.require(:project).permit(:name, :description)
  end

  ##
  # Never trust parameters from the scary internet, only allow the white list through.
  #
  def project_edit_params
    params.require(:project).permit(:name, :description, :status)
  end

  ##
  # Never trust parameters from the scary internet, only allow the white list through.
  #
  def project_name_params
    params.require(:project).permit(:name)
  end

  ##
  # Set flash and log
  #
  def flash_log(log_description, msg)
    save_log log_description, 'Project', @user.id
    flash[:notice] = msg
  end

  ##
  # Add the repo
  #
  def add_repo
    @repo_url = ENV['REPO_URL']
    @repos = Project.repos_config(@repo_url)
  end

  ##
  # get notice
  #
  def notice(num_errors)
    notice = 'Deployed correctly.'
    notice += ' This project will be ignore because it has ' + num_errors.to_s +
        ' errors. Please click on Evaluate for more details.' if num_errors != 0
    notice
  end
end