admin/app/tools/Store.scala (102 lines of code) (raw):
package tools
import common.GuLogging
import common.dfp._
import conf.Configuration.commercial._
import conf.{AdminConfiguration, Configuration}
import implicits.Dates
import org.joda.time.DateTime
import play.api.libs.json.{JsError, JsSuccess, Json}
import play.api.libs.json.Json.toJson
import services.S3
trait Store extends GuLogging with Dates {
lazy val switchesKey = Configuration.switches.key
lazy val topStoriesKey = AdminConfiguration.topStoriesKey
final val defaultJsonEncoding: String = "application/json;charset=utf-8"
def getSwitches: Option[String] = S3.get(switchesKey)
def getSwitchesWithLastModified: Option[(String, DateTime)] = S3.getWithLastModified(switchesKey)
def getSwitchesLastModified: Option[DateTime] = S3.getLastModified(switchesKey)
def putSwitches(config: String): Unit = { S3.putPrivate(switchesKey, config, "text/plain") }
def getTopStories: Option[String] = S3.get(topStoriesKey)
def putTopStories(config: String): Unit = { S3.putPublic(topStoriesKey, config, "application/json") }
def putLiveBlogTopSponsorships(sponsorshipsJson: String): Unit = {
S3.putPrivate(dfpLiveBlogTopSponsorshipDataKey, sponsorshipsJson, defaultJsonEncoding)
}
def putSurveySponsorships(adUnitJson: String): Unit = {
S3.putPrivate(dfpSurveySponsorshipDataKey, adUnitJson, defaultJsonEncoding)
}
def putDfpPageSkinAdUnits(adUnitJson: String): Unit = {
S3.putPrivate(dfpPageSkinnedAdUnitsKey, adUnitJson, defaultJsonEncoding)
}
def putDfpLineItemsReport(everything: String): Unit = {
S3.putPrivate(dfpLineItemsKey, everything, defaultJsonEncoding)
}
def putDfpAdUnitList(filename: String, adUnits: String): Unit = {
S3.putPrivate(filename, adUnits, "text/plain")
}
def putDfpTemplateCreatives(creatives: String): Unit = {
S3.putPrivate(dfpTemplateCreativesKey, creatives, defaultJsonEncoding)
}
def putDfpCustomTargetingKeyValues(keyValues: String): Unit = {
S3.putPrivate(dfpCustomTargetingKey, keyValues, defaultJsonEncoding)
}
def putNonRefreshableLineItemIds(lineItemIds: Seq[Long]): Unit = {
S3.putPrivate(dfpNonRefreshableLineItemIdsKey, Json.stringify(toJson(lineItemIds)), defaultJsonEncoding)
}
val now: String = DateTime.now().toHttpDateTimeString
def getDfpPageSkinnedAdUnits(): PageSkinSponsorshipReport =
S3.get(dfpPageSkinnedAdUnitsKey).flatMap(PageSkinSponsorshipReportParser(_)) getOrElse PageSkinSponsorshipReport(
now,
Nil,
)
def getDfpLiveBlogTagsReport(): LiveBlogTopSponsorshipReport = {
S3.get(dfpLiveBlogTopSponsorshipDataKey) flatMap (LiveBlogTopSponsorshipReportParser(
_,
)) getOrElse LiveBlogTopSponsorshipReport(
None,
Nil,
)
}
def getDfpSurveyAdUnits(): SurveySponsorshipReport = {
S3.get(dfpSurveySponsorshipDataKey) flatMap (SurveySponsorshipReportParser(
_,
)) getOrElse SurveySponsorshipReport(
None,
Nil,
)
}
def getDfpLineItemsReport(): LineItemReport = {
val maybeLineItems = for {
json <- S3.get(dfpLineItemsKey)
lineItemReport <- Json.parse(json).asOpt[LineItemReport]
} yield lineItemReport
maybeLineItems getOrElse LineItemReport("Empty Report", Nil, Nil)
}
def getDfpTemplateCreatives: Seq[GuCreative] = {
val creatives = for (doc <- S3.get(dfpTemplateCreativesKey)) yield {
Json.parse(doc).as[Seq[GuCreative]]
}
creatives getOrElse Nil
}
def getDfpCustomTargetingKeyValues: Seq[GuCustomTargeting] = {
val targeting = for (doc <- S3.get(dfpCustomTargetingKey)) yield {
val json = Json.parse(doc)
json.validate[Seq[GuCustomTargeting]] match {
case s: JsSuccess[Seq[GuCustomTargeting]] => s.get.sortBy(_.name)
case e: JsError => log.error("Errors: " + JsError.toJson(e).toString()); Nil
}
}
targeting getOrElse Nil
}
object commercial {
def getTakeoversWithEmptyMPUs(): Seq[TakeoverWithEmptyMPUs] = {
S3.get(takeoversWithEmptyMPUsKey) map {
Json.parse(_).as[Seq[TakeoverWithEmptyMPUs]]
} getOrElse Nil
}
def putTakeoversWithEmptyMPUs(takeovers: Seq[TakeoverWithEmptyMPUs]): Unit = {
val content = Json.stringify(toJson(takeovers))
S3.putPrivate(takeoversWithEmptyMPUsKey, content, "application/json")
}
}
}
object Store extends Store