-
Notifications
You must be signed in to change notification settings - Fork 5
/
Step4Complete.scala
88 lines (76 loc) · 2.05 KB
/
Step4Complete.scala
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
82
83
84
85
86
87
88
package com.softwaremill.spray.server
import akka.actor.{Props, Actor, ActorSystem}
import spray.routing._
import com.softwaremill.spray._
import spray.http.MediaTypes
import akka.pattern.ask
import akka.util.Timeout
import scala.concurrent.duration._
object Step4Complete extends App with SimpleRoutingApp {
implicit lazy val actorSystem = ActorSystem()
var plentyOfAmber = Amber.ambers
implicit val timeout = Timeout(1.second)
import actorSystem.dispatcher
lazy val helloActor = actorSystem.actorOf(Props(new HelloActor()))
lazy val miningActor = actorSystem.actorOf(Props(new MiningActor()))
def getJson(route: Route) = get {
respondWithMediaType(MediaTypes.`application/json`) { route }
}
lazy val amberRoute = {
get {
path("hello") { ctx =>
helloActor ! ctx
}
} ~
getJson {
path("list" / "all") {
complete {
Amber.toJson(plentyOfAmber)
}
}
} ~
getJson {
path("amber" / IntNumber / "details") { index =>
complete {
Amber.toJson(plentyOfAmber(index))
}
}
} ~
post {
path("amber" / "add" / "mined") {
parameters("country"?, "size".as[Int]) { (country, size) =>
val newAmber = MinedAmber(country.getOrElse("Estonia"), size)
plentyOfAmber = newAmber :: plentyOfAmber
complete {
"OK"
}
}
}
}
}
lazy val miningRoute = {
get {
path("mining" / "remaining") {
complete {
(miningActor ? RemainingMiningTime).mapTo[Int]
.map(s => s"Your amber will be mined in $s")
}
}
}
}
startServer(interface = "localhost", port = 8080) {
amberRoute ~ miningRoute
}
class HelloActor extends Actor {
override def receive = {
case ctx: RequestContext => ctx.complete("Welcome to Amber Gold!")
}
}
class MiningActor extends Actor {
private val timeRemaining = 10
override def receive = {
case RemainingMiningTime => sender ! timeRemaining
}
}
object RemainingMiningTime
}