igrigorik/vimgolf

View on GitHub
app/controllers/entry_controller.rb

Summary

Maintainability
A
1 hr
Test Coverage
B
88%
class EntryController < ApplicationController

  before_action :login, :only => [:comment]
  before_action :load_entry, :only => [:comment, :destroy]

  def comment
    if @challenge.participator?(current_user) && @entry && params.fetch(:comment, {})[:text].present?
      @entry.comments.create(
        comment: params[:comment][:text],
        user: current_user
      )
    end

    redirect_to challenge_path(params[:challenge])
  end

  def create
    if params[:entry] && params[:entry].size < 2
      @cheat = true

    elsif params['challenge_id'] && !params['apikey'].empty? && !params['apikey'].nil?
      @challenge = Challenge.find_by_urlkey(params['challenge_id']) rescue nil
      @user = User.where(key: params['apikey']).first

      if @challenge && @user
        @entry = Entry.new(
                  script: params[:entry],
                  score: VimGolf::Keylog.new(params[:entry]).score
                 )
        @entry.created_at = Time.now.utc
        @entry.user = @user

        @challenge.entries << @entry
      end
    end

    respond_to do |format|
      if !@cheat && @user && @challenge
        format.json { render :json => {'status' => 'ok'} }
      else
        format.json { render :json => {'status' => 'failed'}, :status => 400 }
      end
    end
  end

  def destroy
    if @entry && (@challenge.owner?(current_user) || @entry.owned_by?(current_user))
      @entry.destroy
    end

    redirect_to challenge_path(params[:challenge])
  end

  private

  def load_entry
    @challenge = Challenge.find_by_urlkey(params[:challenge])
    @entry = @challenge.entries.find(params[:entry])
  rescue
    respond_to do |format|
      format.json {
        render :json => {'status' => 'failed'}, :status => 400
      }
      format.html { redirect_to root_path }
    end
  end
end