Compare commits

...
2 Commits
Author SHA1 Message Date
artemis 98fa797a05 Added Artemis to compose.yaml 2026-09-13 00:37:40 +03:00
artemis 8c0deee2df Small refactoring of the sessions controller 2026-09-13 00:37:27 +03:00
3 changed files with 24 additions and 14 deletions
@@ -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)
}
} }
} }
} }
+8
View File
@@ -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)
+2
View File
@@ -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"