Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ClojureDocs External API #100

Closed
wants to merge 7 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion project.clj
Expand Up @@ -17,7 +17,7 @@
[clucy "0.4.0"]
[watchtower "0.1.1"]
[clj-http "0.7.7"]
[cheshire "5.2.0"]
[cheshire "5.3.1"]
[org.clojure/java.jdbc "0.3.0-beta2"]
[mysql/mysql-connector-java "5.1.25"]
[congomongo "0.4.1"]
Expand Down
72 changes: 59 additions & 13 deletions src/clj/clojuredocs/data.clj
Expand Up @@ -3,28 +3,74 @@

;; Examples

(defn find-examples-for [{:keys [ns name library-url]}]
(mon/fetch :examples
(defn examples [{:keys [limit offset]}]
(mon/fetch :examples :limit limit :skip offset
:sort {:created-at 1}))

(defn find-examples-for
([find-params]
(find-examples-for find-params {}))
([{:keys [ns name library-url]}
{:keys [offset limit]}]
(let [query (merge
{:where {:var.name name
:var.ns ns
:var.library-url library-url
:deleted-at nil}
:sort {:created-at 1}}
{:limit limit :skip offset})]
(apply mon/fetch (apply concat [:examples] query)))))

(defn count-examples-for [{:keys [ns name library-url]}]
(mon/fetch-count :examples
:where {:var.name name
:var.ns ns
:var.library-url library-url
:deleted-at nil}
:sort {:created-at 1}))
:deleted-at nil}))

;; Notes

(defn find-notes-for [{:keys [ns name library-url]}]
(mon/fetch :notes
:where {:var.ns ns
:var.name name
:var.library-url library-url}
:sort {:created-at 1}))
(defn find-notes-for
([find-params]
(find-notes-for find-params {}))
([{:keys [ns name library-url]}
{:keys [offset limit]}]
(mon/fetch :notes
:where {:var.ns ns
:var.name name
:var.library-url library-url}
:sort {:created-at 1}
:skip offset
:limit limit)))

(defn count-notes-for [{:keys [ns name library-url]}]
(mon/fetch-count :notes
:where {:var.name name
:var.ns ns
:var.library-url library-url
:deleted-at nil}))


;; See Alsos

(defn find-see-alsos-for [{:keys [ns name library-url]}]
(mon/fetch-one :see-alsos
(defn find-see-alsos-for
([find-params]
(find-see-alsos-for find-params {}))
([{:keys [ns name library-url]}
{:keys [offset limit]}]
(mon/fetch :see-alsos
:where {:from-var.name name
:from-var.ns ns
:from-var.library-url "https://github.com/clojure/clojure"})))

#_(mon/fetch-one :see-alsos
:where {:from-var.name "map"
:from-var.ns "clojure.core"
:from-var.library-url "https://github.com/clojure/clojure"})

(defn count-see-alsos-for [{:keys [ns name library-url]}]
(mon/fetch-count :see-alsos
:where {:var.name name
:var.ns ns
:var.library-url "https://github.com/clojure/clojure"}))
:var.library-url library-url
:deleted-at nil}))
6 changes: 4 additions & 2 deletions src/clj/clojuredocs/entry.clj
Expand Up @@ -21,7 +21,8 @@
[clojuredocs.pages.common :as common]
[clojuredocs.pages :as pages]
[clojure.pprint :refer (pprint)]
[clojuredocs.api.server :as api.server]
[clojuredocs.internal-api.server :as internal-api.server]
[clojuredocs.external-api :as external-api]
[somnium.congomongo :as mon]
[clojure.edn :as edn]
[clojuredocs.search :as search]
Expand Down Expand Up @@ -98,7 +99,8 @@
(GET "/clojure_core" [] {:status 301 :headers {"Location" "/core-library"}}))

