app/model/command/CreatePillarCommand.scala (48 lines of code) (raw):
package model.command
import com.gu.tagmanagement.{PillarEvent, PillarEventType}
import model._
import play.api.libs.functional.syntax._
import play.api.libs.json.{Format, JsPath}
import repositories._
import CommandError._
import play.api.Logging
import services.KinesisStreams
import scala.concurrent.{Future, ExecutionContext}
case class CreatePillarCommand(
name: String,
path: String,
sectionIds: Seq[String] = Nil) extends Command with Logging {
type T = Pillar
def process()(implicit username: Option[String], ec: ExecutionContext): Future[Option[Pillar]] = {
val pageIdFuture: Future[Long] = Future { try { PathManager.registerPathAndGetPageId(path) } catch {
case p: PathRegistrationFailed => PathInUse
case e: Throwable =>
logger.warn(s"Error using pathmanager for $path: ${e.getMessage}", e)
throw e
}}
val pillarIdFuture = Future{Sequences.pillarId.getNextId}
for {
pageId <- pageIdFuture
pillarId <- pillarIdFuture
} yield {
val pillar = Pillar(
id = pillarId,
name = name,
path = path,
pageId = pageId,
sectionIds = sectionIds
)
val result = PillarRepository.updatePillar(pillar)
KinesisStreams.pillarUpdateStream.publishUpdate(pillar.id.toString, PillarEvent(PillarEventType.Update, pillar.id, Some(Pillar.asThrift(pillar))))
PillarAuditRepository.upsertPillarAudit(PillarAudit.created(pillar))
result
}
}
}
object CreatePillarCommand {
implicit val createPillarCommandFormat: Format[CreatePillarCommand] = (
(JsPath \ "name").format[String] and
(JsPath \ "path").format[String] and
(JsPath \ "sectionIds").format[Seq[String]]
)(CreatePillarCommand.apply, unlift(CreatePillarCommand.unapply))
}