diff --git a/app/controllers/authentication/SessionsController.scala b/app/controllers/authentication/SessionsController.scala index 799d540..94210a2 100644 --- a/app/controllers/authentication/SessionsController.scala +++ b/app/controllers/authentication/SessionsController.scala @@ -9,16 +9,10 @@ import play.api.mvc.{AbstractController, ControllerComponents} import scala.concurrent.{ExecutionContext, Future} -case class LoginData(username: String, password: String) -implicit val loginDataReads: 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 -) +object SessionsController { + case class LoginData(username: String, password: String) + given Reads[LoginData] = Json.reads[LoginData] +} @Singleton @@ -29,18 +23,24 @@ class SessionsController @Inject()( authenticatedAction: AuthenticatedAction) (implicit val ec: ExecutionContext) extends AbstractController(controllerComponents) { + import SessionsController.{LoginData, given} + def login() = Action.async(parse.json) { implicit request => val loginDataResult = request.body.validate[LoginData] loginDataResult.fold( - errors => { - Future.successful(BadRequest(Json.obj("message" -> JsError.toJson(errors)))) - }, + errors => Future.successful(BadRequest(JsError.toJson(errors))), loginData => { usersDAO.authenticate(loginData.username, loginData.password).flatMap { userOption => userOption.fold( Future.successful(UnprocessableEntity(Json.obj("message" -> "Invalid authentication"))) ){ 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) + } } } } diff --git a/app/models/models.scala b/app/models/models.scala index 6a5c429..891a0e0 100644 --- a/app/models/models.scala +++ b/app/models/models.scala @@ -15,6 +15,14 @@ object User { } 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) { case Created extends AuctionStatus(0)