Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
98fa797a05 | ||
|
|
8c0deee2df |
@@ -9,16 +9,10 @@ import play.api.mvc.{AbstractController, ControllerComponents}
|
|||||||
|
|
||||||
import scala.concurrent.{ExecutionContext, Future}
|
import scala.concurrent.{ExecutionContext, Future}
|
||||||
|
|
||||||
|
object SessionsController {
|
||||||
case class LoginData(username: String, password: String)
|
case class LoginData(username: String, password: String)
|
||||||
implicit val loginDataReads: Reads[LoginData] = (
|
given Reads[LoginData] = Json.reads[LoginData]
|
||||||
(JsPath \ "username").read[String] and
|
}
|
||||||
(JsPath \ "password").read[String]
|
|
||||||
)(LoginData.apply)
|
|
||||||
implicit val tokenWrites: Writes[AuthToken] = (token: AuthToken) => Json.obj(
|
|
||||||
"token" -> token.token,
|
|
||||||
"createdAt" -> token.createdAt,
|
|
||||||
"expiresAt" -> token.expiresAt
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
@@ -29,18 +23,24 @@ class SessionsController @Inject()(
|
|||||||
authenticatedAction: AuthenticatedAction)
|
authenticatedAction: AuthenticatedAction)
|
||||||
(implicit val ec: ExecutionContext)
|
(implicit val ec: ExecutionContext)
|
||||||
extends AbstractController(controllerComponents) {
|
extends AbstractController(controllerComponents) {
|
||||||
|
import SessionsController.{LoginData, given}
|
||||||
|
|
||||||
def login() = Action.async(parse.json) { implicit request =>
|
def login() = Action.async(parse.json) { implicit request =>
|
||||||
val loginDataResult = request.body.validate[LoginData]
|
val loginDataResult = request.body.validate[LoginData]
|
||||||
loginDataResult.fold(
|
loginDataResult.fold(
|
||||||
errors => {
|
errors => Future.successful(BadRequest(JsError.toJson(errors))),
|
||||||
Future.successful(BadRequest(Json.obj("message" -> JsError.toJson(errors))))
|
|
||||||
},
|
|
||||||
loginData => {
|
loginData => {
|
||||||
usersDAO.authenticate(loginData.username, loginData.password).flatMap { userOption =>
|
usersDAO.authenticate(loginData.username, loginData.password).flatMap { userOption =>
|
||||||
userOption.fold(
|
userOption.fold(
|
||||||
Future.successful(UnprocessableEntity(Json.obj("message" -> "Invalid authentication")))
|
Future.successful(UnprocessableEntity(Json.obj("message" -> "Invalid authentication")))
|
||||||
){ user =>
|
){ user =>
|
||||||
authTokensDAO.createToken(user).map(token => Ok(Json.toJson(token)))
|
authTokensDAO.createToken(user).map { token =>
|
||||||
|
val json = Json.toJsObject(token) ++ Json.obj(
|
||||||
|
"userId" -> user.id.get,
|
||||||
|
"userGid" -> user.gid
|
||||||
|
)
|
||||||
|
Ok(json)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,6 +15,14 @@ object User {
|
|||||||
}
|
}
|
||||||
|
|
||||||
case class AuthToken(id: Option[Int], userId: Int, token: String, createdAt: Instant, expiresAt: Instant)
|
case class AuthToken(id: Option[Int], userId: Int, token: String, createdAt: Instant, expiresAt: Instant)
|
||||||
|
object AuthToken {
|
||||||
|
given writes: OWrites[AuthToken] = (a: AuthToken) => Json.obj(
|
||||||
|
"token" -> a.token,
|
||||||
|
"userId" -> a.userId,
|
||||||
|
"createdAt" -> a.createdAt,
|
||||||
|
"expiresAt" -> a.expiresAt
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
enum AuctionStatus(val value: Short) {
|
enum AuctionStatus(val value: Short) {
|
||||||
case Created extends AuctionStatus(0)
|
case Created extends AuctionStatus(0)
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
name: 'neon-vertigo-api'
|
name: 'neon-vertigo-api'
|
||||||
|
include:
|
||||||
|
- ../shared/compose.shared.yml
|
||||||
services:
|
services:
|
||||||
db:
|
db:
|
||||||
image: "postgres:18"
|
image: "postgres:18"
|
||||||
|
|||||||
Reference in New Issue
Block a user