app/controllers/CampaignController.scala (44 lines of code) (raw):
package controllers
import actions.GoogleAuthAction.GoogleAuthenticatedAction
import com.gu.memsub.promo.Formatters.CampaignFormatters._
import com.gu.memsub.promo.Promotion.AnyPromotion
import com.gu.memsub.promo.{Campaign, CampaignCode, CampaignGroup}
import com.gu.memsub.services.JsonDynamoService
import utils.CampaignUtils.{filterCampaignsByOptionalGroup, sortCampaignsByPromotionDateThenNameForDisplay}
import play.api.libs.json.{JsError, Json}
import play.api.mvc.Result
import play.api.mvc.Results._
import wiring.AppComponents.Stage
import scala.concurrent.{ExecutionContext, Future}
class CampaignController(googleAuthAction: GoogleAuthenticatedAction, campaignService: JsonDynamoService[Campaign, Future], promotionService: JsonDynamoService[AnyPromotion, Future], stage: Stage, implicit val ec: ExecutionContext) {
def all(group: Option[String]) = googleAuthAction.async {
import com.gu.memsub.promo.Formatters.PromotionFormatters._
val campaignsF = campaignService.all
val promotionsF = promotionService.all
for {
campaigns <- campaignsF
promotions <- promotionsF
} yield {
val filtered = filterCampaignsByOptionalGroup(group.flatMap(CampaignGroup.fromId), campaigns)
val campaignsSortedByDateThenName = sortCampaignsByPromotionDateThenNameForDisplay(filtered, promotions)
Ok(Json.toJson(campaignsSortedByDateThenName))
}
}
def get(code: Option[String]) = googleAuthAction.async {
code.map(CampaignCode).map(c => campaignService.find(c)).fold[Future[Result]](Future.successful(BadRequest)) { campaigns =>
campaigns.map(_.headOption.fold[Result](NotFound)(c => Ok(Json.toJson(c))))
}
}
def upsert = googleAuthAction.async { request =>
request.body.asJson.map { json =>
json.validate[Campaign].map { campaign => {
campaignService.add(campaign).map(_ => Ok(Json.obj("status" -> "ok")))
}
}.recoverTotal{
e => Future(BadRequest("Detected error:"+ JsError.toJson(e)))
}
}.getOrElse {
Future(BadRequest("Could not parse campaign data"))
}
}
}