Функция Prepend для каждого запроса маршрута в Яде

В настоящее время я играю с Yada в качестве веб-библиотеки. Теперь я хочу выполнить некоторую функцию до того, как будет достигнут маршрут.

Подходы, которые я проверил: - обернуть текущий ресурс как подресурс, но тогда документ swagger-doc не найдет ресурс - с помощью prepend-interceptor, но документация не завершена на этом этапе, когда я получил ошибки

Мой код:

(ns all-mighty.namespace
    (:require [yada.yada :refer [handler listener resource as-resource]]
              [yada.swagger :refer [swaggered]])

(defn resources []
[""
 (swaggered
     [""
      [
       (cool-route)
       ]]
     {:info     {:title       "Hello You!"
                 :version     "1.0"
                 :description "It's something"}
      :basePath ""}
     )])

(defn cool-route []
["/cool" (resource {
                   :description "Returns somethign cool"
                   :produces    "application/json"
                   :methods     {:get {:response cool-response}}}
                  )])

(defn cool-response [ctx]
(-> (:response ctx)
    (assoc :status 200)
    (assoc :body {:state :up}))

Да, я рефакторинг ресурсов последний;-)

У кого-нибудь есть идея?

1 ответ

Решение

То, как я использую append-interceptor:

(ns all-mighty.namespace
  (:require
   [yada.handler :refer [append-interceptor]]
   [yada.interceptors :as i]
   [yada.swagger :refer [swaggered]]
   [yada.yada :refer [handler listener resource as-resource]]))

(defn cool-response [ctx]
  {:state :up
   :my/value (get ctx :my/value)})

(defn my-cool-interceptor [ctx]
  (assoc ctx :my/value 10))

(defn my-cool-resource
  [model]
  (-> model
   ;; you have to provide an interception chain, here we use the default one
   (assoc :interceptor-chain yada.yada/default-interceptor-chain)
   resource
   ;; here we append our interceptor after the request body has been processed
   (append-interceptor i/process-request-body my-cool-interceptor)))

(defn cool-route []
  ["/cool" (my-cool-resource {:description "Returns somethign cool"
                              :produces    "application/json"
                              :methods     {:get {:response cool-response}}})])

(defn routes []
  [""
   (swaggered
    [""
     [
      (cool-route)
      ]]
    {:info     {:title       "Hello You!"
                :version     "1.0"
                :description "It's something"}
     :basePath ""}
    )])

(comment
  (def l (listener (routes) {:port 1337}))
  ((:close l))
  )

Так что для каждого ресурса под /cool Вы можете использовать my-cool-resource функция автоматического добавления нужного перехватчика.

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