Advertisement
Guest User

Untitled

a guest
Nov 28th, 2015
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 5.41 KB | None | 0 0
  1. package com.danielasfregola.quiz.management
  2.  
  3. import akka.actor._
  4. import akka.util.Timeout
  5. import spray.http.StatusCodes
  6. import spray.httpx.SprayJsonSupport._
  7. import spray.routing._
  8.  
  9. import scala.concurrent.duration._
  10. import scala.language.postfixOps
  11.  
  12. // Rest Interface is class defined in Main.scala
  13. class RestInterface extends HttpServiceActor
  14. with RestApi {
  15.  
  16.   def receive = runRoute(routes)
  17. }
  18.  
  19. trait RestApi extends HttpService with ActorLogging { actor: Actor =>
  20.   import com.danielasfregola.quiz.management.QuizProtocol._
  21.  
  22.   implicit val timeout = Timeout(10 seconds)
  23.  
  24.   // I can read json file and put everything in quizzes variable
  25.   var quizzes = Vector[Quiz]()
  26.  
  27.   var name = "Jenil"
  28.   var foo = Quiz("1",name,"Shah",23,"mailjenil@gmail.com")
  29.   var foo1 = new Quiz("2","Devansh","Soni",23,"devanshsoni9@gmail.com")
  30.  
  31.   quizzes = quizzes :+ foo
  32.   quizzes = quizzes :+ foo1
  33.  
  34.   //  var new_update = quizzes(1).copy(email = "newid")
  35.   //  quizzes = quizzes.filterNot(_.id == "1")
  36.   //  quizzes = quizzes :+ new_update
  37.  
  38.   def routes: Route =
  39.  
  40.     pathPrefix("quizzes") {
  41.       pathEnd {
  42.         post {
  43.           entity(as[Quiz]) { quiz => requestContext =>
  44.             val responder = createResponder(requestContext)
  45.             createQuiz(quiz) match {
  46.               case true => responder ! QuizCreated
  47.               case _ => responder ! QuizAlreadyExists
  48.             }
  49.           }
  50.         }
  51.       } ~
  52.         path(Segment) { id =>
  53.           delete { requestContext =>
  54.             val responder = createResponder(requestContext)
  55.             deleteQuiz(id)
  56.             responder ! QuizDeleted
  57.           }
  58.         }
  59.     } ~
  60.       pathPrefix("user") {
  61.         pathEnd {
  62.           get { requestContext =>
  63.             val responder = createResponder(requestContext)
  64.             getRandomQuestion.map(responder ! _)
  65.               .getOrElse(responder ! QuestionNotFound)
  66.           }
  67.         } ~
  68.           path(Segment) { id =>
  69.             get { requestContext =>
  70.               val responder = createResponder(requestContext)
  71.               getQuestion(id).map(responder ! _)
  72.  
  73.                 .getOrElse(responder ! QuestionNotFound)
  74.             } ~
  75.               put {
  76.                 entity(as[Quiz]) {quiz => requestContext =>
  77.                   val responder = createResponder(requestContext)
  78.                   update(id, quiz)
  79.                   responder ! QuizCreated
  80.                 }
  81.               }
  82.             //        put {
  83.             //          entity(as[Answer]) {answer => requestContext =>
  84.             //            println(answer)
  85.             //            val responder = createResponder(requestContext)
  86.             //            isAnswerCorrect(id, answer) match {
  87.             //              case true => responder ! CorrectAnswer
  88.             //              case _ => responder ! WrongAnswer
  89.             //            }
  90.             //          }
  91.             //        }
  92.           }
  93.       }
  94.  
  95.   private def createResponder(requestContext:RequestContext) = {
  96.     context.actorOf(Props(new Responder(requestContext)))
  97.   }
  98.  
  99.   private def createQuiz(quiz: Quiz): Boolean = {
  100.     val doesNotExist = !quizzes.exists(_.id == quiz.id)
  101.     if (doesNotExist) quizzes = quizzes :+ quiz
  102.     doesNotExist
  103.   }
  104.  
  105.   private def deleteQuiz(id: String): Unit = {
  106.     quizzes = quizzes.filterNot(_.id == id)
  107.   }
  108.  
  109.   private def getRandomQuestion: Option[Question] = {
  110.     !quizzes.isEmpty match {
  111.       case true =>
  112.         import scala.util.Random
  113.         val idx = (new Random).nextInt(quizzes.size)
  114.         Some(quizzes(idx))
  115.       case _ => None
  116.     }
  117.   }
  118.  
  119.   private def getQuestion(id: String): Option[Question] = {
  120.     var a = getQuiz(id)
  121.     println(a)
  122.     a.map(toQuestion)
  123.   }
  124.  
  125.   //  private def getProfile(id: String): Option[Profile] = {
  126.   //    getQuiz(id).map(toQuestion)
  127.   //    println(profiles.find(_.id == id))
  128.   //    profiles.find(_.id == id)
  129.   //  }
  130.  
  131.   private def getQuiz(id: String): Option[Quiz] = {
  132.     quizzes.find(_.id == id)
  133.   }
  134.  
  135.   private def update(id: String, new_quiz: Quiz) = {
  136.     //    getQuiz(id).exists(_.correctAnswer == proposedAnswer.answer)
  137.     quizzes = quizzes.filterNot(_.id == id)
  138.     quizzes = quizzes :+ new_quiz
  139.   }
  140.  
  141.   //  private def isAnswerCorrect(id: String, proposedAnswer: Answer): Boolean = {
  142.   ////    getQuiz(id).exists(_.correctAnswer == proposedAnswer.answer)
  143.   //    getQuiz(id).exists(_.lastname == proposedAnswer.answer)
  144.   //  }
  145. }
  146.  
  147. // Responder Actor which is created everytime an route is obtained.
  148.  
  149. class Responder(requestContext:RequestContext) extends Actor with ActorLogging {
  150.   import com.danielasfregola.quiz.management.QuizProtocol._
  151.  
  152.   def receive = {
  153.  
  154.     case QuizCreated =>
  155.       requestContext.complete(StatusCodes.Created)
  156.       killYourself
  157.  
  158.     case QuizDeleted =>
  159.       requestContext.complete(StatusCodes.OK)
  160.       killYourself
  161.  
  162.     case QuizAlreadyExists =>
  163.       requestContext.complete(StatusCodes.Conflict)
  164.       killYourself
  165.  
  166.     case question: Question =>
  167.       requestContext.complete(StatusCodes.OK, question)
  168.       killYourself
  169.  
  170.     case QuestionNotFound =>
  171.       requestContext.complete(StatusCodes.NotFound)
  172.       killYourself
  173.  
  174.     case CorrectAnswer =>
  175.       requestContext.complete(StatusCodes.OK)
  176.       killYourself
  177.  
  178.     case WrongAnswer =>
  179.       requestContext.complete(StatusCodes.NotFound)
  180.       killYourself
  181.   }
  182.  
  183.   private def killYourself = self ! PoisonPill
  184.  
  185. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement