def backupProjects()

in app/services/NewProjectBackup.scala [464:507]


  def backupProjects(onlyInProgress:Boolean):Future[BackupResults] = {
    val parallelCopies = config.getOptional[Int]("backup.parallelCopies").getOrElse(1)

    var backupTypes = Array(1,5)
    val backupTypesSequence = config.getOptional[Seq[Int]]("backup_types").getOrElse(None)
    if (backupTypesSequence != None) {
      backupTypes = backupTypesSequence.iterator.toArray
    }

    def getScanSource() = if(onlyInProgress) {
      ProjectEntry.scanProjectsForStatusAndTypes(EntryStatus.InProduction, backupTypes)
    } else {
      ProjectEntry.scanAllProjects
    }

    for {
      drivers <- loadStorageDrivers()
      storages <- loadAllStorages()
      result <- getScanSource()
        .map(p => {
          logger.debug(s"Checking project ${p.projectTitle} for backup")
          p
        })
        .mapAsync(parallelCopies)(p => p.associatedFiles(allVersions = true).map((p, _)))
        .map(projectAndFiles => {
          val p = projectAndFiles._1
          val f = projectAndFiles._2
          val backupsCount = f.count(_.backupOf.isDefined)
          logger.debug(s"Project ${p.projectTitle} has ${f.length} files of which $backupsCount are backups")
          projectAndFiles
        })
        .mapAsync(parallelCopies)(projectAndFiles => conditionalBackup(projectAndFiles, drivers, storages))
        .toMat(Sink.fold(BackupResults.empty(0))((acc, elem) => elem match {
          case Left(errs) =>
            logger.warn(s"Backup failed: ${errs}")
            acc.copy(totalCount = acc.totalCount + 1, failedCount = acc.failedCount + 1)
          case Right(true) =>
            acc.copy(totalCount = acc.totalCount + 1, successCount = acc.successCount + 1)
          case Right(false) =>
            acc.copy(totalCount = acc.totalCount + 1, notNeededCount = acc.notNeededCount + 1)
        }))(Keep.right)
        .run()
    } yield result
  }