Advertisement
Guest User

Untitled

a guest
Mar 19th, 2017
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 3.28 KB | None | 0 0
  1. package dankorjunk
  2.  
  3. import filestorage.{Elo, FileStorage, ImageMeme}
  4.  
  5. import akka.actor.ActorSystem
  6. import akka.http.scaladsl.Http
  7. import akka.http.scaladsl.model._
  8. import akka.http.scaladsl.server.Directives._
  9. import akka.stream.ActorMaterializer
  10. import scala.io.StdIn
  11.  
  12. object WebServer {
  13.   def main(args: Array[String]) {
  14.  
  15.     implicit val system = ActorSystem("doj-system")
  16.     implicit val materializer = ActorMaterializer()
  17.     // needed for the future flatMap/onComplete in the end
  18.     implicit val executionContext = system.dispatcher
  19.  
  20.     val route =
  21.       path("api" / "suggest") {
  22.         get {
  23.           val (id1, id2) = FileStorage.retrieveForRate()
  24.           complete(HttpEntity(ContentTypes.`application/json`,
  25.             upickle.default.write(Map("id1" -> id1, "id2" -> id2))))
  26.         }
  27.       } ~
  28.       path("api" / "top") {
  29.         get {
  30.           parameters('offset.as[Int], 'size.as[Int]) { (offset, size) =>
  31.             val top = FileStorage.getTop(offset, size)
  32.  
  33.             complete(HttpEntity(ContentTypes.`application/json`,
  34.               upickle.default.write(Map("top" -> top))))
  35.           }
  36.         }
  37.       } ~
  38.       path("api" / "upload") {
  39.         post {
  40.           extractRequestContext { ctx =>
  41.             implicit val materializer = ctx.materializer
  42.             implicit val ec = ctx.executionContext
  43.  
  44.             fileUpload("image") {
  45.               case (metadata, byteSource) =>
  46.                 val f = byteSource.runFold(Array[Byte]())((file, part) => file ++ part.toArray[Byte])
  47.                 onSuccess(f) { (file) => {
  48.                   FileStorage.uploadImage(file)
  49.                   complete("Image uploaded")
  50.                 } }
  51.             }
  52.           }
  53.         } ~
  54.         get {
  55.           complete(HttpEntity(ContentTypes.`text/html(UTF-8)`,
  56.             """
  57.              |<form method="post" enctype="multipart/form-data">
  58.              |      <input type="file" name="image" />
  59.              |      <input type="submit" />
  60.              |</form>
  61.            """.stripMargin))
  62.         }
  63.       } ~
  64.       path("api" / "rate") {
  65.         post {
  66.           formFields('id1, 'id2, 'winner) { (id1, id2, winner) =>
  67.            for {
  68.              img1 <- FileStorage.getImage(id1)
  69.              img2 <- FileStorage.getImage(id2)
  70.            } {
  71.              val firstWin = winner match {
  72.                case "win1" => 1.0
  73.                case "draw" => 0.5
  74.                case "win2" => 0.0
  75.                case _ => 0.0
  76.              }
  77.              val (newRank1, newRank2) = Elo.getNewRanks(img1.rank, img2.rank, firstWin)
  78.  
  79.              FileStorage.updateImage(
  80.                id1, ImageMeme(id1, newRank1, img1.timestamp, img1.numOfShows + 1))
  81.              FileStorage.updateImage(
  82.                id2, ImageMeme(id2, newRank2, img2.timestamp, img2.numOfShows + 1))
  83.            }
  84.            complete("Ranks updated")
  85.          }
  86.        }
  87.      }
  88.  
  89.    val bindingFuture = Http().bindAndHandle(route, "localhost", 8080)
  90.  
  91.    println(s"Server online at http://localhost:8080/\nPress RETURN to stop...")
  92.    StdIn.readLine() // let it run until user presses return
  93.    bindingFuture
  94.      .flatMap(_.unbind()) // trigger unbinding from the port
  95.      .onComplete(_ => system.terminate()) // and shutdown when done
  96.  }
  97. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement