Skip to content
Snippets Groups Projects
Select Git revision
  • 988f9566cdcb9d00ff0202c53db68a4706252d8c
  • master default protected
  • yassin.elhakoun-master-patch-15592
  • yassin.elhakoun-master-patch-40090
  • pk
  • high-order-functions
6 results

notes.esm.js

Blame
  • Forked from programmation_sequentielle / cours
    Source project has a limited visibility.
    UserRoutes.scala 3.62 KiB
    package com.example
    
    import akka.actor.{ ActorRef, ActorSystem }
    import akka.event.Logging
    
    import scala.concurrent.duration._
    import akka.http.scaladsl.server.Directives._
    import akka.http.scaladsl.model.StatusCodes
    import akka.http.scaladsl.server.Route
    import akka.http.scaladsl.server.directives.Credentials
    import akka.http.scaladsl.server.directives.Credentials.Provided
    import akka.http.scaladsl.server.directives.MethodDirectives.delete
    import akka.http.scaladsl.server.directives.MethodDirectives.get
    import akka.http.scaladsl.server.directives.MethodDirectives.post
    import akka.http.scaladsl.server.directives.RouteDirectives.complete
    import akka.http.scaladsl.server.directives.PathDirectives.path
    
    import scala.concurrent.Future
    import com.example.UserRegistryActor._
    import akka.pattern.ask
    import akka.util.Timeout
    
    import com.typesafe.config.ConfigFactory
    import collection.JavaConversions._
    
    //#user-routes-class
    trait UserRoutes extends JsonSupport {
      //#user-routes-class
    
      // we leave these abstract, since they will be provided by the App
      implicit def system: ActorSystem
    
      lazy val log = Logging(system, classOf[UserRoutes])
    
      // other dependencies that UserRoutes use
      def userRegistryActor: ActorRef
    
      // Required by the `ask` (?) method below
      implicit lazy val timeout = Timeout(5.seconds) // usually we'd obtain the timeout from the system's configuration
    
      val tokens: List[String] = ConfigFactory.load().getStringList("tokens").toList
    
      def check(credentials: Credentials): Option[String] = credentials match {
        case p @ Credentials.Provided(token) if tokens.exists(t => p.verify(t)) => Some(token)
        case _ => None
      }
    
      //#all-routes
      //#users-get-post
      //#users-get-delete
      lazy val userRoutes: Route = Route.seal {
        pathPrefix("users") {
          //authenticateBasic(realm = "secure site", check) { userName =>
          authenticateOAuth2(realm = "secure site", check) { token =>
            concat(
              //#users-get-delete
              pathEnd {
                concat(
                  get {
                    val users: Future[Users] =
                      (userRegistryActor ? GetUsers).mapTo[Users]
                    log.info(token + " registered")
                    complete(users)
                  },
                  post {
                    entity(as[User]) { user =>
                      val userCreated: Future[ActionPerformed] =
                        (userRegistryActor ? CreateUser(user)).mapTo[ActionPerformed]
                      onSuccess(userCreated) { performed =>
                        log.info("Created user [{}]: {}", user.name, performed.description)
                        complete((StatusCodes.Created, performed))
                      }
                    }
                  })
              },
              //#users-get-post
              //#users-get-delete
              path(Segment) { name =>
                concat(
                  get {
                    //#retrieve-user-info
                    val maybeUser: Future[Option[User]] =
                      (userRegistryActor ? GetUser(name)).mapTo[Option[User]]
                    rejectEmptyResponse {
                      complete(maybeUser)
                    }
                    //#retrieve-user-info
                  },
                  delete {
                    //#users-delete-logic
                    val userDeleted: Future[ActionPerformed] =
                      (userRegistryActor ? DeleteUser(name)).mapTo[ActionPerformed]
                    onSuccess(userDeleted) { performed =>
                      log.info("Deleted user [{}]: {}", name, performed.description)
                      complete((StatusCodes.OK, performed))
                    }
                    //#users-delete-logic
                  })
              })
          }
          //#users-get-delete
        }
        //#all-routes
      }
    }