(defroutes _routes
(context "/api" [] api.server/routes)
(context "/api" [] external-api/routes)
(context "/internal-api" [] internal-api.server/routes)
(var pages/routes)
;; Redirect old urls
(var old-url-redirects)
Expand Down
88 changes: 88 additions & 0 deletions src/clj/clojuredocs/external_api.clj
@@ -0,0 +1,88 @@
(ns clojuredocs.external-api
(:require [compojure.core :refer (defroutes GET POST PUT DELETE context)]
[cheshire.core :as cheshire]
[cheshire.generate :as cheshire-gen]
[clojuredocs.data :as data]
[clojuredocs.config :as config]
[clojuredocs.util :as util]
[clojure.pprint :refer [pprint]]))

(cheshire-gen/add-encoder org.bson.types.ObjectId cheshire-gen/encode-str)

(def library-url "https://github.com/clojure/clojure")

(def to-json cheshire/generate-string)
(def from-json cheshire/parse-string)

(defn parse-page-params [{:keys [limit offset]}]
{:offset (try
(Integer/parseInt offset)
(catch NumberFormatException e
0))
:limit (try
(Integer/parseInt limit)
(catch NumberFormatException e
20))})

(defn v1-examples-handler [ns name]
(fn [r] {:body "todo"}))

(defn handle-endpoint [things]
(fn [{:keys [params]}]
(when-let [{:keys [response-key
query-fn
transform-fn
total-fn]} (get things (:thing params))]
(let [{:keys [ns name]} params
v {:ns ns
:name name
:library-url library-url}
{:keys [offset limit]
:as query-opts} (parse-page-params params)
results-only (query-fn v query-opts)
tx-results ((or transform-fn identity) results-only)
total (total-fn v)]
{:body
{:html-url (config/url
(->> ["" ns name]
(remove nil?)
(interpose "/")
(apply str)))
:offset offset
:limit limit
:count (count tx-results)
:total total
:data tx-results}}))))

(def things
{"examples" {:query-fn data/find-examples-for
:all-fn data/examples
:transform-fn (fn [examples]
(->> examples
(map #(dissoc % :_id))
(map #(update-in % [:editors] distinct))
(map #(update-in % [:editors]
(fn [editors]
(remove (fn [ed] (= ed (:author %))) editors))))))
:total-fn data/count-examples-for}
"notes" {:query-fn data/find-notes-for
:total-fn data/count-notes-for}
"see-alsos" {:query-fn data/find-see-alsos-for
:total-fn data/count-see-alsos-for}})


(defroutes _routes
(GET "/:ns/:name/:thing" req (handle-endpoint things)))

(defn json-response [resp]
(-> resp
(assoc-in [:headers "Content-Type"] "application/json;charset=utf-8")
(update-in [:body] to-json)))

(defn wrap-render-json [h]
(fn [r]
(json-response (h r))))

(def routes
(-> _routes
wrap-render-json))
@@ -1,4 +1,4 @@
(ns clojuredocs.api.common
(ns clojuredocs.internal-api.common
(:require [slingshot.slingshot :refer [throw+]]
[schema.core :as s]
[clojuredocs.util :as util]))
Expand Down
@@ -1,9 +1,9 @@
(ns clojuredocs.api.examples
(ns clojuredocs.internal-api.examples
(:require [slingshot.slingshot :refer [throw+]]
[somnium.congomongo :as mon]
[schema.core :as s]
[clojuredocs.util :as util]
[clojuredocs.api.common :as c]))
[clojuredocs.internal-api.common :as c]))
;; Utils

(defn edn-response [payload]
Expand Down
@@ -1,5 +1,5 @@
(ns clojuredocs.api.notes
(:require [clojuredocs.api.common :as c]
(ns clojuredocs.internal-api.notes
(:require [clojuredocs.internal-api.common :as c]
[schema.core :as s]
[somnium.congomongo :as mon]
[slingshot.slingshot :refer [throw+]]))
Expand Down
@@ -1,9 +1,9 @@
(ns clojuredocs.api.see-alsos
(ns clojuredocs.internal-api.see-alsos
(:require [slingshot.slingshot :refer [throw+]]
[somnium.congomongo :as mon]
[schema.core :as s]
[clojuredocs.util :as util]
[clojuredocs.api.common :as c]
[clojuredocs.internal-api.common :as c]
[clojuredocs.search :as search]))

;; Schemas
Expand Down
@@ -1,13 +1,13 @@
(ns clojuredocs.api.server
(ns clojuredocs.internal-api.server
(:require [compojure.core :refer (defroutes GET POST PUT DELETE ANY PATCH) :as cc]
[compojure.route :refer (not-found)]
[somnium.congomongo :as mon]
[clout.core :as clout]
[slingshot.slingshot :refer [try+ throw+]]
[clojuredocs.util :as util]
[clojuredocs.api.examples :as examples]
[clojuredocs.api.see-alsos :as see-alsos]
[clojuredocs.api.notes :as notes]))
[clojuredocs.internal-api.examples :as examples]
[clojuredocs.internal-api.see-alsos :as see-alsos]
[clojuredocs.internal-api.notes :as notes]))

(defroutes _routes
(POST "/examples" [] examples/post-example-handler)
Expand Down
16 changes: 8 additions & 8 deletions src/cljs/clojuredocs/mods/var_page.cljs
Expand Up @@ -68,7 +68,7 @@
(defn req-create-example [ex]
(let [ch (chan)]
(ajax
{:path "/api/examples"
{:path "/internal-api/examples"
:method :post
:data-type :edn
:data ex
Expand Down Expand Up @@ -148,7 +148,7 @@
(let [c (chan)]
(ajax
{:method :patch
:path (str "/api/examples/" _id)
:path (str "/internal-api/examples/" _id)
:data-type :edn
:data {:body body}
:success (fn [{:keys [body] :as resp}]
Expand Down Expand Up @@ -184,7 +184,7 @@
(let [c (chan)]
(ajax
{:method :delete
:path (str "/api/examples/" _id)
:path (str "/internal-api/examples/" _id)
:success (fn [{:keys [body] :as resp}]
(put! c {:success true :data body}))
:error (fn [{:keys [status body] :as r}]
Expand Down Expand Up @@ -246,7 +246,7 @@
(let [{:keys [success res]}
(<! (ajax-chan
{:method :post
:path "/api/notes"
:path "/internal-api/notes"
:data-type :edn
:data {:body note-text
:var (select-keys (:var @!state) [:ns :name :library-url])}}))]
Expand Down Expand Up @@ -279,7 +279,7 @@
(let [{:keys [success res]}
(<! (ajax-chan
{:method :patch
:path (str "/api/notes/" _id)
:path (str "/internal-api/notes/" _id)
:data-type :edn
:data {:body text}}))]
(if success
Expand All @@ -303,7 +303,7 @@
(let [{:keys [success re]}
(<! (ajax-chan
{:method :delete
:path (str "/api/notes/" _id)
:path (str "/internal-api/notes/" _id)
:data-type :edn}))]
(if success
(swap! !state update-in [:notes]
Expand Down Expand Up @@ -339,7 +339,7 @@
(let [{:keys [success res]}
(<! (ajax-chan
{:method :post
:path "/api/see-alsos"
:path "/internal-api/see-alsos"
:data-type :edn
:data {:fq-to-var-name ns-name-str
:from-var (select-keys (:var @!state) [:ns :name :library-url])}}))]
Expand Down Expand Up @@ -374,7 +374,7 @@
(let [{:keys [success res]}
(<! (ajax-chan
{:method :delete
:path (str "/api/see-alsos/" (:_id to-del))
:path (str "/internal-api/see-alsos/" (:_id to-del))
:data-type :edn}))]
(if success
(swap! !state update-in [:see-alsos]
Expand Down