Yu-Gi-Oh! Deck Building and Card Inventory Management web interface written in Common Lisp, utilizing HTMX.
No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

139 líneas
4.8KB

  1. (in-package #:cl-deck-builder2.web)
  2. (defparameter *current-category* nil)
  3. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  4. (defun render-category (id &key (tpl #P"category/index.html") env)
  5. "Helper function. Use RENDER-WITH-ENV to display template TPL with environment ENV.
  6. ID is the CATEGORY we wish to render.
  7. TODO etypecase? defmethod?"
  8. (let ((found (ignore-errors
  9. (find-dao 'category :id id))))
  10. (render-with-env tpl
  11. (append env
  12. `(:active "/category"
  13. :category ,found
  14. :categories ,(select-category)
  15. :children ,(ignore-errors (category-full-tree :node.name (category-name-of found)))
  16. :id ,(ignore-errors (mito:object-id found)))))))
  17. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  18. (defroute ("/category" :method :GET) (&key _parsed)
  19. "Category Viewer Main Route.
  20. TODO Parameters: ID The desired CATEGORY ID."
  21. (with-logged-in-user
  22. (render-category (query-param "id" _parsed))))
  23. (defroute ("/category/search" :method :POST) (&key _parsed)
  24. "POST Category Search Route.
  25. TODO Implement this?"
  26. (with-logged-in-user
  27. (render-category (query-param "id" _parsed))))
  28. (defroute ("/category/:id/view" :method :GET) (&key id)
  29. "Category Viewer Single Route.
  30. TODO Parameters: ID The desired CATEGORY ID."
  31. (with-logged-in-user
  32. (render-category id)))
  33. (defroute ("/category/list" :method :GET) (&key _parsed)
  34. "GET route for the list of categories."
  35. (v:info :web "GET /category/list => ~a" _parsed)
  36. (with-logged-in-user
  37. (render-category (query-param "id" _parsed))))
  38. (defroute ("/category/:id/delete" :method :DELETE) (&key id)
  39. "DELETE a CATEGORY.
  40. TODO Parameters: ID The ID of the CATEGORY to remove.
  41. TODO Also delete associated deck metadata?"
  42. (v:info :web "DELETE /category/:id/delete" id)
  43. (handler-case
  44. (ratify:with-parsed-forms
  45. ((:integer id))
  46. (let ((found (find-dao 'category :id id)))
  47. (when found
  48. (category-delete-tree (category-name-of found))
  49. (v:info :web "DELETE /category/:id/delete OK" id)
  50. (flash-message (_ "Success!")))))
  51. (ratify:combined-error (e)
  52. (flash-error e))))
  53. (defroute ("/category/:id/rename" :method :POST) (&key id _parsed)
  54. "POST route to RENAME a CATEGORY.
  55. TODO Parameters: NAME The new name of the CATEGORY. ID of the CATEGORY to be RENAMEd."
  56. (v:info :web "POST /category/~d/rename => ~a" id _parsed)
  57. (let ((name (query-param "name" _parsed)))
  58. (handler-case
  59. (ratify:with-parsed-forms
  60. ((:integer id)
  61. (:string name))
  62. (if (category-rename (find-dao 'category :id id) name)
  63. (format nil "OK!")
  64. (format nil "Error!")))
  65. (ratify:combined-error (e)
  66. (flash-error e)))))
  67. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  68. (defroute ("/category/fake-data" :method :GET) ()
  69. "Route to generate new fake CATEGORY data.
  70. TODO Parameters: NAME The name of the new child CATEGORY. ID The parent of the new child CATEGORY."
  71. (v:info :web "GET /category/fake-data")
  72. (category-insert-fake-data)
  73. (v:info :web "GET /category/fake-data OK"))
  74. (defroute ("/category/new-parent" :method :POST) (&key _parsed)
  75. "Create a new parent by NAME. We use CATEGORY-INSERT-RIGHT-OF."
  76. (v:info :web "POST /category/new-parent => ~a" _parsed)
  77. (let ((id (or (query-param "id" _parsed) 0))
  78. (name (query-param "name" _parsed)))
  79. (handler-case
  80. (ratify:with-parsed-forms
  81. ((:integer id)
  82. (:string name))
  83. (let ((left-of (ignore-errors
  84. (category-name-of (find-dao 'category :id id)))))
  85. (category-insert-right-of name left-of)))
  86. (ratify:combined-error (e)
  87. (flash-error e)))))
  88. (defroute ("/category/new-child" :method :POST) (&key _parsed)
  89. "POST route for a new child CATEGORY.
  90. TODO Parameters: NAME The name of the new child CATEGORY. ID The parent of the new child CATEGORY."
  91. (v:info :web "POST /category/new-child => ~a" _parsed)
  92. (let ((id (query-param "id" _parsed))
  93. (name (query-param "name" _parsed)))
  94. (handler-case
  95. (ratify:with-parsed-forms
  96. ((:integer id)
  97. (:string name))
  98. (let ((left-of (ignore-errors
  99. (category-name-of (find-dao 'category :id id)))))
  100. (category-insert-new-child name left-of)
  101. (format nil "OK!")))
  102. (ratify:combined-error (e)
  103. (flash-error e)))))
  104. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  105. (defroute ("/category/explain" :method :GET) ()
  106. "TODO This needs to be incorporated into the documentation."
  107. (with-logged-in-user
  108. (render-with-env #P"category/explain.html"
  109. `(:active "/category"
  110. :categories ,(select-category)))))