src/routes/rss-routes.lisp
(in-package :murja.routes.rss-routes)
(defun posts->rss (posts)
(let* ((title (rss-title))
(link (rss-link))
(description (rss-description))
(lang (rss-lang))
(output (make-string-output-stream)))
(xml-emitter:with-rss2 (output)
(xml-emitter:rss-channel-header title
link
:description description
:language lang)
(dolist (post posts)
(xml-emitter:rss-item (gethash "title" post)
:link (format nil "~a/post/~d" link (gethash "id" post))
:description (gethash "content" post)
:author (gethash "nickname"
(gethash "creator" post))
:pubdate (gethash "created_at" post))))
(get-output-stream-string output)))
(defroute rsssss ("/api/rss" :method :get
:decorators ( @transaction)) ()
(settings:with-cache
(let ((lisp-fixup:*rfc822* t))
(let* ((if-modified-since (when (hunchentoot:header-in* :if-modified-since)
(lisp-fixup:if-modified-since->simpledate-timestamp
(hunchentoot:header-in* :if-modified-since))))
(page (get-page 1 (page-size) :allow-hidden? nil
:modified-since if-modified-since))
(last-modified
;; this application's tz handling is a fucking joke
(str:replace-all "EST" "GMT"
(lisp-fixup:fix-timestamp (caar (murja.posts.post-db:last-modified*))))))
(setf (hunchentoot:content-type*) "application/rss+xml")
(setf (hunchentoot:header-out "Last-Modified") last-modified)
(posts->rss page)))))