diff options
author | Matthias Andreas Benkard <code@mail.matthias.benkard.de> | 2011-03-10 20:42:13 +0100 |
---|---|---|
committer | Matthias Andreas Benkard <code@mail.matthias.benkard.de> | 2011-03-10 20:42:13 +0100 |
commit | 559777bb473f27fb0d6ec7e739856386e07fee62 (patch) | |
tree | fe5c28f98109915cbf407bb4a67152c982ab04e9 | |
parent | 68a037c4a34f1f09aee68c9bcca9b65aa60a01a2 (diff) |
Add the journal archive.
-rw-r--r-- | mulkcms-hunchentoot.lisp | 7 | ||||
-rw-r--r-- | mulkcms.lisp | 97 |
2 files changed, 79 insertions, 25 deletions
diff --git a/mulkcms-hunchentoot.lisp b/mulkcms-hunchentoot.lisp index 205534f..664658d 100644 --- a/mulkcms-hunchentoot.lisp +++ b/mulkcms-hunchentoot.lisp @@ -13,13 +13,14 @@ (defun dispatch-mulkcms-request (request) (let* ((relative-path (subseq (script-name request) 1))) - (mulkcms::find-mulkcms-request-handler relative-path))) + (or (mulkcms::find-journal-archive-request-handler relative-path) + (mulkcms::find-article-request-handler relative-path)))) (defun setup-handlers () (setq *dispatch-table* - (list* 'dispatch-static-file-request - (create-prefix-dispatcher "/admin" 'handle-admin-request) + (list* (create-prefix-dispatcher "/admin" 'handle-admin-request) 'dispatch-mulkcms-request + 'dispatch-static-file-request *dispatch-table*)) (setq *default-handler* 'handle-mulkcms-request)) diff --git a/mulkcms.lisp b/mulkcms.lisp index 60475ec..638026e 100644 --- a/mulkcms.lisp +++ b/mulkcms.lisp @@ -117,7 +117,78 @@ :edit-button-label "Edit" :generic-commenter-name "Someone"))) -(defun find-mulkcms-request-handler (path &optional action characteristics) +(defprepared find-journal-articles + "SELECT article + FROM article_revisions + WHERE status IN ('published', 'syndicated') + GROUP BY article + HAVING EXISTS (SELECT 1 FROM article_aliases + WHERE article = article_revisions.article + AND alias LIKE 'journal/%') + ORDER BY min(date) DESC" + :column) + +(defun find-journal-archive-request-handler (path &optional action characteristics) + (declare (ignore action)) + (when (string= path "journal") + (lambda () + (with-db + (let* ((articles (find-journal-articles)) + ;; XXX This is probably horriby inefficient. We may want + ;; to try to get FIND-ARTICLE-REVISIONS into the + ;; database as a view or at least a stored procedure. + (revisions (remove-if #'null + (mapcar (lambda (x) + (find-article-params x characteristics)) + articles))) + (displayed-revisions (subseq revisions 0 10)) + (page-skeleton (template "page_skeleton")) + (page-template (template "journal_page")) + (template-params (list :title *site-name* + :root *base-uri* + :site-name *site-name* + :site-subtitle "" + :link "")) + (head (expand-template page-template (list* :head t + :articles displayed-revisions + template-params))) + (body (expand-template page-template (list* :body t + :articles displayed-revisions + template-params)))) + (expand-template page-skeleton (list :title *site-name* + :head head + :body body))))))) + +(defun find-article-params (article characteristics &optional commentary-p) + (let* ((revisions (find-article-revisions article characteristics)) + (comment-data (if commentary-p + (query "SELECT id FROM comments WHERE article = $1" + article + :column) + (list))) + (comment-revision-data + (remove-if #'null + (mapcar (lambda (cid) + (first + (query "SELECT * + FROM comment_revisions + WHERE comment = $1 + AND status IN ('approved', 'trusted') + ORDER BY date DESC" + cid + :lists))) + comment-data))) + (comments (mapcar #'paramify-comment comment-revision-data)) + (revision-data (first revisions))) + (cond ((null revision-data) + nil) + (commentary-p + (paramify-article revision-data comments)) + (t + (paramify-article revision-data))))) + + +(defun find-article-request-handler (path &optional action characteristics) (with-db (when-let ((article (query "SELECT article FROM article_aliases WHERE alias = $1" @@ -131,38 +202,20 @@ WHERE articles.id = $1" article :single!)) - (revisions (find-article-revisions article characteristics)) - (comment-data (query "SELECT id FROM comments WHERE article = $1" - article - :column)) - (comment-revision-data - (remove-if #'null - (mapcar (lambda (cid) - (first - (query "SELECT * - FROM comment_revisions - WHERE comment = $1 - AND status IN ('approved', 'trusted') - ORDER BY date DESC" - cid - :lists))) - comment-data))) - (comments (mapcar #'paramify-comment comment-revision-data)) - (revision-data (first revisions)) + (article-params (find-article-params article characteristics)) (page-skeleton (template "page_skeleton")) (page-template (template page-template-name)) - (template-params (list :title (fourth revision-data) + (template-params (list :title (getf article-params :title) :root *base-uri* :site-name *site-name* :site-subtitle "" :link "")) - (article-params (paramify-article revision-data comments)) (head (expand-template page-template (list* :head t :articles (list article-params) template-params))) (body (expand-template page-template (list* :body t :articles (list article-params) template-params)))) - (expand-template page-skeleton (list :title (fourth revision-data) + (expand-template page-skeleton (list :title (getf article-params :title) :head head :body body)))))))) |