travis-ci/job-board

View on GitHub
lib/job_board/services/create_or_update_job.rb

Summary

Maintainability
A
0 mins
Test Coverage
# frozen_string_literal: true

require_relative 'service'

module JobBoard
  module Services
    class CreateOrUpdateJob
      extend Service

      def initialize(job: {}, site: '')
        @job = job
        @site = site.to_s
      end

      attr_reader :job, :site

      def run
        return nil if site.empty? || job.nil? || job.empty?

        job_id = job.fetch('id')

        db_job = JobBoard::Models::Job.first(job_id: job_id.to_s)
        if db_job.nil?
          JobBoard.logger.info(
            'creating new job record', job: job_id, queue: queue, site: site
          )
          return create_new(
            data: Sequel::Postgres::JSONHash.new(job.to_hash),
            job_id: job_id,
            queue_name: queue,
            site: site
          ).to_hash
        else
          JobBoard.logger.info(
            'updating existing job record', job: job_id, queue: queue
          )
          db_job.set(
            data: Sequel::Postgres::JSONHash.new(job.to_hash),
            queue: queue,
            site: site
          )
          db_job.save_changes
          db_job.to_hash
        end
      end

      private def queue
        return @queue if @queue

        @queue = job.fetch('data', {}).fetch('queue', nil)
        if @queue.nil?
          @queue = assign_queue
          JobBoard.logger.warn(
            'nil queue from scheduler', new: @queue, job: job.fetch('id')
          )
        end

        @queue = @queue.sub(/^builds\./, '')
      end

      private def create_new(job_id: '', site: '', queue_name: '', data: {})
        JobBoard::JobQueue.new(
          queue_name: queue_name,
          site: site
        ).add(
          job_id: job_id
        )

        JobBoard::Models::Job.create(
          data: data,
          job_id: job_id,
          queue: queue_name,
          site: site
        )
      end

      private def assign_queue
        JobBoard::Services::FetchQueue.run(job: job)
      end
    end
  end
end