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

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

The newest version!
package im.actor.api.rpc

import akka.actor._
import akka.http.scaladsl.util.FastFuture
import cats.data.Xor
import im.actor.api.rpc.CommonRpcErrors.InvalidAccessHash
import im.actor.api.rpc.peers._
import im.actor.server.acl.ACLUtils._
import im.actor.server.db.DbExtension
import im.actor.server.group.GroupErrors.{ GroupAlreadyDeleted, GroupNotFound }
import im.actor.server.user.UserErrors.UserNotFound
import slick.dbio.DBIO

import scala.concurrent.{ ExecutionContext, Future }

object PeerHelpers {

  def withOutPeer[R <: RpcResponse](outPeer: ApiOutPeer)(authorizedAction: ⇒ Future[RpcError Xor R])(
    implicit
    client: AuthorizedClientData,
    system: ActorSystem
  ): Future[RpcError Xor R] = {
    import system.dispatcher
    accessHashCheck(checkOutPeer(outPeer, client.authId), authorizedAction)
  }

  // single
  def withUserOutPeer[R <: RpcResponse](userOutPeer: ApiUserOutPeer)(authorizedAction: ⇒ Future[RpcError Xor R])(
    implicit
    client: AuthorizedClientData,
    system: ActorSystem
  ): Future[RpcError Xor R] = {
    import system.dispatcher
    accessHashCheck(checkUserOutPeer(userOutPeer, client.authId), authorizedAction)
  }

  // single
  def withGroupOutPeer[R <: RpcResponse](groupOutPeer: ApiGroupOutPeer)(authorizedAction: ⇒ Future[RpcError Xor R])(
    implicit
    system: ActorSystem
  ): Future[RpcError Xor R] = {
    import system.dispatcher
    accessHashCheck(checkGroupOutPeer(groupOutPeer), authorizedAction)
  }

  // multiple
  def withUserOutPeers[R <: RpcResponse](userOutPeers: Seq[ApiUserOutPeer])(authorizedAction: ⇒ Future[RpcError Xor R])(
    implicit
    client: AuthorizedClientData,
    system: ActorSystem
  ): Future[RpcError Xor R] = {
    import system.dispatcher
    accessHashCheck(checkUserOutPeers(userOutPeers, client.authId), authorizedAction)
  }

  // multiple
  def withGroupOutPeers[R <: RpcResponse](groupOutPeers: Seq[ApiGroupOutPeer])(authorizedAction: ⇒ Future[RpcError Xor R])(
    implicit
    system: ActorSystem
  ): Future[RpcError Xor R] = {
    import system.dispatcher
    accessHashCheck(checkGroupOutPeers(groupOutPeers), authorizedAction)
  }

  private def accessHashCheck[R <: RpcResponse](check: Future[Boolean], authorizedAction: ⇒ Future[RpcError Xor R])(implicit ec: ExecutionContext) =
    check flatMap { isValid ⇒
      if (isValid) {
        authorizedAction
      } else {
        FastFuture.successful(Error(InvalidAccessHash))
      }
    } recover {
      case e: Exception ⇒ Error(handleNotFound(e))
    }

  private def handleNotFound: PartialFunction[Throwable, RpcError] = {
    case _: UserNotFound        ⇒ CommonRpcErrors.UserNotFound
    case _: GroupNotFound       ⇒ CommonRpcErrors.GroupNotFound
    case _: GroupAlreadyDeleted ⇒ CommonRpcErrors.GroupDeleted
    case e                      ⇒ throw e
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy