Created
May 12, 2015 17:12
-
-
Save vkostyukov/8e437949a39951b153d3 to your computer and use it in GitHub Desktop.
Coproduct Routers in the Playground
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package io.finch.playground | |
import com.fasterxml.jackson.databind.ObjectMapper | |
import com.fasterxml.jackson.module.scala.DefaultScalaModule | |
import com.twitter.finagle.{Service, Filter, Httpx} | |
import com.twitter.util.{Future, Await} | |
import io.finch.{Endpoint => _, _} | |
import io.finch.micro._ | |
import io.finch.request._ | |
import io.finch.route.{Endpoint => _, _} | |
import io.finch.jackson._ | |
/** | |
* GET /user/groups -> Seq[Group] | |
* POST /groups?name=foo -> Group | |
* PUT /user/groups/:group -> User | |
*/ | |
object Main extends App { | |
// enable finch-jackson magic | |
implicit val objectMapper: ObjectMapper = new ObjectMapper().registerModule(DefaultScalaModule) | |
// model | |
case class Group(ownerId: Int = 0, name: String) | |
case class User(id: Int, groups: Seq[Group]) | |
case class UnknownUser(id: Int) extends Exception(s"Unknown user with id=$id") | |
case object WrongSecret extends Exception("You shell not pass!") | |
val currentUser: RequestReader[User] = | |
header("X-Secrect").embedFlatMap { | |
case "open sesame" => User(0, Seq.empty[Group]).toFuture | |
case _ => WrongSecret.toFutureException | |
} | |
// GET /user/groups -> Seq[Group] | |
val getUserGroups: Router[RequestReader[Seq[Group]]] = | |
Get / "user" / "groups" /> (currentUser ~> { userId => Seq(Group(userId, "foo"), Group(userId, "bar")) }) | |
// POST /groups?name=foo -> Group | |
val postGroup: Router[RequestReader[Group]] = | |
Post / "groups" /> (currentUser :: param("name")).as[Group] | |
// PUT /user/groups/:group -> User | |
val putUserGroup: Router[RequestReader[User]] = | |
Put / "user" / "groups" / string /> { group => | |
currentUser ~> { User(_, Seq(group)) } | |
} | |
// an API endpoint | |
val api: Router[RequestReader[Seq[User]] :+: RequestReader[Group] :+: RequestReader[User] :+: CNil] = | |
getUserGroups :+: postGroup :+: putUserGroup | |
Await.ready(Httpx.serve(":8081", api)) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment