usage/app/lib/UsageNotifier.scala (38 lines of code) (raw):
package lib
import com.gu.mediaservice.lib.aws.{ThrallMessageSender, UpdateMessage}
import com.gu.mediaservice.lib.logging.{GridLogging, LogMarker}
import com.gu.mediaservice.lib.usage.UsageBuilder
import com.gu.mediaservice.model.usage.{MediaUsage, UsageNotice}
import com.gu.mediaservice.syntax.MessageSubjects
import model.UsageTable
import org.joda.time.DateTime
import play.api.libs.json._
import rx.lang.scala.Observable
import scala.concurrent.ExecutionContext.Implicits.global
class UsageNotifier(config: UsageConfig, usageTable: UsageTable)
extends ThrallMessageSender(config.thrallKinesisLowPriorityStreamConfig) with GridLogging with MessageSubjects {
def build(mediaID: String)(implicit logMarker: LogMarker): Observable[UsageNotice] = {
implicit val logMarkerWithId: LogMarker = logMarker + ("image-id" -> mediaID)
logger.info(logMarkerWithId, s"Building usage notice for $mediaID")
Observable.from(
usageTable.queryByImageId(mediaID)(logMarkerWithId).map((dbUsages: List[MediaUsage]) =>
UsageNotice(
mediaID,
Json.toJson(dbUsages.map(UsageBuilder.build)).as[JsArray]
)
)
)
}
def send(usageNoticeWithContext: WithLogMarker[UsageNotice]): LogMarker = {
val usageNotice = usageNoticeWithContext.value
logger.info(usageNoticeWithContext.logMarker, s"Sending usage notice for ${usageNotice.mediaId}")
publish(
UpdateMessage(
subject = UpdateImageUsages,
id = Some(usageNotice.mediaId),
usageNotice = Some(usageNotice)
)
)
usageNoticeWithContext.logMarker
}
}