Work with qa url scheme based on forms file system

This commit is contained in:
Marcus Kammer 2024-06-28 17:39:13 +02:00
parent 5ce33edeca
commit 659fa037d5
5 changed files with 26 additions and 20 deletions

View file

@ -1,16 +1,20 @@
(in-package :ml-survey/handlers) (in-package :ml-survey/handlers)
(defparameter *url-key-map*
'((:survey-id . 1)
(:language . 2)
(:questionnaire . 3)))
(defun split-uri (uri) (defun split-uri (uri)
(check-type uri string) (check-type uri string)
(remove-if #'string-empty-p (remove-if #'string-empty-p
(uiop:split-string uri :separator "/"))) (uiop:split-string uri :separator "/")))
(defun get-resource-id (resource request) (defun extract-from (url key)
(case resource (let* ((parts (split-uri url))
(survey (second (split-uri request))))) (index (cdr (assoc key *url-key-map*))))
(when (and parts index)
(defun get-survey-id (request) (nth index parts))))
(get-resource-id 'survey request))
(defun today () (defun today ()
"Return today's date formatted as ISO-8601." "Return today's date formatted as ISO-8601."

View file

@ -1,20 +1,20 @@
(in-package :ml-survey/handlers) (in-package :ml-survey/handlers)
(defun questionnaire-uri-p (uri) (defun questionnaire-uri-p (uri)
"Check if the request URI matches the pattern '/survey/<numeric>/questionnaire/type'" "Check if the request URI matches the pattern '/survey/<numeric>/lang/type'"
(let ((parts (split-uri uri))) (let ((parts (split-uri uri)))
(and (= (length parts) 4) (and (= (length parts) 4)
(string= (first parts) "survey") (string= (first parts) "survey")
(every #'digit-char-p (second parts)) (every #'digit-char-p (second parts))
(string= (third parts) "questionnaire")))) (= 2 (length (third parts))))))
(defun questionnaire-uri (request) (defun questionnaire-uri (request)
(questionnaire-uri-p (request-uri request))) (questionnaire-uri-p (request-uri request)))
(defun process-questionnaire-get (lang) (defun process-questionnaire-get (lang questionnaire)
(check-type lang string) (check-type lang string)
(setf ml-survey:*html-lang* lang) (setf ml-survey:*html-lang* lang)
(ml-survey/views:sus-form)) (ml-survey/views:sus-form questionnaire))
(defun process-questionnaire-post (request survey) (defun process-questionnaire-post (request survey)
(let* ((post-params (post-parameters* request)) (let* ((post-params (post-parameters* request))
@ -25,8 +25,10 @@
(ml-survey/views:questionnaire-submit))) (ml-survey/views:questionnaire-submit)))
(define-easy-handler (questionnaire :uri #'questionnaire-uri) (lang) (define-easy-handler (questionnaire :uri #'questionnaire-uri) (lang)
(let ((s (make-instance 'ml-survey:survey :id (get-survey-id (request-uri*))))) (let ((s (make-instance 'ml-survey:survey
:id (extract-from (request-uri*) :survey-id))))
(cond ((eq (hunchentoot:request-method*) :get) (cond ((eq (hunchentoot:request-method*) :get)
(process-questionnaire-get lang)) (process-questionnaire-get (extract-from (request-uri*) :language)
(extract-from (request-uri*) :questionnaire)))
((eq (hunchentoot:request-method*) :post) ((eq (hunchentoot:request-method*) :post)
(process-questionnaire-post *request* s))))) (process-questionnaire-post *request* s)))))

View file

@ -14,6 +14,7 @@
#:survey-properties-description #:survey-properties-description
#:ensure-data-dir #:ensure-data-dir
#:ensure-data-file-exist #:ensure-data-file-exist
#:ensure-forms-dir
#:forms-dir #:forms-dir
#:forms-list-files #:forms-list-files
#:extract-lang-and-filename #:extract-lang-and-filename

View file

@ -48,7 +48,7 @@
(cdr (assoc "description" (survey-properties survey) :test #'string-equal))) (cdr (assoc "description" (survey-properties survey) :test #'string-equal)))
(defun build-questionnaire-link (survey-id resource) (defun build-questionnaire-link (survey-id resource)
(format nil "/survey/~a/questionnaire~a" survey-id resource)) (format nil "/survey/~a~a" survey-id resource))
(defmethod survey-html ((survey survey)) (defmethod survey-html ((survey survey))
(spinneret:with-html (spinneret:with-html

View file

@ -1,12 +1,11 @@
(in-package :ml-survey/views) (in-package :ml-survey/views)
(defun load-form (lang form-file-name) (defun load-form (lang questionnaire)
"Load a Lisp file containing form definitions." "Load a Lisp file containing form definitions."
(check-type lang string) (check-type lang string)
(check-type form-file-name string) (check-type questionnaire string)
(let* ((relative-path (concatenate 'string "src/views/forms/" lang "/")) (let* ((full-path (uiop:merge-pathnames* (format nil "~a/~a.lisp" lang questionnaire)
(full-path (uiop:merge-pathnames* relative-path (uiop:getcwd))) (ml-survey:ensure-forms-dir))))
(form-path (uiop:merge-pathnames* form-file-name full-path)))
(unless (probe-file form-path) (unless (probe-file form-path)
(error "Form file ~A does not exist." form-path)) (error "Form file ~A does not exist." form-path))
(load form-path)) (load form-path))
@ -31,7 +30,7 @@ available in its environment for full functionality."
(btn-primary (:type "submit") (btn-primary (:type "submit")
(find-l10n "submit" ml-survey:*html-lang* *l10n*)))))) (find-l10n "submit" ml-survey:*html-lang* *l10n*))))))
(defun sus-form () (defun sus-form (questionnaire)
(with-page (:title "SUS Form") (with-page (:title "SUS Form")
(body-header "System Usability Form") (body-header "System Usability Form")
(with-form (load-form ml-survey:*html-lang* "sus.lisp")))) (with-form (load-form ml-survey:*html-lang* questionnaire))))