Skip to content

Instantly share code, notes, and snippets.

@jkyamog
Created April 1, 2014 22:21
Show Gist options
  • Save jkyamog/9924325 to your computer and use it in GitHub Desktop.
Save jkyamog/9924325 to your computer and use it in GitHub Desktop.
Auditing on play
object AuditLogger {
implicit def actionToSimpleFuture[T](action: Action[T])(implicit request: Request[T]): Future[SimpleResult] = {
action.apply(request)
}
def audit[M](audit: Audit)(f: => Future[M])(implicit ctx: ExecutionContext): Future[M] = {
val future = f // do the call by name only once, otherwise another future is created
future.onComplete {
case Success(_) => insert(audit)
case Failure(_) => // don't care if future has failed, just let is bubble up
}
future
}
private def insert(audit: Audit): Future[Unit] = {...}
}
object MyController {
def doSomething = UserActionBuilder.async(parse.AnyContent) { implicit request =>
import AuditLogger._
AuditLogger.audit(Audit(request.user, "did Something")) {
Action(Ok)
}
}
def doSomething2 = UserActionBuilder.async(parse.AnyContent) { request =>
AuditLogger.audit(Audit(request.user, "did Something")) {
Action(Ok)(request) // apply the request to get Future[SimpleResult]
}
}
def doSomething3 = UserActionBuilder.async(parse.AnyContent) { request =>
val f = AuditLogger.audit(Audit(request.user, "did Something")) {
aBooleanFuture()
}
f.map{
case true => Ok
case false => BadRequest
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment