/ src / ami.lisp
ami.lisp
 1  (in-package #:ami)
 2  
 3  (defmacro input (type classes)
 4    `(:input :type ,type)) 
 5  
 6  (define-error unknown-field-type (field-type))
 7  
 8  ;; Start the application
 9  
10  (defun mito-connect-db ()
11    (mito:connect-toplevel :postgres :host "127.0.0.1" :database-name "ami_test"))
12  
13  (defun is-development ()
14    (let ((env (or (uiop:getenv "AMI_ENV") "DEV")))
15      (string= env "DEV")))
16  
17  (defparameter *ws-updates-conns* (make-hash-table :test 'equal))
18  
19  (defun trigger-update ()
20    (dolist (key (alexandria:hash-table-keys *ws-updates-conns*))
21      (let ((conn (gethash key *ws-updates-conns*)))
22        (websocket-driver:send conn "."))))
23  
24  (defun server-acceptor (env)
25    (let* ((server-name (if (is-development)
26  			  (cadr (split-sequence:split-sequence #\/ (getf env :path-info)))
27  			  (getf env :server-name)))
28  	 (original-path-info (getf env :path-info))
29  	 (path-info (if (is-development)
30  			(format nil "/~{~a/~}" (cddr (split-sequence:split-sequence #\/ (getf env :path-info))))
31  			(getf env :path-info)))
32  	 (method (getf env :request-method))
33  	 (body-params (getf env :body-parameters))
34  	 (app (gethash server-name *apps*)))
35      (if (string= original-path-info "/updates")
36  	(let ((ws (websocket-driver:make-server env))
37  	      (id (fuuid:to-string (fuuid:make-v4))))
38  	  (setf (gethash id *ws-updates-conns*) ws)
39  	  (websocket-driver:on :message ws
40  	      (lambda (message)
41  		(websocket-driver:send ws message)))
42  	  (lambda (responder)
43  	    (declare (ignore responder))
44  	    (websocket-driver:start-connection ws)))
45  	(if app
46  	    (request app method path-info body-params)
47  	    '(404 (:content-type "text/plain") ("Site doesn't exist"))))))
48  
49  (defparameter *handle* nil)
50    
51  (defun stop-app ()
52    (when *handle*
53      (clack:stop *handle*)
54      (setf *handle* nil)))
55  
56  (defun start-app ()
57    (if *handle*
58        (stop-app))
59    ;; (slynk-api:add-hook slynk-api:*pre-reply-hook* #'trigger-update)
60    (mito-connect-db)
61    (setf *handle*
62  	(clack:clackup
63  	 (lack:builder
64  	  :session
65  	  (:static :path "/static/"
66  		   :root #P"./static/")
67  	  (lambda (env)
68  	    (let ((*package* (find-package :ami)))
69  	      (server-acceptor env))))
70  	 :server :hunchentoot :port 1235)))
71