Refactored checkFresh

This commit is contained in:
2026-09-17 15:08:38 +03:00
parent 621fcf90fa
commit e144a7f3c0
2 changed files with 9 additions and 9 deletions
+3 -3
View File
@@ -4,7 +4,7 @@ import javax.inject.*
import play.api.* import play.api.*
import play.api.mvc.* import play.api.mvc.*
import authentication.{AuthenticatedAction, AuthenticatedRequest} import authentication.{AuthenticatedAction, AuthenticatedRequest}
import caching.{Etagable, checkFresh} import caching.{Etagable, CheckFresh}
import models.User import models.User
import play.api.libs.json.Json import play.api.libs.json.Json
@@ -20,7 +20,7 @@ import java.util.Base64
@Singleton @Singleton
class HomeController @Inject()(val controllerComponents: ControllerComponents, class HomeController @Inject()(val controllerComponents: ControllerComponents,
authenticatedAction: AuthenticatedAction) authenticatedAction: AuthenticatedAction)
extends BaseController with Logging { extends BaseController with Logging with CheckFresh {
/** /**
* Create an Action to render an HTML page. * Create an Action to render an HTML page.
@@ -35,7 +35,7 @@ class HomeController @Inject()(val controllerComponents: ControllerComponents,
def userData = authenticatedAction { implicit request: AuthenticatedRequest[AnyContent] => def userData = authenticatedAction { implicit request: AuthenticatedRequest[AnyContent] =>
val user = request.user val user = request.user
request.checkFresh(user) { checkFresh(user) {
// TODO: put the max-age somewhere into config // TODO: put the max-age somewhere into config
Ok(Json.toJson(user)).withHeaders("Etag" -> user.etag, "Cache-Control" -> "private, max-age=15, must-revalidate") Ok(Json.toJson(user)).withHeaders("Etag" -> user.etag, "Cache-Control" -> "private, max-age=15, must-revalidate")
} }
+6 -6
View File
@@ -9,18 +9,18 @@ trait Etagable[A]:
extension (a: A) def etag: String extension (a: A) def etag: String
extension [A, R[X] <: Request[X], E: Etagable](request: R[A]) { trait CheckFresh {
def checkFreshAsync(entity: E)(onStale: => Future[Result])(using ec: ExecutionContext): Future[Result] = { protected def checkFreshAsync[A, E: Etagable](entity: E)(onStale: => Future[Result])(using request: Request[A], ec: ExecutionContext): Future[Result] = {
compareEtag(entity).fold(onStale)( compareEtag(request, entity).fold(onStale)(
etag => Future.successful(NotModified.withHeaders("ETag" -> etag)) etag => Future.successful(NotModified.withHeaders("ETag" -> etag))
) )
} }
def checkFresh(entity: E)(onStale: => Result): Result = { protected def checkFresh[A, E: Etagable](entity: E)(onStale: => Result)(using request: Request[A]): Result = {
compareEtag(entity).fold(onStale)( compareEtag(request, entity).fold(onStale)(
etag => NotModified.withHeaders("ETag" -> etag) etag => NotModified.withHeaders("ETag" -> etag)
) )
} }
private def compareEtag(entity: E) = request.headers.get("If-None-Match").filter(e => e == entity.etag) private def compareEtag[A, E: Etagable](request: Request[A], entity: E) = request.headers.get("If-None-Match").filter(e => e == entity.etag)
} }