about summary refs log tree commit diff
path: root/web
diff options
context:
space:
mode:
authoredef <edef@edef.eu>2020-08-05T00·59+0000
committeredef <edef@edef.eu>2020-08-08T18·23+0000
commit311511385455f680aedf78aab761fcebf3ca7731 (patch)
treed0d677945734a8e97d04ef897c9c417a10969510 /web
parent3049f31d2824b95c8a2e13c6b919847de6bd0705 (diff)
feat(web/panettone): implement shorthand issue URLs r/1617
Fix #32

Change-Id: I6ccec959201673850b4b56a44734a2874aad5856
Reviewed-on: https://cl.tvl.fyi/c/depot/+/1648
Reviewed-by: glittershark <grfn@gws.fyi>
Reviewed-by: edef <edef@edef.eu>
Tested-by: BuildkiteCI
Diffstat (limited to 'web')
-rw-r--r--web/panettone/src/model.lisp2
-rw-r--r--web/panettone/src/panettone.lisp20
2 files changed, 16 insertions, 6 deletions
diff --git a/web/panettone/src/model.lisp b/web/panettone/src/model.lisp
index 300ee19b6b..a606174dab 100644
--- a/web/panettone/src/model.lisp
+++ b/web/panettone/src/model.lisp
@@ -155,7 +155,7 @@ its new value will be formatted using ~A into NEW-VALUE"))
 (define-condition issue-not-found (error)
   ((id :type integer
        :initarg :id
-       :reader not-found-id
+       :reader id
        :documentation "ID of the issue that was not found"))
   (:documentation
    "Error condition for when an issue requested by ID is not found"))
diff --git a/web/panettone/src/panettone.lisp b/web/panettone/src/panettone.lisp
index 7594c3ab24..cf9c608b07 100644
--- a/web/panettone/src/panettone.lisp
+++ b/web/panettone/src/panettone.lisp
@@ -369,8 +369,9 @@
              (render/new-comment (id issue))))))))))
 
 (defun render/not-found (entity-type)
+  (setf (hunchentoot:return-code*) 404)
   (render ()
-    (:h1 (who:esc entity-type) "Not Found")))
+    (:h1 (who:esc entity-type) " Not Found")))
 
 ;;;
 ;;; HTTP handlers
@@ -452,10 +453,12 @@
 (defroute show-issue
     ("/issues/:id" :decorators (@auth-optional @handle-issue-not-found))
     (&path (id 'integer))
-  (let* ((issue (model:get-issue id))
-         (*title* (format nil "~A | Panettone"
-                          (subject issue))))
-    (render/issue issue)))
+  (when id
+    (let* ((issue (model:get-issue id))
+           (*title* (format nil "~A | Panettone"
+                            (subject issue))))
+      (render/issue issue))
+    (render/not-found "Issue")))
 
 (defroute edit-issue
     ("/issues/:id/edit" :decorators (@auth @handle-issue-not-found))
@@ -516,6 +519,13 @@
   (setf (hunchentoot:content-type*) "text/css")
   (apply #'lass:compile-and-write panettone.css:styles))
 
+(defroute shorthand-issue
+    ("/:id" :decorators (@auth-optional))
+    (&path (id 'integer))
+  (if id
+      (hunchentoot:redirect (format nil "/issues/~A" id))
+      (render/not-found "Route")))
+
 (defvar *acceptor* nil
   "Hunchentoot acceptor for Panettone's web server.")