Как свернуть Директивы Распыления

Как можно свернуть эти директивы в максимально возможной степени?

Мне удалось свернуть три директивы в mainHeader, но как включить аутентификацию и responseWithMediaType?

val mainHeaders = cors & headerValueByName("Access_Token") & headerValueByName("Tenant_Name")

override def getLayer = path("api" / Segment / "model" / "layers") { modeledSystemName =>
    mainHeaders { (accessToken, tenantName) =>
      authenticate(validate(accessToken)) { authInfo =>
        respondWithMediaType(`application/json`) {
          get {
            onComplete(service.getlayers(modeledSystemName, tenantName)) {
              case Success(layers) => complete(layers)
              //case Success(None) => complete(NotFound, "Release version not found")
              case Failure(ex) => complete(InternalServerError, s"An error occurred: ${ex.getMessage}")
            }
          }
        }
      }
    }
  }

1 ответ

Решение

Маршруты распыления суперкомпостируемы, так что вы можете делать все что угодно Например, я бы написал этот маршрут так:

val authWithHeader = headerValueByName("Access_Token")
  .flatMap(accessToken => authenticate(validate(accessToken)))

val authenticatedJsonRoute = cors &
  authWithHeader &
  headerValueByName("Tenant_Name") &
  respondWithMediaType(MediaTypes.`application/json`)

override val getLayer =
  (get & path("api" / Segment / "model" / "layers")) { modeledSystemName =>
    authenticatedJsonRoute { (authInfo, tenantName) =>
      onComplete(service.getlayers(modeledSystemName, tenantName)) {
        case Success(layers) => complete(layers)
        //case Success(None) => complete(NotFound, "Release version not found")
        case Failure(ex) => complete(InternalServerError, s"An error occurred: ${ex.getMessage}")
      }
    }
  }

Позвольте мне объяснить этот код. Во-первых, я создал директиву authWithHeader это читает значение заголовка и затем делает аутентификацию с этим значением. Это супер просто и все волшебство сделано flatMap,

Затем я создал authenticatedJsonRoute это просто набор других простых директив. Состав магии сделан с & оператор (я говорю это как "и тогда" в этом контексте), и эти директивы будут выполняться по порядку.

Наконец, я использовал свою составленную директиву, authenticatedJsonRouteв полном маршруте getLayer,

Другие вопросы по тегам