in app/controllers/PremiereVersionConverter.scala [35:85]
def changeVersion(projectFileId:Int, requiredDisplayVersion:String) = IsAuthenticatedAsync { uid=> request=>
DisplayedVersion(requiredDisplayVersion) match {
case None=>
Future(BadRequest(Json.obj("status"->"bad_request","detail"->"invalid version number")))
case Some(newVersion)=>
val resultFut = for {
targetVersion <- premiereVersionTranslationDAO
.findDisplayedVersionByMajor(newVersion.major)
.flatMap(results=>{
if(results.isEmpty) {
Future.failed(new RuntimeException("Version number is not recognised"))
} else {
logger.info(s"Target version is ${results.head}")
Future(results.head)
}
})
projectFile <- fileEntryDAO.entryFor(projectFileId).flatMap({
case None=>Future.failed(new RuntimeException(s"project id $projectFileId does not exist"))
case Some(f)=>Future(f)
})
projectFileJavaIO <- fileEntryDAO.getJavaPath(projectFile)
_ <- converter.checkExistingVersion(projectFile, targetVersion) //breaks the chain if the versions are both the same
backupFile <- converter.backupFile(projectFile)
//.get is safe here because if it is None then `checkExistingVersion` will have failed the job
_ <- converter
.tweakProjectVersionStreaming(projectFileJavaIO, backupFile, projectFile.maybePremiereVersion.get, targetVersion)
.recoverWith({
case err:Throwable=>
logger.error(s"Could not update $projectFile, restoring backup: ${err.getMessage}", err)
converter
.restoreFromBackup(backupFile, projectFile)
.flatMap(_=>{
logger.error(s"Restore of backup completed")
Future.failed(err)
})
})
updatedProjectFile <- fileEntryDAO.saveSimple(projectFile.copy(maybePremiereVersion = Some(targetVersion.internalVersionNumber)))
} yield (updatedProjectFile, projectFile)
resultFut
.map(afterAndBefore=>{
logger.info(s"Project file ${afterAndBefore._1.filepath} has been updated to internal version number ${afterAndBefore._1.maybePremiereVersion} from ${afterAndBefore._2.maybePremiereVersion}")
Ok(Json.obj("status"->"ok", "detail"->"Project updated", "entry"->afterAndBefore._1))
})
.recover({
case err:Throwable=>
logger.error(s"Could not update project file to version $newVersion: ${err.getClass.getCanonicalName} ${err.getMessage}", err)
BadRequest(Json.obj("status"->"error", "detail"->err.getMessage))
})
}
}