hugopl/reviewit

View on GitHub
app/api/reviewit/api.rb

Summary

Maintainability
A
0 mins
Test Coverage
module Reviewit
  class Error < RuntimeError
    def initialize(msg, code)
      super msg
      @code = code
    end

    attr_reader :code
  end

  class API < Grape::API
    version 'v1', using: :accept_version_header, vendor: :reviewit
    format :json
    prefix :api

    rescue_from Error do |e|
      Rack::Response.new(e.message, e.code)
    end
    rescue_from ActiveRecord::RecordInvalid do |e|
      Rack::Response.new(e.message, 422)
    end
    rescue_from RuntimeError do |e|
      Rack::Response.new(e.message, 400)
    end
    rescue_from ActiveRecord::RecordNotFound do |e|
      Rack::Response.new(e.message, 404)
    end

    mount CI

    before do
      raise Error.new("Version #{Reviewit::VERSION} required.", 426) if version_changed?

      @current_user = User.find_by(api_token: headers['X-Token'])
      raise Error.new('Sorry, invalid token.', 401) if @current_user.nil?

      raise Error.new('Configuration changed.', 460) if configuration_changed?
    end

    helpers do
      def ok
        { message: :ok }
      end

      def project
        @project ||= Project.find(params[:project_id])
      end

      def setup_request?
        request.path =~ %r{/api/projects/\d+/setup}
      end

      def version_changed?
        return false if setup_request?

        headers['X-Cli-Version'] != Reviewit::VERSION
      end

      def configuration_changed?
        return false if setup_request?

        headers['X-Project-Hash'] != project.configuration_hash
      end

      attr_reader :current_user
    end

    mount Projects
  end
end