Skip to content

Instantly share code, notes, and snippets.

@archimag
Created December 25, 2014 22:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save archimag/69470846e9d2650366e8 to your computer and use it in GitHub Desktop.
Save archimag/69470846e9d2650366e8 to your computer and use it in GitHub Desktop.
;; inventory.lisp
(ql:quickload "restas.wookie")
(ql:quickload "mongo-cl-driver.cl-async")
(ql:quickload "cl-json")
(restas:define-module #:restas-demo.mongo-crud-tutorial
(:use #:cl #:iter #:alexandria #:blackbird #:mongo.sugar)
(:shadowing-import-from #:blackbird #:finally))
(in-package #:restas-demo.mongo-crud-tutorial)
(defmethod cl-json:encode-json ((o mongo.bson:object-id) &optional stream)
(cl-json:encode-json (mongo.bson:format-object-id o) stream))
(defmacro with-mongo-db ((db-symbol) &body body)
(with-unique-names (client1 client2)
`(let (,client1)
(chain (mongo:create-mongo-client :cl-async)
(:attach (,client2)
(setf ,client1 ,client2)
(make-instance 'mongo:database :mongo-client ,client2 :name "test"))
(:attach (,db-symbol)
,@body)
(:finally ()
(mongo:mongo-client-close ,client1))))))
(defun inventory (db)
(mongo:collection db "inventory"))
(restas:define-route inventory-view ("/")
(:decorators #'restas.wookie:@keep-context)
(:renderer 'cl-json:encode-json-plist-to-string)
#|==========================================================================|#
(with-mongo-db (db)
(alet ((obj (mongo:find (inventory db))))
(list :insert (restas:genurl* 'inventory-insert)
:insert-list (restas:genurl* 'inventory-insert-list)
:update (restas:genurl* 'inventory-update)
:update-multi (restas:genurl* 'inventory-update-multi)
:update-upsert (restas:genurl* 'inventory-update-upsert)
:remove-all (restas:genurl* 'inventory-remove-all)
:inventory obj))))
(restas:define-route inventory-cursor ("/cursor")
(:decorators #'restas.wookie:@keep-context)
(:renderer 'cl-json:encode-json-to-string)
#|==========================================================================|#
(with-mongo-db (db)
(mongo:with-cursor (cursor (inventory db))
(let (items)
(wait (mongo:iterate-cursor cursor
(lambda (item)
(push item items)))
items)))))
(restas:define-route inventory-insert ("/insert")
(:decorators #'restas.wookie:@keep-context)
#|==========================================================================|#
(with-mongo-db (db)
(wait (mongo:insert (inventory db)
($ "item" "ABC1"
"details" ($ "model" "14Q3"
"manufacturer" "XYZ Company")
"stock" (list ($ "size" "S" "qty" 25)
($ "size" "M" "qty" 50))
"category" "clothing"))
(restas:redirect 'inventory-view))))
(restas:define-route inventory-insert-list ("/insert-list")
(:decorators #'restas.wookie:@keep-context)
#|==========================================================================|#
(with-mongo-db (db)
(wait (mongo:insert (inventory db)
(list ($ "item" "ABC2"
"details" ($ "model" "14Q3"
"manufacturer" "M1 Corporation")
"stock" (list ($ "size" "M"
"qty" 50))
"category" "clothing")
($ "item" "MNO2"
"details" ($ "model" "14Q3"
"manufacturer" "ABC Company")
"stock" (list ($ "size" "S" "qty" 5)
($ "size" "M" "qty" 5)
($ "size" "L" "qty" 1))
"category" "clothing")
($ "item" "IJK2"
"details" ($ "model" "14Q2"
"manufacturer" "M5 Corporation")
"stock" (list ($ "size" "S" "qty" 5)
($ "size" "L" "qty" 1))
"category" "houseware")
#|===========================================|#
($ "item" "BE10"
"details" ($ "model" "14Q2"
"manufacturer" "XYZ Company")
"stock" (list ($ "size" "L" "qty" 5))
"category" "clothing")
($ "item" "ZYT1"
"details" ($ "model" "14Q1"
"manufacturer" "ABC Company")
"stock" (list ($ "size" "S" "qty" 5)
($ "size" "M" "qty" 5))
"category" "houseware")))
(restas:redirect 'inventory-view))))
(restas:define-route inventory-update ("/update")
(:decorators #'restas.wookie:@keep-context)
#|==========================================================================|#
(with-mongo-db (db)
(wait (mongo:update (inventory db)
($ "item" "MNO2")
($ "$set" ($ "category" "apparel"
"details" ($ "model" "14Q3"
"manufacturer" "XYZ Company"))
"$currentDate" ($ "lastModified" t)))
(restas:redirect 'inventory-view))))
(restas:define-route inventory-update-multi ("/update-multi")
(:decorators #'restas.wookie:@keep-context)
#|==========================================================================|#
(with-mongo-db (db)
(wait (mongo:update (inventory db)
($ "category" "clothing")
($ "$set" ($ "category" "apparel")
"$currentDate" ($ "lastModified" t))
:multi-update t)
(restas:redirect 'inventory-view))))
(restas:define-route inventory-update-upsert ("/update-upsert")
(:decorators #'restas.wookie:@keep-context)
#|==========================================================================|#
(with-mongo-db (db)
(wait (mongo:update (inventory db)
($ "item" "TBD1")
($ "item" "TBD1"
"details" ($ "model" "14Q4"
"manufacturer" "ABC Company")
"stock" (list ($ "size" "S" "qty" "25"))
"category" "houseware")
:upsert t)
(restas:redirect 'inventory-view))))
(restas:define-route inventory-remove-all ("/remove-all")
(:decorators #'restas.wookie:@keep-context)
#|==========================================================================|#
(with-mongo-db (db)
(wait (mongo:remove (inventory db) ($))
(restas:redirect 'inventory-view))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; start
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(restas.wookie:start '#:restas-demo.mongo-crud-tutorial :port 8080)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment