-
Notifications
You must be signed in to change notification settings - Fork 2
/
core.clj
89 lines (75 loc) · 2.13 KB
/
core.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
(ns shortener.core
(:use [compojure.core :only (GET PUT POST defroutes)])
(:require (compojure handler route)
[ring.util.response :as response])
(:require [shortener.db :as db]))
(declare app* request)
(def counter (atom 0))
(defn addHttp
[url]
(if (.startsWith url "http")
url
(str "http://" url)))
(defn redirect
[id]
(let [url (db/get-url-by-id id)]
(if (seq url)
(response/redirect url)
{:status 404
:body (format "haven't assign %s" id)})))
(defn shorten!
[url id]
(when-not (db/get-url-by-id id)
(db/insert-db id url)
id))
(defn retain
([url id]
(if-let [id (shorten! url id)]
{:status 201
:headers {"Location" id}
:body (format "url %s assigned to %s" url id)}
{:status 409
:body (format "%s is already taken" id)}))
([url]
(let [id (swap! counter inc)
id (Long/toString id)]
(or (shorten! url id)
(recur url)))))
(retain "https://github.com/lzwjava/url-shortener/blob/master/README.md"
"readme2")
(defn listUrl []
(flatten (interpose "<br>" (map (fn [m]
(let [{:keys [id url]} m]
(list id " " url)))
(db/select-all)))))
(defroutes
app*
(GET "/" request "it's ")
(GET "/list" [] (listUrl))
(GET "/assign/:id" [id url]
(retain url id))
(GET "/:id" [id] (redirect id))
(POST "/" [url]
(if (empty? url)
{:status 400 :body "no 'url' parameter provided"}
(retain url)))
(compojure.route/not-found "Sorry,there's nothing here!"))
(def app (compojure.handler/api app*))
(use '[ring.adapter.jetty :only (run-jetty)])
;(.stop server)
(try
(.stop @server)
(catch Exception e))
(def server (ref 'a))
(defn run-server []
;(use 'ring.adapter.jetty)
(dosync (ref-set server (run-jetty #'app
{:host "127.0.0.1"
:port 8085 :join? false}))))
(defn init-counter []
(swap! counter (fn [_] (db/count-db))))
(defn -main [& args]
(init-counter)
(run-server))
(-main)
;(empty? nil)