src/view/rss.lisp
(defpackage murja.view.rss
(:use :cl :binding-arrows :spinneret :murja.rss.reader-db)
(:import-from :murja.view.components.tabs :deftab)
(:import-from :murja.middleware.auth :*user*)
(:import-from :murja.model.user :user-id))
(in-package :murja.view.rss)
(deftab rss-single-item (:url "/blog/feeds/:feed-id/item/:item-id"
:subtab rss
:require-login t
:captured-url-params (feed-id item-id))
(let* ((post-row (postmodern:query "UPDATE blog.feed_item
SET read_at = now()
WHERE id = $1 AND feed = $2
RETURNING id, title, description, link, author, pubdate" item-id feed-id :list)))
(destructuring-bind (id title description link author pubdate) post-row
(let ((p (make-instance 'murja.model.post:RSS-Post
:created-at pubdate
:id nil
:tags nil
:creator (make-instance 'murja.model.user:user
:nickname author)
:content description
:title title
:rss-link link)))
(murja.view.components.blogpost:blogpost p)))))
(deftab rss-single-feed (:url "/blog/feeds/:feed-id"
:subtab rss
:params (&get archived)
:require-login t
:captured-url-params (feed-id archived))
(let ((items (postmodern:query
"SELECT id, fetched, title, link, author, pubdate
FROM blog.feed_item
WHERE feed = $1 AND (read_at is null OR $2) AND pubdate <= now()
ORDER BY pubdate DESC" feed-id (not (not archived))))
(feed-name (caar (postmodern:query "SELECT name FROM blog.feed_subscription WHERE id = $1" feed-id)))
(lisp-fixup:*rfc822* t))
(:h* ("~a (~d)" feed-name (length items)))
(:div
(:a :href (str:replace-all "?archived=NIL" ""
(easy-routes:genurl 'rss-single-feed :feed-id feed-id :archived (not archived)))
(if archived
"Show only unread"
"Show all")))
(:ul
(dolist (item items)
(destructuring-bind (id fetched title link author pubdate) item
(:li (:a :href (easy-routes:genurl 'rss-single-item :feed-id feed-id :item-id id) title)
(:section ("Published ~a" (lisp-fixup:fix-timestamp pubdate)))))))))
(deftab rss (:url "/blog/feeds/"
:title "RSS Feeds"
:require-login t)
(let ((feeds (get-user-feeds2 (user-id *user*) nil))
(lisp-fixup:*rfc822* t))
(:ul.flowy-list
(dolist (feed feeds)
(destructuring-bind (id name url count last-modified) feed
(:li.flowy-list-item
(:h*
(:a :href (easy-routes:genurl 'rss-single-feed :feed-id id) (format nil "~a (~d)" name count)))
(:div "Feed is located in " (:a :href url url))
(:div ("Last updated ~a" (unless (equalp last-modified :NULL)
(lisp-fixup:fix-timestamp last-modified))))))))))