andela/workdey

View on GitHub
app/jobs/service_assignment_job.rb

Summary

Maintainability
A
0 mins
Test Coverage
class ServiceAssignmentJob < ActiveJob::Base
  queue_as :default

  def perform(service)
    if service.accepted?
      service.service_assignments.last.update_accepted
    elsif service.expired?
      service.unassign
      notify_tasker("service request took too long to be assigned", service)
    elsif ServiceAssignment.assign(service)
      notify_artisan("you have a new service request", service)
      ServiceAssignmentJob.set(wait: 30.minutes).perform_later(service)
    else
      service.unassign
      notify_tasker("there are no artisans to perform your task", service)
    end
  end

  private

  def notify_artisan(message, service)
    Notification.create(
      message: message,
      sender_id: service.tasker_id,
      receiver_id: service.artisan_id,
      notifiable_id: service.id,
      notifiable_type: "Service"
    )
  end

  def notify_tasker(message, service)
    Notification.create(
      message: message,
      sender_id: service.tasker.id,
      receiver_id: service.tasker.id,
      notifiable_id: service.id,
      notifiable_type: "Service"
    )
  end
end