src/routes/rss-routes.lisp
(defpackage murja.routes.rss-routes
(:use :cl)
(:import-from :easy-routes :defroute)
(:import-from :murja.posts.post-db :get-page)
(:import-from :murja.routes.settings-routes :get-settings)
(:import-from :murja.middleware.db :@transaction)
(:import-from :murja.middleware.auth :@authenticated :*user* :@can?))
(in-package :murja.routes.rss-routes)
(defun posts->rss (posts)
(let* ((settings (get-settings))
(title (gethash "rss-title" settings))
(link (gethash "rss-link" settings))
(description (gethash "rss-description" settings))
(lang (gethash "rss-lang" settings))
(mail (gethash "rss-mail" settings))
(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 "/post/~d" (gethash "id" post))
:description (let ((len (length (gethash "content" post))))
(if (> len 500)
(subseq (gethash "content" post)
0 500)
(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)) ()
(let* ((settings (get-settings))
(page-size (gethash "recent-post-count" settings))
(page (get-page 1 page-size :allow-hidden? nil)))
(setf (hunchentoot:content-type*) "application/rss+xml")
(posts->rss page)))