pivotal/projectmonitor

View on GitHub
app/controllers/status_controller.rb

Summary

Maintainability
A
25 mins
Test Coverage
class StatusController < ApplicationController
  skip_filter :restrict_ip_address, :authenticate_user!

  def create
    if project = Project.find_by_guid(params.delete(:project_id))
      payload = project.webhook_payload
      payload.remote_addr = request.env['REMOTE_ADDR']

      params.merge!(parse_legacy_jenkins_notification) if is_legacy_jenkins_notification?(payload)

      payload.webhook_status_content =
        case payload
          when TeamCityJsonPayload, SemaphorePayload, CodeshipPayload, TravisJsonPayload, JenkinsJsonPayload, CircleCiPayload
            params
          else
            request.body.read
        end

      log = PayloadProcessor.new(project_status_updater: StatusUpdater.new).process_payload(project: project, payload: payload)
      log.update_method = 'Webhooks'
      log.save!

      project.save!
      head :ok
    else
      head :not_found
    end
  end

  private

  # Jenkins notification plugin did not set content-type prior to 1.5
  def is_legacy_jenkins_notification?(payload)
    payload.is_a?(JenkinsJsonPayload) && params['build'].nil?
  end

  def parse_legacy_jenkins_notification
    begin
      JSON.parse(request.body.read)
    rescue => e
      raise ActionDispatch::ParamsParser::ParseError.new(e.message, e)
    end
  end
end