Johan Östling 10 лет назад
Родитель
Сommit
827f172b25

+ 22
- 0
src/main/scala/se/citerus/dddsample/infrastructure/BookingServiceActor.scala Просмотреть файл

@@ -0,0 +1,22 @@
1
+package se.citerus.dddsample.infrastructure
2
+
3
+import java.time.ZonedDateTime
4
+import java.util.UUID
5
+
6
+import akka.actor.Actor
7
+import se.citerus.dddsample.domain.model.cargo.TrackingId
8
+import se.citerus.dddsample.domain.model.location.UnLocode
9
+import se.citerus.dddsample.infrastructure.BookingServiceActor.{Book, BookingRegistered}
10
+
11
+class BookingServiceActor extends Actor {
12
+
13
+  override def receive: Receive = {
14
+    case Book(origin, destination, arrivalTime) =>
15
+      sender() ! BookingRegistered(new TrackingId(UUID.randomUUID().toString))
16
+  }
17
+}
18
+
19
+object BookingServiceActor {
20
+  case class Book(origin: UnLocode, destination: UnLocode, arrivalTime: ZonedDateTime)
21
+  case class BookingRegistered(trackingId: TrackingId)
22
+}

+ 25
- 0
src/main/scala/se/citerus/dddsample/infrastructure/Boot.scala Просмотреть файл

@@ -0,0 +1,25 @@
1
+package se.citerus.dddsample.infrastructure
2
+
3
+import akka.actor.{ActorSystem, Props}
4
+import akka.io.IO
5
+import akka.pattern.ask
6
+import akka.util.Timeout
7
+import spray.can.Http
8
+
9
+import scala.concurrent.duration._
10
+
11
+object Boot extends App {
12
+
13
+  // we need an ActorSystem to host our application in
14
+  implicit val system = ActorSystem("dddsample")
15
+
16
+  val bookingService = system.actorOf(Props[BookingServiceActor], "booking-service")
17
+
18
+  // create and start our service actor
19
+  val service = system.actorOf(Props(classOf[CargoAdminActor], bookingService), "cargo-admin")
20
+
21
+  implicit val timeout = Timeout(5.seconds)
22
+  // start a new HTTP server on port 8080 with our service actor as the handler
23
+  IO(Http) ? Http.Bind(service, interface = "localhost", port = 13337)
24
+
25
+}

+ 45
- 0
src/main/scala/se/citerus/dddsample/infrastructure/CargoAdminActor.scala Просмотреть файл

@@ -0,0 +1,45 @@
1
+package se.citerus.dddsample.infrastructure
2
+
3
+import java.time.ZonedDateTime
4
+
5
+import akka.actor.{Actor, ActorRef}
6
+import akka.pattern.ask
7
+import akka.util.Timeout
8
+import se.citerus.dddsample.domain.model.location.UnLocode
9
+import se.citerus.dddsample.infrastructure.BookingServiceActor.Book
10
+import spray.routing.HttpService
11
+
12
+import scala.concurrent.Future
13
+
14
+import scala.concurrent.duration._
15
+
16
+class CargoAdminActor(val bookingServiceActor: ActorRef) extends Actor with CargoAdminResource {
17
+
18
+  def actorRefFactory = context
19
+  def receive = runRoute(cargoAdminRoute)
20
+
21
+}
22
+
23
+trait CargoAdminResource extends HttpService { this: Actor =>
24
+
25
+  import spray.httpx.marshalling.BasicMarshallers._
26
+
27
+  import scala.concurrent.ExecutionContext.Implicits.global
28
+
29
+  implicit val timeout = Timeout(5.seconds)
30
+
31
+  val bookingServiceActor: ActorRef
32
+
33
+  val cargoAdminRoute =
34
+    path("admin" / "book") {
35
+      post {
36
+        parameters('origin, 'destination, 'arrivalTime) { (origin, destination, arrivalTime) =>
37
+          complete(book(origin, destination, arrivalTime).map(_.toString))
38
+        }
39
+      }
40
+    }
41
+
42
+  def book(origin: String, destination: String, arrivalTime: String): Future[Any] =
43
+    bookingServiceActor ? Book(new UnLocode(origin), new UnLocode(destination), ZonedDateTime.parse(arrivalTime))
44
+
45
+}