;; This Source Code Form is subject to the terms of the Mozilla Public ;; License, v. 2.0. If a copy of the MPL was not distributed with this ;; file, You can obtain one at http://mozilla.org/MPL/2.0/. ;; ;; Copyright (c) KALEIDOS INC (ns app.rpc.doc "API autogenerated documentation." (:require [app.common.data :as d] [app.config :as cf] [app.rpc :as-alias rpc] [app.util.services :as sv] [app.util.template :as tmpl] [clojure.java.io :as io] [clojure.spec.alpha :as s] [cuerdas.core :as str] [integrant.core :as ig] [pretty-spec.core :as ps] [yetti.response :as yrs])) (defn- get-spec-str [k] (with-out-str (ps/pprint (s/form k) {:ns-aliases {"clojure.spec.alpha" "s" "clojure.core.specs.alpha" "score" "clojure.core" nil}}))) (defn- prepare-context [methods] (letfn [(gen-doc [type [name f]] (let [mdata (meta f)] {:type (d/name type) :name (d/name name) :module (-> (:ns mdata) (str/split ".") last) :auth (:auth mdata true) :docs (::sv/docstring mdata) :deprecated (::deprecated mdata) :added (::added mdata) :changes (some->> (::changes mdata) (partition-all 2) (map vec)) :spec (get-spec-str (::sv/spec mdata))}))] {:version (:main cf/version) :command-methods (->> (:commands methods) (map (partial gen-doc :command)) (sort-by (juxt :module :name))) :query-methods (->> (:queries methods) (map (partial gen-doc :query)) (sort-by (juxt :module :name))) :mutation-methods (->> (:mutations methods) (map (partial gen-doc :query)) (sort-by (juxt :module :name)))})) (defn- handler [methods] (if (contains? cf/flags :backend-api-doc) (let [context (prepare-context methods)] (fn [_ respond _] (respond (yrs/response 200 (-> (io/resource "app/templates/api-doc.tmpl") (tmpl/render context)))))) (fn [_ respond _] (respond (yrs/response 404))))) (defmethod ig/pre-init-spec ::routes [_] (s/keys :req-un [::rpc/methods])) (defmethod ig/init-key ::routes [_ {:keys [methods] :as cfg}] ["/_doc" {:handler (handler methods) :allowed-methods #{:get}}])