Yu-Gi-Oh! Deck Building and Card Inventory Management web interface written in Common Lisp, utilizing HTMX.
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

139 lignes
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)))))