app/controllers/CampaignsController.scala (65 lines of code) (raw):
package controllers
import com.gu.googleauth.AuthAction
import com.typesafe.scalalogging.LazyLogging
import io.circe.syntax._
import models.Campaign
import models.Campaigns._
import models.ChannelTest.channelTestEncoder
import models.DynamoErrors._
import play.api.libs.circe.Circe
import play.api.mvc._
import services.{DynamoCampaigns, DynamoChannelTests}
import utils.Circe.noNulls
import zio.{IO, ZEnv, ZIO}
import scala.concurrent.{ExecutionContext, Future}
class CampaignsController(
authAction: ActionBuilder[AuthAction.UserIdentityRequest, AnyContent],
components: ControllerComponents,
stage: String,
runtime: zio.Runtime[ZEnv],
dynamoChannelTests: DynamoChannelTests,
dynamoCampaigns: DynamoCampaigns
)(implicit ec: ExecutionContext)
extends AbstractController(components) with Circe with LazyLogging{
private def run(f: => ZIO[ZEnv, Throwable, Result]): Future[Result] =
runtime.unsafeRunToFuture {
f.catchAll(error => {
logger.error(s"Returning InternalServerError to client: ${error.getMessage}", error)
IO.succeed(InternalServerError(error.getMessage))
})
}
def get(): Action[AnyContent] = authAction.async { request =>
run {
dynamoCampaigns.getAllCampaigns()
.map(campaigns => Ok(noNulls(campaigns.asJson)))
}
}
def createCampaign: Action[Campaign] = authAction.async(circe.json[Campaign]) { request =>
run {
val campaign = request.body
logger.info(s"${request.user.email} is creating campaign '${campaign.name}'")
dynamoCampaigns
.createCampaign(campaign)
.map(_ => Ok("created"))
.catchSome { case DynamoDuplicateNameError(error) =>
logger.warn(s"Failed to create '${campaign.name}' because name already exists: ${error.getMessage}")
IO.succeed(BadRequest(s"Cannot create campaign '${campaign.name}' because it already exists. Please use a different name"))
}
}
}
def updateCampaign: Action[Campaign] = authAction.async(circe.json[Campaign]) { request =>
run {
val campaign = request.body
logger.info(s"${request.user.email} is updating campaign '${campaign.name}'")
dynamoCampaigns
.updateCampaign(campaign)
.map(_ => Ok("updated"))
}
}
def getTests(campaignName: String): Action[AnyContent] = authAction.async { request =>
run {
dynamoChannelTests.getAllTestsInCampaign(campaignName)
.map(tests => Ok(noNulls(tests.asJson)))
}
}
}