Skip to content

Instantly share code, notes, and snippets.

@diversit
Created June 14, 2016 13:58
Show Gist options
  • Save diversit/c54fede95f2cfc80e11d2d9ffc04a9c4 to your computer and use it in GitHub Desktop.
Save diversit/c54fede95f2cfc80e11d2d9ffc04a9c4 to your computer and use it in GitHub Desktop.
A Finatra test app to try our different ways of handling a Scalactic Or into a proper response
package com.philips.flexc.player_runtime.rest
import com.twitter.finagle.http.{Request, Status}
import com.twitter.finatra.http.response.ResponseBuilder
import com.twitter.finatra.http.routing.HttpRouter
import com.twitter.finatra.http.{Controller, HttpServer}
import com.twitter.util.Future
import org.scalactic.{Bad, Good, Or}
/**
* A simple Finatra http server to try out different ways of creating a proper
* response out of a Scalactic Or so this common functionality can be abstracted
* from all controllers so the routes in the controllers stay simple and readable
* and to have all error handling code in a single place.
*/
object TestApp extends HttpServer {
implicit class OrToJsonResponse[G, B](val or: Or[G, B]) extends AnyVal {
def build(responseStatus: Status)(implicit responseBuilder: ResponseBuilder) = or match {
case Good(result) => responseBuilder.status(responseStatus).json(result)
case Bad(error) => responseBuilder.internalServerError(error)
}
def ok(implicit responseBuilder: ResponseBuilder) = build(Status.Ok)
}
implicit class FutureOrToJsonResponse[G,B](val fOr: Future[Or[G, B]]) extends AnyVal {
def build(responseStatus: Status)(implicit responseBuilder: ResponseBuilder) = fOr.map {
case Good(result) => responseBuilder.status(responseStatus).json(result)
case Bad(error) => responseBuilder.internalServerError(error)
}
def ok(implicit responseBuilder: ResponseBuilder) = build(Status.Ok)
}
override protected def configureHttp(router: HttpRouter): Unit = {
router.add(new Controller {
implicit def resp = response
get("/test") { request: Request =>
Future {
Good("Ok").orBad[Int].ok
}
}
get("/test2") { request: Request =>
Future {
Good("2").orBad[Int]
}.ok
}
get("/bad") { request: Request =>
Future {
Good[String].orBad("Error")
}.ok
}
})
}
}
@wboumans
Copy link

Kunnen we een Bad ook invloed laten hebben op de uiteindelijke Http response code? InternalServerError is te generiek en komt als het goed is zelden voor...

Verder lijkt het me wel een werkbare oplossing

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment