Files
api/app/controllers/authentication/AuthenticatedAction.scala
T
2026-09-01 00:42:38 +03:00

41 lines
1.6 KiB
Scala

package controllers.authentication
import dao.AuthTokensDAO
import jakarta.inject.Inject
import models.{AuthToken, User}
import play.api.libs.json.*
import play.api.mvc.Results.Unauthorized
import play.api.mvc.{ActionBuilder, ActionRefiner, AnyContent, BodyParsers, Request, Result, WrappedRequest}
import scala.concurrent.{ExecutionContext, Future}
class AuthenticatedRequest[A](val token: AuthToken, val user: User, request: Request[A]) extends WrappedRequest[A](request)
class AuthenticatedAction @Inject()(val parser: BodyParsers.Default, authTokensDao: AuthTokensDAO)(implicit val executionContext: ExecutionContext)
extends ActionRefiner[Request, AuthenticatedRequest]
with ActionBuilder[AuthenticatedRequest, AnyContent]{
override protected def refine[A](request: Request[A]): Future[Either[Result, AuthenticatedRequest[A]]] = {
val authHeader = request.headers.get("Authorization")
.map(_.split(" ", 2)(1))
.filter(_.nonEmpty)
authHeader match {
case Some(token) =>
authTokensDao.find(token).flatMap {
case Some(authToken) => findUser(request, authToken)
case None => Future.successful(unauthenticatedRequestError)
}
case None => Future.successful(unauthenticatedRequestError)
}
}
private val unauthenticatedRequestError = Left(Unauthorized(Json.obj("error" -> "Unauthenticated")))
private def findUser[A](request: Request[A], token: AuthToken) = {
authTokensDao.getUser(token).map {
case Some(user) => Right(AuthenticatedRequest(token, user, request))
case None => unauthenticatedRequestError
}
}
}