All Downloads are FREE. Search and download functionalities are using the official Maven repository.

im.actor.api.rpc.FileHelpers.scala Maven / Gradle / Ivy

There is a newer version: 3.0.0
Show newest version
package im.actor.api.rpc

import im.actor.server.acl.ACLUtils

import scala.concurrent.ExecutionContext
import scalaz.\/

import akka.actor.ActorSystem
import slick.dbio.DBIO

import im.actor.api.rpc.files.ApiFileLocation
import im.actor.server.persist

object FileHelpers {

  // TODO: move file checks into FileUtils
  object Errors {
    val FileNotFound = RpcError(404, "FILE_NOT_FOUND", "File not found.", false, None)
    val FileTooLarge = RpcError(400, "FILE_TOO_LARGE", "File is too large.", false, None)
    val LocationInvalid = RpcError(400, "LOCATION_INVALID", "", false, None)
  }

  def withFileLocation[R <: RpcResponse](fileLocation: ApiFileLocation, maxSize: Long)(f: ⇒ DBIO[RpcError \/ R])(implicit ec: ExecutionContext, s: ActorSystem) = {
    persist.FileRepo.find(fileLocation.fileId) flatMap {
      case Some(file) ⇒
        if (!file.isUploaded) {
          DBIO.successful(Error(Errors.LocationInvalid))
        } else if (file.size > maxSize) {
          DBIO.successful(Error(Errors.FileTooLarge))
        } else if (ACLUtils.fileAccessHash(file.id, file.accessSalt) != fileLocation.accessHash) {
          DBIO.successful(Error(Errors.LocationInvalid))
        } else {
          f
        }
      case None ⇒ DBIO.successful(Error(Errors.FileNotFound))
    }
  }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy