app/services/actors/creation/CreateProjectEntry.scala (94 lines of code) (raw):
package services.actors.creation
import java.time.ZonedDateTime
import javax.inject.{Inject, Named}
import akka.actor.ActorRef
import exceptions.PostrunActionError
import models.messages.NewProjectCreated
import models.{PlutoCommission, ProjectEntry, ProjectTemplate, ProjectType}
import org.slf4j.MDC
import play.api.db.slick.DatabaseConfigProvider
import slick.jdbc.JdbcProfile
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
import scala.util.{Failure, Success, Try}
class CreateProjectEntry @Inject() (dbConfigProvider:DatabaseConfigProvider) extends GenericCreationActor {
override val persistenceId = "creation-project-entry-actor-" + self.path.name
import GenericCreationActor._
private implicit val db=dbConfigProvider.get[JdbcProfile].db
def validateNewProjectRequest(createRequest:NewProjectRequest):Try[NewProjectRequest] = {
if(createRequest.data.destFileEntry.isDefined &&
createRequest.data.destFileEntry.get.hasContent &&
createRequest.data.createdProjectEntry.isEmpty)
Success(createRequest)
else
Failure(new RuntimeException(s"New project request failed to validate"))
}
def validateRollbackRequest(createRequest:NewProjectRollback):Try[NewProjectRollback] = {
if(createRequest.data.destFileEntry.isDefined &&
createRequest.data.destFileEntry.get.hasContent &&
createRequest.data.createdProjectEntry.isDefined)
Success(createRequest)
else
Failure(new RuntimeException(s"Rollback request failed to validate"))
}
override def receive: Receive = {
/**
* create a [[ProjectEntry]] record for the given creation request
*/
case createRequest:NewProjectRequest=>
doPersistedAsync(createRequest) { (msg, originalSender)=>
MDC.put("createRequest", createRequest.toString)
MDC.put("originalSender", originalSender.toString())
logger.debug("persisted create project entry request event to journal, now performing")
validateNewProjectRequest(createRequest) match {
case Success(validatedRequest) =>
val writtenFile = createRequest.data.destFileEntry.get
val rq = createRequest.rq
val createTime = createRequest.createTime
logger.info(s"Creating new project entry from $writtenFile")
ProjectEntry
.createFromFile(writtenFile, rq.projectTemplate, rq.title, createTime, rq.user.toLowerCase(), rq.workingGroupId, rq.commissionId, rq.existingVidispineId, rq.deletable, rq.deep_archive, rq.sensitive, rq.productionOffice, rq.obitProject, false)
.map({
case Success(createdProjectEntry) =>
logger.info(s"Project entry created as id ${createdProjectEntry.id}")
originalSender ! StepSucceded(updatedData = createRequest.data.copy(createdProjectEntry = Some(createdProjectEntry)))
Success(rq.projectTemplate)
case Failure(error) =>
logger.error("Could not create project file: ", error)
originalSender ! StepFailed(createRequest.data, error)
Success("Could not create project file: ")
})
case Failure(validationError) =>
logger.error("Can't execute CreateProjectEntry", validationError)
originalSender ! StepFailed(createRequest.data, validationError)
Future(Success(validationError.toString))
}
}
/**
* Remove the [[ProjectEntry]] record associated with the given rollback request
*/
case rollbackRequest:NewProjectRollback=>
doPersistedAsync(rollbackRequest) { (msg, originalSender)=>
MDC.put("rollbackRequest", rollbackRequest.toString)
MDC.put("originalSender", originalSender.toString())
validateRollbackRequest(rollbackRequest) match {
case Success(validatedRequest) =>
rollbackRequest.data.createdProjectEntry match {
case Some(createdProjectEntry) =>
logger.info(s"Rolling back created project file entry $createdProjectEntry, deleting it from database")
createdProjectEntry.removeFromDatabase.map({
case Success(_) =>
originalSender ! StepSucceded(rollbackRequest.data.copy(createdProjectEntry = None))
case Failure(error) =>
originalSender ! StepFailed(rollbackRequest.data, error)
})
case None =>
logger.error("No project entry present in request so I can't delete")
val exc = new RuntimeException("No project entry present in request so I can't delete")
originalSender ! StepFailed(rollbackRequest.data, exc)
Future(Failure(exc))
}
case Failure(validationError) =>
logger.error("Can't rollback CreateProjectEntry", validationError)
originalSender ! StepFailed(rollbackRequest.data, validationError)
Future(Failure(validationError))
}
}
case _=>
super.receive
}
}