Нест Нуар Маршруты

У меня есть приложение, которое генерирует ключи на основе конкретных хранилищ данных. Если будет 7 таких маршрутов и 5 приложений, в моем файле event.clj будет всего 35 маршрутов (или, если разделить, 7/ файл в 5 файлах). Я хотел бы сделать следующее динамически:

(defnested "/:app-name"
    (defpage "/generate/event" {:keys [app-name event-name time] :as key-map}
     (response/json
      {:key (key-model/build-key :event key-map)}))

    (defpage "/generate/event/unread" {:keys [app-name event-name] :as key-map}
     (response/json
      {:key (key-model/build-key :unread-for-event key-map)}))
)

Таким образом, я могу написать каждый маршрут один раз, а затем передать имя приложения (вместо того, чтобы передавать его в параметрах запроса, что работает, но не очень RESTful).

БОНУС

Как я могу динамически вызывать пространство имен, чтобы key-model/build-key становится вызовом redis-model/build-key или же riak-model/build-key на основе названия приложения?

1 ответ

Решение

Не уверен, что я понимаю вопрос, но разве это не то, что вы ищете:

(defpage "/:app-name/generate/event" {:keys [app-name event-name time] :as key-map}
    (response/json
      {:key (key-model/build-key :event key-map)}))

(defpage "/:app-name/generate/event/unread" {:keys [app-name event-name] :as key-map}
     (response/json
      {:key (key-model/build-key :unread-for-event key-map)}))

БОНУС

Я также пойду за простым решением, состоящим из карты с функциями для генерации ключей, что-то вроде:

(def key-gen {"redis" redis-model/build-key
       "riak" riak/build-key})

(response/json
      {:key ((get key-gen app-name) :event key-map)})

Если вы действительно хотите динамически найти функцию ключа сборки, вы можете сделать что-то вроде:

(defn build-key [app-name] 
   (let [the-ns (symbol (str app-name "-model"))] 
      (require the-ns) 
      (ns-resolve the-ns 'build-key)))
Другие вопросы по тегам