(ns myapp.server.rest (:require (myapp.server.graphql :as gql) (myapp.server.response :as resp))) (defn- from-body-payload [keys] (comp ;; comp composes functions, this is equiv. to (fn [x] (-> x :request :json-params :payload (select-keys keys))) #(select-keys % keys) :payload ;; keywords in clojure, when used as a function on an associative, will get the value at that keyword :json-params :request)) (def v0-create-note {:query "mutation CreateNote($item: ID!, $content: String!) { note: createNote(item: $item, content: $content) { id item content } }" :variables (from-body-payload [:item :content]) :method :post :path "/note"}) (defn- create-pedestal-route-definition [interceptors {:keys [query variables method path modify-response] :or {variables (comp :json-params :request) modify-response :data}}] [(str "/v0" path) method (conj interceptors {:name (keyword path (name method)) :enter (fn [context] (resp/ok context (modify-response (gql/execute-from-context context query (variables context)))))})])