aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/xyz/driver/pdsuicommon/http/Directives.scala
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/scala/xyz/driver/pdsuicommon/http/Directives.scala')
-rw-r--r--src/main/scala/xyz/driver/pdsuicommon/http/Directives.scala114
1 files changed, 0 insertions, 114 deletions
diff --git a/src/main/scala/xyz/driver/pdsuicommon/http/Directives.scala b/src/main/scala/xyz/driver/pdsuicommon/http/Directives.scala
deleted file mode 100644
index 46b86a6..0000000
--- a/src/main/scala/xyz/driver/pdsuicommon/http/Directives.scala
+++ /dev/null
@@ -1,114 +0,0 @@
-package xyz.driver.pdsuicommon.http
-
-import akka.http.scaladsl.server._
-import akka.http.scaladsl.server.Directives._
-import akka.http.scaladsl.model._
-import xyz.driver.core.app.DriverApp
-import xyz.driver.pdsuicommon.error._
-import xyz.driver.pdsuicommon.error.DomainError._
-import xyz.driver.pdsuicommon.error.ErrorsResponse.ResponseError
-import xyz.driver.pdsuicommon.parsers._
-import xyz.driver.pdsuicommon.db.{Pagination, SearchFilterExpr, Sorting}
-import xyz.driver.pdsuicommon.domain._
-import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport._
-import xyz.driver.core.generators
-import xyz.driver.core.rest.ContextHeaders
-import xyz.driver.core.rest.errors.{InvalidActionException, InvalidInputException, ResourceNotFoundException}
-
-import scala.util.control._
-import scala.util._
-
-trait Directives {
-
- val paginated: Directive1[Pagination] = parameterSeq.flatMap { params =>
- PaginationParser.parse(params) match {
- case Success(pagination) => provide(pagination)
- case Failure(ex) =>
- reject(ValidationRejection("invalid pagination parameter", Some(ex)))
- }
- }
-
- def sorted(validDimensions: Set[String] = Set.empty): Directive1[Sorting] = parameterSeq.flatMap { params =>
- SortingParser.parse(validDimensions, params) match {
- case Success(sorting) => provide(sorting)
- case Failure(ex) =>
- reject(ValidationRejection("invalid sorting parameter", Some(ex)))
- }
- }
-
- val dimensioned: Directive1[Dimensions] = parameterSeq.flatMap { params =>
- DimensionsParser.tryParse(params) match {
- case Success(dims) => provide(dims)
- case Failure(ex) =>
- reject(ValidationRejection("invalid dimension parameter", Some(ex)))
- }
- }
-
- val searchFiltered: Directive1[SearchFilterExpr] = parameterSeq.flatMap { params =>
- SearchFilterParser.parse(params) match {
- case Success(sorting) => provide(sorting)
- case Failure(ex) =>
- reject(ValidationRejection("invalid filter parameter", Some(ex)))
- }
- }
-
- def StringIdInPath[T]: PathMatcher1[StringId[T]] =
- PathMatchers.Segment.map((id) => StringId(id.toString))
-
- def LongIdInPath[T]: PathMatcher1[LongId[T]] =
- PathMatchers.LongNumber.map((id) => LongId(id))
-
- def UuidIdInPath[T]: PathMatcher1[UuidId[T]] =
- PathMatchers.JavaUUID.map((id) => UuidId(id))
-
- def failFast[A](reply: A): A = reply match {
- case err: NotFoundError => throw ResourceNotFoundException(err.getMessage)
- case err: AuthorizationError => throw InvalidActionException(err.getMessage)
- case err: DomainError => throw InvalidInputException(err.getMessage)
- case other => other
- }
-
- def domainExceptionHandler(req: String): ExceptionHandler = {
- def errorResponse(msg: String, code: Int) =
- ErrorsResponse(Seq(ResponseError(None, msg, code)), req)
- ExceptionHandler {
- case ex: InvalidActionException =>
- complete(StatusCodes.Forbidden -> errorResponse(ex.message, 403))
-
- case ex: ResourceNotFoundException =>
- complete(StatusCodes.NotFound -> errorResponse(ex.message, 404))
-
- case ex: InvalidInputException =>
- complete(StatusCodes.BadRequest -> errorResponse(ex.message, 400))
-
- case NonFatal(ex) =>
- complete(StatusCodes.InternalServerError -> errorResponse(ex.getMessage, 500))
- }
- }
-
- def domainRejectionHandler(req: String): RejectionHandler = {
- def wrapContent(message: String) = {
- import ErrorsResponse._
- val err: ErrorsResponse = ErrorsResponse(Seq(ResponseError(None, message, 1)), req)
- val text = errorsResponseJsonFormat.write(err).toString()
- HttpEntity(ContentTypes.`application/json`, text)
- }
- DriverApp.rejectionHandler.mapRejectionResponse {
- case res @ HttpResponse(_, _, ent: HttpEntity.Strict, _) =>
- res.copy(entity = wrapContent(ent.data.utf8String))
- case x => x // pass through all other types of responses
- }
- }
-
- val tracked: Directive1[String] = optionalHeaderValueByName(ContextHeaders.TrackingIdHeader) flatMap {
- case Some(id) => provide(id)
- case None => provide(generators.nextUuid().toString)
- }
-
- val domainResponse: Directive0 = tracked.flatMap { id =>
- handleExceptions(domainExceptionHandler(id)) & handleRejections(domainRejectionHandler(id))
- }
-
-}
-
-object Directives extends Directives