Compare commits

..

10 Commits

15 changed files with 133 additions and 8 deletions

View File

@@ -282,3 +282,28 @@
### Features ### Features
* Update configuration files for CORS settings and add production environment ([3b7a1e3](https://git.janis-eccarius.de/KnockOutWhist/KnockOutWhist-Web/commit/3b7a1e3c646d870134d8d06b4962498b0e282cbd)) * Update configuration files for CORS settings and add production environment ([3b7a1e3](https://git.janis-eccarius.de/KnockOutWhist/KnockOutWhist-Web/commit/3b7a1e3c646d870134d8d06b4962498b0e282cbd))
## (2026-01-07)
### Features
* Add caching headers for env.js in Nginx configuration ([dbad818](https://git.janis-eccarius.de/KnockOutWhist/KnockOutWhist-Web/commit/dbad818fdaeb237a05f583e5402773a4339e7aa1))
## (2026-01-07)
### Features
* Add logging to Gateway for pod synchronization and startup events ([6ef7401](https://git.janis-eccarius.de/KnockOutWhist/KnockOutWhist-Web/commit/6ef74014430673e725245bf37e44c5b90b81abb3))
## (2026-01-07)
### Features
* Add logging to Gateway for pod synchronization and startup events ([2615707](https://git.janis-eccarius.de/KnockOutWhist/KnockOutWhist-Web/commit/26157076d686a5dd3f8157ec2b2d1ae9d9e9eedf))
## (2026-01-07)
### Features
* Add Health and Login endpoints with updated Redis configuration ([4a5af36](https://git.janis-eccarius.de/KnockOutWhist/KnockOutWhist-Web/commit/4a5af36ae0dcb540e02b7a1cd042e54cc6342c78))
## (2026-01-07)
### Features
* Update Gateway to use ArrayList for game IDs and bound users ([2f89951](https://git.janis-eccarius.de/KnockOutWhist/KnockOutWhist-Web/commit/2f89951c25484d6bc412536a83019ee6d0b7f780))

View File

@@ -1,6 +1,6 @@
meta { meta {
name: Game name: Game
seq: 3 seq: 2
} }
auth { auth {

View File

@@ -0,0 +1,16 @@
meta {
name: Health
type: http
seq: 3
}
get {
url: {{host}}/health/simple
body: none
auth: inherit
}
settings {
encodeUrl: true
timeout: 0
}

View File

@@ -0,0 +1,15 @@
meta {
name: Request Status
type: http
seq: 1
}
get {
url: {{host}}/status
body: none
auth: inherit
}
settings {
encodeUrl: true
}

View File

@@ -0,0 +1,8 @@
meta {
name: Login
seq: 3
}
auth {
mode: inherit
}

View File

@@ -0,0 +1,3 @@
vars {
host: https://knockout.janis-eccarius.de/api
}

View File

@@ -0,0 +1,3 @@
vars {
host: https://st.knockout.janis-eccarius.de/api
}

View File

@@ -0,0 +1,30 @@
package controllers
import auth.{AuthAction, AuthenticatedRequest}
import dto.subDTO.UserDTO
import logic.user.{SessionManager, UserManager}
import model.users.User
import play.api.*
import play.api.libs.json.Json
import play.api.mvc.*
import play.api.mvc.Cookie.SameSite.{Lax, None, Strict}
import javax.inject.*
/**
* This controller creates an `Action` to handle HTTP requests to the
* application's home page.
*/
@Singleton
class HealthController @Inject()(
val controllerComponents: ControllerComponents,
) extends BaseController {
def simple(): Action[AnyContent] = {
Action { implicit request =>
Ok("OK")
}
}
}

View File

@@ -4,8 +4,10 @@ import de.knockoutwhist.data.Pod
import de.knockoutwhist.data.redis.RedisManager import de.knockoutwhist.data.redis.RedisManager
import org.apache.pekko.actor.ActorSystem import org.apache.pekko.actor.ActorSystem
import org.redisson.config.Config import org.redisson.config.Config
import play.api.Logger
import play.api.inject.ApplicationLifecycle import play.api.inject.ApplicationLifecycle
import java.util
import java.util.UUID import java.util.UUID
import javax.inject.* import javax.inject.*
import scala.concurrent.ExecutionContext import scala.concurrent.ExecutionContext
@@ -17,15 +19,22 @@ class Gateway @Inject()(
actorSystem: ActorSystem actorSystem: ActorSystem
)(implicit ec: ExecutionContext) { )(implicit ec: ExecutionContext) {
private val logger = Logger(getClass.getName)
val redis: RedisManager = { val redis: RedisManager = {
val config: Config = Config() val config: Config = Config()
config.useSingleServer.setAddress("valkey://" + sys.env.getOrElse("VALKEY_HOST", "localhost") + ":" + sys.env.getOrElse("VALKEY_PORT", "6379")) val url = "redis://" + sys.env.getOrElse("REDIS_HOST", "localhost") + ":" + sys.env.getOrElse("REDIS_PORT", "6379")
logger.info(s"Connecting to Redis at $url")
config.useSingleServer.setAddress(url)
RedisManager(config) RedisManager(config)
} }
redis.continuousSyncPod(() => { redis.continuousSyncPod(() => {
logger.info("Syncing pod with Redis")
createPod() createPod()
}) })
logger.info("Gateway started")
def syncPod(): Unit = { def syncPod(): Unit = {
redis.syncPod(createPod()) redis.syncPod(createPod())
@@ -37,8 +46,8 @@ class Gateway @Inject()(
PodManager.podName, PodManager.podName,
PodManager.podIp, PodManager.podIp,
9000, 9000,
PodManager.getAllGameIds().asJava, new util.ArrayList[String](PodManager.getAllGameIds().asJava),
PodManager.allBoundUsers().asJava new util.ArrayList[String](PodManager.allBoundUsers().asJava)
) )
} }

View File

@@ -1,9 +1,10 @@
package modules package modules
import com.google.inject.AbstractModule import com.google.inject.AbstractModule
import logic.Gateway
class GatewayModule extends AbstractModule { class GatewayModule extends AbstractModule {
override def configure(): Unit = { override def configure(): Unit = {
bind(classOf[GatewayModule]).asEagerSingleton() bind(classOf[Gateway]).asEagerSingleton()
} }
} }

View File

@@ -30,4 +30,7 @@ GET /websocket controllers.WebsocketController.socket()
# Status # Status
GET /status controllers.StatusController.requestStatus() GET /status controllers.StatusController.requestStatus()
GET /status/:gameId controllers.StatusController.game(gameId: String) GET /status/:gameId controllers.StatusController.game(gameId: String)
# Health
GET /health/simple controllers.HealthController.simple()

View File

@@ -0,0 +1,12 @@
include "application.conf"
play.http.context="/api"
play.modules.enabled += "modules.GatewayModule"
play.filters.cors {
allowedOrigins = ["https://st.knockout.janis-eccarius.de"]
allowedCredentials = true
allowedHttpMethods = ["GET", "POST", "PUT", "DELETE", "OPTIONS"]
allowedHttpHeaders = ["Accept", "Content-Type", "Origin", "X-Requested-With"]
}

View File

@@ -1,3 +1,3 @@
MAJOR=4 MAJOR=4
MINOR=19 MINOR=24
PATCH=0 PATCH=0