joakimk/pipeline

View on GitHub
app/models/update_build_status.rb

Summary

Maintainability
A
0 mins
Test Coverage
require 'build'
require 'attr_extras'

# Intended to be used by a client within a CI server to post status to this app.
class UpdateBuildStatus
  method_object :name, :repository, :revision_hash, :status, :status_url

  def call
    if known_build?
      update_build_status
    else
      create_build
      limit_build_history
    end

    project
  end

  private

  def update_build_status
    build.status = status
    build.status_url = status_url
    build.save!
  end

  def create_build
    build = Build.new
    build.name = name
    build.status = status
    build.status_url = status_url
    build.revision = revision
    build.save!
  end

  def limit_build_history
    revisions = project.revisions

    if revisions.count > App.revisions_to_keep
      revisions.order("id DESC").offset(App.revisions_to_keep).each(&:destroy)
    end
  end

  def known_build?
    build
  end

  def build
    @build ||= revision.for_build(name)
  end

  def revision
    @revision ||= Revision.find_or_create_for_project_and_name(project, revision_hash)
  end

  def project
    @project ||= Project.find_or_create_for_repository(repository)
  end
end