forked from ReactiveDesignPatterns/CodeSamples
-
Notifications
You must be signed in to change notification settings - Fork 26
Expand file tree
/
Copy pathHttpService.scala
More file actions
81 lines (73 loc) · 2.64 KB
/
HttpService.scala
File metadata and controls
81 lines (73 loc) · 2.64 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
/*
* Copyright (c) 2018 https://www.reactivedesignpatterns.com/
*
* Copyright (c) 2018 https://rdp.reactiveplatform.xyz/
*
*/
package ckite.http
import ckite.{ CKite, CKiteClient, Get, Put }
import com.fasterxml.jackson.core.util.{ DefaultIndenter, DefaultPrettyPrinter }
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.scala.DefaultScalaModule
import com.twitter.finagle.Service
import com.twitter.finagle.http.Status._
import com.twitter.finagle.http.Version.Http11
import com.twitter.finagle.http.path._
import com.twitter.finagle.http.{ Method, Request, Response }
import com.twitter.util.{ Future, Promise }
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.{ Future => ScalaFuture }
import scala.language.implicitConversions
import scala.util.{ Failure, Success }
class HttpService(ckite: CKite) extends Service[Request, Response] {
private val mapper = new ObjectMapper
mapper.registerModule(DefaultScalaModule)
private val printer = new DefaultPrettyPrinter
printer.indentArraysWith(new DefaultIndenter)
private val writer = mapper.writer(printer)
def apply(request: Request): Future[Response] = {
request.method -> Path(request.path) match {
case Method.Get -> Root / "status" =>
Future.value {
response(writer.writeValueAsString(ckite.asInstanceOf[CKiteClient].stats()))
}
case Method.Get -> Root / "kv" / key =>
val localOption = request.params.getBoolean("local")
val get = Get(key)
val result =
if (localOption.getOrElse(false))
ScalaFuture.successful(ckite.asInstanceOf[CKiteClient].readLocal(get))
else ckite.read(get)
result.map { value =>
response(value)
}
case Method.Post -> Root / "kv" / key / value =>
ckite.write(Put(key, value)).map { value =>
response(value)
}
case Method.Post -> Root / "members" / binding =>
ckite.addMember(binding).map { value =>
response(value)
}
case Method.Delete -> Root / "members" / binding =>
ckite.removeMember(binding).map { value =>
response(value)
}
case _ =>
Future.value(Response(Http11, NotFound))
}
}
private def response[T](any: T): Response = {
val response = Response()
response.contentString = s"$any\n"
response
}
private implicit def toTwitterFuture[T](scalaFuture: ScalaFuture[T]): Future[T] = {
val promise = Promise[T]()
scalaFuture.onComplete {
case Success(value) => promise.setValue(value)
case Failure(t) => promise.raise(t)
}
promise
}
}