usage/app/model/UsageRecord.scala (87 lines of code) (raw):

package model import com.amazonaws.services.dynamodbv2.xspec.{ExpressionSpecBuilder, UpdateItemExpressionSpec} import com.amazonaws.services.dynamodbv2.xspec.ExpressionSpecBuilder.{M, N, S} import com.gu.mediaservice.model.usage._ import scala.jdk.CollectionConverters._ import org.joda.time.DateTime sealed trait DateRemovedOperation case object ClearDateRemoved extends DateRemovedOperation case object LeaveDateRemovedUntouched extends DateRemovedOperation case class SetDateRemoved(dateRemoved: DateTime) extends DateRemovedOperation case class UsageRecord( hashKey: String, rangeKey: String, dateRemovedOperation: DateRemovedOperation, mediaId: Option[String] = None, usageType: Option[UsageType] = None, mediaType: Option[String] = None, lastModified: Option[DateTime] = None, usageStatus: Option[String] = None, printUsageMetadata: Option[PrintUsageMetadata] = None, digitalUsageMetadata: Option[DigitalUsageMetadata] = None, syndicationUsageMetadata: Option[SyndicationUsageMetadata] = None, frontUsageMetadata: Option[FrontUsageMetadata] = None, downloadUsageMetadata: Option[DownloadUsageMetadata] = None, dateAdded: Option[DateTime] = None ) { def toXSpec: UpdateItemExpressionSpec = { val specBuilder = new ExpressionSpecBuilder List( mediaId.filter(_.nonEmpty).map(S("media_id").set(_)), usageType.map(usageType => S("usage_type").set(usageType.toString)), mediaType.filter(_.nonEmpty).map(S("media_type").set(_)), lastModified.map(lastMod => N("last_modified").set(lastMod.getMillis)), usageStatus.filter(_.nonEmpty).map(S("usage_status").set(_)), printUsageMetadata.map(_.toMap).map(map => M("print_metadata").set(map.asJava)), digitalUsageMetadata.map(_.toMap).map(map => M("digital_metadata").set(map.asJava)), syndicationUsageMetadata.map(_.toMap).map(map => M("syndication_metadata").set(map.asJava)), frontUsageMetadata.map(_.toMap).map(map => M("front_metadata").set(map.asJava)), downloadUsageMetadata.map(_.toMap).map(map => M("download_metadata").set(map.asJava)), dateAdded.map(dateAdd => N("date_added").set(dateAdd.getMillis)), dateRemovedOperation match { case ClearDateRemoved => Some(N("date_removed").remove) case LeaveDateRemovedUntouched => None case SetDateRemoved(dateRemoved) => Some(N("date_removed").set(dateRemoved.getMillis)) } ).flatten.foreach(specBuilder.addUpdate) specBuilder.buildForUpdate } } object UsageRecord { def buildMarkAsRemovedRecord(mediaUsage: MediaUsage) = UsageRecord( hashKey = mediaUsage.grouping, rangeKey = mediaUsage.usageId.toString, dateRemovedOperation = SetDateRemoved(mediaUsage.lastModified) ) def buildUpdateRecord(mediaUsage: MediaUsage) = UsageRecord( hashKey = mediaUsage.grouping, rangeKey = mediaUsage.usageId.toString, dateRemovedOperation = LeaveDateRemovedUntouched, mediaId = Some(mediaUsage.mediaId), usageType = Some(mediaUsage.usageType), mediaType = Some(mediaUsage.mediaType), lastModified = Some(mediaUsage.lastModified), usageStatus = Some(mediaUsage.status.toString), printUsageMetadata = mediaUsage.printUsageMetadata, digitalUsageMetadata = mediaUsage.digitalUsageMetadata, syndicationUsageMetadata = mediaUsage.syndicationUsageMetadata, frontUsageMetadata = mediaUsage.frontUsageMetadata, downloadUsageMetadata = mediaUsage.downloadUsageMetadata ) def buildCreateRecord(mediaUsage: MediaUsage) = UsageRecord( hashKey = mediaUsage.grouping, rangeKey = mediaUsage.usageId.toString, dateRemovedOperation = ClearDateRemoved, mediaId = Some(mediaUsage.mediaId), usageType = Some(mediaUsage.usageType), mediaType = Some(mediaUsage.mediaType), lastModified = Some(mediaUsage.lastModified), usageStatus = Some(mediaUsage.status.toString), printUsageMetadata = mediaUsage.printUsageMetadata, digitalUsageMetadata = mediaUsage.digitalUsageMetadata, syndicationUsageMetadata = mediaUsage.syndicationUsageMetadata, frontUsageMetadata = mediaUsage.frontUsageMetadata, downloadUsageMetadata = mediaUsage.downloadUsageMetadata, dateAdded = Some(mediaUsage.lastModified), ) }