in app/controllers/ProjectEntryController.scala [1197:1265]
def restoreAssetFolderBackup(requestedId: Int) = IsAuthenticatedAsync {uid=>{request=>
implicit val db = dbConfig.db
selectid(requestedId).flatMap({
case Failure(error)=>
logger.error(s"Could not restore files for project ${requestedId}",error)
Future(InternalServerError(Json.obj("status"->"error","detail"->error.toString)))
case Success(someSeq)=>
someSeq.headOption match {
case Some(projectEntry)=>
db.run(
TableQuery[ProjectMetadataRow]
.filter(_.key===ProjectMetadata.ASSET_FOLDER_KEY)
.filter(_.projectRef===requestedId)
.result
).map(results=>{
val resultCount = results.length
if(resultCount==0){
logger.warn(s"No asset folder registered under project id $requestedId")
} else if(resultCount>1){
logger.warn(s"Multiple asset folders found for project $requestedId: $results")
} else {
logger.debug(s"Found this data: ${results.head}")
logger.debug(s"Found this asset folder: ${results.head.value.get}")
deleteRecursively(new File(s"${results.head.value.get}/RestoredProjectFiles"))
new File(s"${results.head.value.get}/RestoredProjectFiles").mkdirs()
val fileData = for {
f2 <- projectEntry.associatedAssetFolderFiles(false, implicitConfig).map(fileList=>fileList)
} yield (f2)
val fileEntryData = Await.result(fileData, Duration(10, TimeUnit.SECONDS))
logger.debug(s"File data found: $fileEntryData")
val splitterRegex = "^(?:[^\\/]*\\/){4}".r
val filenameRegex = "([^\\/]+$)".r
fileEntryData.map(fileData => {
Thread.sleep(100)
new File(s"${config.get[String]("postrun.assetFolder.basePath")}/${splitterRegex.findFirstIn(fileData.filepath).get}RestoredProjectFiles/${filenameRegex.replaceFirstIn(splitterRegex.replaceFirstIn(fileData.filepath,""),"")}").mkdirs()
val timestamp = dateTimeToTimestamp(ZonedDateTime.now())
if (new File(s"${config.get[String]("postrun.assetFolder.basePath")}/${splitterRegex.findFirstIn(fileData.filepath).get}RestoredProjectFiles/${splitterRegex.replaceFirstIn(fileData.filepath,"")}").exists()) {
var space_not_found = true
var number_to_try = 1
while (space_not_found) {
val pathToWorkOn = splitterRegex.replaceFirstIn(fileData.filepath,"")
val indexOfPoint = pathToWorkOn.lastIndexOf(".")
val readyPath = s"${pathToWorkOn.substring(0, indexOfPoint)}_$number_to_try${pathToWorkOn.substring(indexOfPoint)}"
if (new File(s"${config.get[String]("postrun.assetFolder.basePath")}/${splitterRegex.findFirstIn(fileData.filepath).get}RestoredProjectFiles/$readyPath").exists()) {
number_to_try = number_to_try + 1
} else {
space_not_found = false
val fileToSave = AssetFolderFileEntry(None, s"${splitterRegex.findFirstIn(fileData.filepath).get}RestoredProjectFiles/$readyPath", config.get[Int]("asset_folder_storage"), 1, timestamp, timestamp, timestamp, None, None)
storageHelper.copyAssetFolderFile(fileData, fileToSave)
}
}
} else {
val fileToSave = AssetFolderFileEntry(None, s"${splitterRegex.findFirstIn(fileData.filepath).get}RestoredProjectFiles/${splitterRegex.replaceFirstIn(fileData.filepath, "")}", config.get[Int]("asset_folder_storage"), 1, timestamp, timestamp, timestamp, None, None)
storageHelper.copyAssetFolderFile(fileData, fileToSave)
}
}
)
}
}).recover({
case err: Throwable =>
logger.error(s"Could not look up asset folder for project id $requestedId: ", err)
})
Future(Ok(Json.obj("status"->"okay","detail"->s"Restored files for project $requestedId")))
case None=>
Future(NotFound(Json.obj("status"->"error","detail"->s"Project $requestedId not found")))
}
})
}}