Skip to content

Instantly share code, notes, and snippets.

@pjagielski
Last active November 23, 2015 19:43
Show Gist options
  • Save pjagielski/2b9bfabc28c5dc176d7b to your computer and use it in GitHub Desktop.
Save pjagielski/2b9bfabc28c5dc176d7b to your computer and use it in GitHub Desktop.
clojure-web
(ns jinkubator.endpoint.api
(:require [compojure.api.sweet :refer :all]
[ring.util.http-response :refer [ok]]
[schema.core :as s]))
(s/defschema Message
{:message s/Str})
(s/defschema MessageList
[Message])
(s/defschema PosNumber
(s/constrained Long
pos? 'pos))
(defn- string-to-numbers [s]
(map (fn [x] (Integer/parseInt (str x))) s))
(defn- nip? [v]
(let [weights [6, 5, 7, 2, 3, 4, 5, 6, 7]
nip-numbers (string-to-numbers v)]
(as->
nip-numbers $
(map * $ weights)
(reduce + $)
(mod $ 11)
(= $ (last nip-numbers)))))
(s/defschema NIP
(s/constrained String
nip? 'nip))
(defn api-endpoint [config]
(api
(swagger-ui "/swagger")
(swagger-docs)
(GET* "/nip/:nip" []
:path-params [nip :- NIP]
(ok))
(GET* "/messages" []
:return MessageList
(ok
[{:message "Hello World"}]))
(GET* "/messages/:id" []
:path-params [id :- PosNumber]
:return Message
(ok
{:message (str (inc id))}))))
(ns jinkubator.endpoint.example
(:require [compojure.core :refer :all]
[compojure.api.sweet :as ca]
[clojure.java.io :as io]
[ring.util.http-response :refer [ok]]))
(defn example-endpoint [config]
(context "/wjug" []
(GET "/prone" []
(throw (RuntimeException. "hello")))
(GET "/" []
(io/resource "public/index.html"))))
(ns jinkubator.system
(:require [com.stuartsierra.component :as component]
[duct.component.endpoint :refer [endpoint-component]]
[duct.component.handler :refer [handler-component]]
[duct.middleware.not-found :refer [wrap-not-found]]
[meta-merge.core :refer [meta-merge]]
[ring.component.jetty :refer [jetty-server]]
[ring.middleware.defaults :refer [wrap-defaults api-defaults]]
[prone.middleware :refer [wrap-exceptions]]
[jinkubator.endpoint.example :refer [example-endpoint]]
[jinkubator.endpoint.api :refer [api-endpoint]]))
(def base-config
{:app {:middleware [[wrap-not-found :not-found]
[wrap-defaults :defaults]
[wrap-exceptions]]
:not-found "Resource Not Found"
:defaults (meta-merge api-defaults {:static {:resources "public"}})}})
(defn new-system [config]
(let [config (meta-merge base-config config)]
(-> (component/system-map
:app (handler-component (:app config))
:http (jetty-server (:http config))
:example (endpoint-component example-endpoint)
:api (endpoint-component api-endpoint))
(component/system-using
{:http [:app]
:app [:example :api]}))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment