feat: BAC-27 Implemented endpoint which returns information about the current state (#103)
Reviewed-on: #103 Reviewed-by: lq64 <lq@blackhole.local> Co-authored-by: Janis <janis.e.20@gmx.de> Co-committed-by: Janis <janis.e.20@gmx.de>
This commit is contained in:
Submodule knockoutwhistfrontend updated: 5d080bba47...a04c370a75
94
knockoutwhistweb/app/controllers/StatusController.scala
Normal file
94
knockoutwhistweb/app/controllers/StatusController.scala
Normal file
@@ -0,0 +1,94 @@
|
||||
package controllers
|
||||
|
||||
import auth.AuthAction
|
||||
import logic.PodManager
|
||||
import logic.game.GameLobby
|
||||
import logic.user.SessionManager
|
||||
import model.users.User
|
||||
import play.api.libs.json.{JsValue, Json}
|
||||
import play.api.mvc.*
|
||||
import util.WebsocketEventMapper
|
||||
|
||||
import javax.inject.Inject
|
||||
|
||||
class StatusController @Inject()(
|
||||
val controllerComponents: ControllerComponents,
|
||||
val sessionManager: SessionManager,
|
||||
val authAction: AuthAction
|
||||
) extends BaseController {
|
||||
|
||||
def requestStatus(): Action[AnyContent] = {
|
||||
Action { implicit request =>
|
||||
val userOpt = getUserFromSession(request)
|
||||
if (userOpt.isEmpty) {
|
||||
Ok(
|
||||
Json.obj(
|
||||
"status" -> "unauthenticated"
|
||||
)
|
||||
)
|
||||
} else {
|
||||
val user = userOpt.get
|
||||
val gameOpt = PodManager.identifyGameOfUser(user)
|
||||
if (gameOpt.isEmpty) {
|
||||
Ok(
|
||||
Json.obj(
|
||||
"status" -> "authenticated",
|
||||
"username" -> user.name,
|
||||
"inGame" -> "false"
|
||||
)
|
||||
)
|
||||
} else {
|
||||
val game = gameOpt.get
|
||||
Ok(
|
||||
Json.obj(
|
||||
"status" -> "authenticated",
|
||||
"username" -> user.name,
|
||||
"inGame" -> "true",
|
||||
"gameId" -> game.id
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
def game(gameId: String): Action[AnyContent] = {
|
||||
Action { implicit request =>
|
||||
val userOpt = getUserFromSession(request)
|
||||
if (userOpt.isEmpty) {
|
||||
Unauthorized("User not authenticated")
|
||||
} else {
|
||||
val user = userOpt.get
|
||||
val gameOpt = PodManager.getGame(gameId)
|
||||
if (gameOpt.isEmpty) {
|
||||
NotFound("Game not found")
|
||||
} else {
|
||||
val game = gameOpt.get
|
||||
if (!game.getPlayers.contains(user.id)) {
|
||||
Forbidden("User not part of this game")
|
||||
} else {
|
||||
Ok(
|
||||
Json.obj(
|
||||
"gameId" -> game.id,
|
||||
"state" -> game.logic.getCurrentState.toString,
|
||||
"data" -> mapGameState(game, user)
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}}
|
||||
|
||||
private def getUserFromSession(request: RequestHeader): Option[User] = {
|
||||
val session = request.cookies.get("sessionId")
|
||||
if (session.isDefined)
|
||||
return sessionManager.getUserBySession(session.get.value)
|
||||
None
|
||||
}
|
||||
|
||||
private def mapGameState(gameLobby: GameLobby, user: User): JsValue = {
|
||||
val userSession = gameLobby.getUserSession(user.id)
|
||||
WebsocketEventMapper.stateToJson(userSession)
|
||||
}
|
||||
|
||||
}
|
||||
@@ -57,12 +57,12 @@ object WebsocketEventMapper {
|
||||
Json.obj(
|
||||
"id" -> ("request-" + java.util.UUID.randomUUID().toString),
|
||||
"event" -> obj.id,
|
||||
"state" -> toJson(session),
|
||||
"state" -> stateToJson(session),
|
||||
"data" -> data
|
||||
)
|
||||
}
|
||||
|
||||
def toJson(session: UserSession): JsValue = {
|
||||
def stateToJson(session: UserSession): JsValue = {
|
||||
session.gameLobby.getLogic.getCurrentState match {
|
||||
case Lobby => Json.toJson(LobbyInfoDTO(session.gameLobby, session.user))
|
||||
case InGame => Json.toJson(GameInfoDTO(session.gameLobby, session.user))
|
||||
|
||||
@@ -27,4 +27,8 @@ GET /logout controllers.UserController.logout()
|
||||
GET /game/:id controllers.IngameController.game(id: String)
|
||||
|
||||
# Websocket
|
||||
GET /websocket controllers.WebsocketController.socket()
|
||||
GET /websocket controllers.WebsocketController.socket()
|
||||
|
||||
# Status
|
||||
GET /status controllers.StatusController.requestStatus()
|
||||
GET /status/:gameId controllers.StatusController.game(gameId: String)
|
||||
Reference in New Issue
Block a user