app/com/gu/floodgate/reindex/ProgressTrackerController.scala (43 lines of code) (raw):

package com.gu.floodgate.reindex import org.apache.pekko.actor.{Actor, ActorLogging, ActorRef, Props} import com.gu.floodgate.contentsource.ContentSource import com.gu.floodgate.jobhistory.JobHistoryService import com.gu.floodgate.reindex.ProgressTracker.{Cancel, TrackProgress} import com.gu.floodgate.reindex.ProgressTrackerController.{LaunchTracker, RemoveTracker} import com.gu.floodgate.runningjob.{RunningJob, RunningJobService} import com.typesafe.scalalogging.StrictLogging import play.api.libs.ws.WSClient object ProgressTrackerController { def props(ws: WSClient, runningJobService: RunningJobService, jobHistoryService: JobHistoryService) = Props(new ProgressTrackerController(ws: WSClient, runningJobService: RunningJobService, jobHistoryService)) case class LaunchTracker(contentSource: ContentSource, runningJob: RunningJob) case class RemoveTracker(contentSource: ContentSource, runningJob: RunningJob) } class ProgressTrackerController( ws: WSClient, runningJobService: RunningJobService, jobHistoryService: JobHistoryService ) extends Actor with ActorLogging with StrictLogging { private var runningTrackers: Map[String, ActorRef] = Map.empty[String, ActorRef] def receive = { case LaunchTracker(contentSource, runningJob) => add(contentSource, runningJob) case RemoveTracker(contentSource, runningJob) => remove(contentSource, runningJob) } private def remove(contentSource: ContentSource, runningJob: RunningJob): Unit = { runningTrackers.get(contentSource.uniqueId).foreach { case tracker => tracker ! Cancel(contentSource, runningJob) runningTrackers = runningTrackers - contentSource.uniqueId } } private def add(contentSource: ContentSource, runningJob: RunningJob): Unit = { val tracker = context.system.actorOf( ProgressTracker.props(ws, runningJobService, jobHistoryService), s"progress-tracker-${contentSource.uniqueId}" ) tracker ! TrackProgress(contentSource, runningJob) runningTrackers = runningTrackers + (contentSource.uniqueId -> tracker) } }