Add the RSS feed for Florian :P

This commit is contained in:
Aaron Fischer 2017-04-23 22:33:28 +02:00
parent 7429e12dbe
commit ebd0713eae
8 changed files with 96 additions and 22 deletions

View file

@ -4,6 +4,9 @@
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>yenu -- the image sharing tool for friends</title>
{% if identity %}
<link rel="alternate" type="application/atom+xml" title="Images" href="/feed?password={{ passwordhash }}" />
{% endif %}
</head>
<body>
<nav class="navbar navbar-toggleable-md bg-inverse navbar-inverse">
@ -42,6 +45,13 @@
</li>
-->
{% endifequal %}
<li class="nav-item">
<a class="nav-link" href="/feed?password={{ passwordhash }}" >
<span class="fa fa-rss-square"></span>
RSS-Feed
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/logout">
<span class="fa fa-sign-out"></span>

View file

@ -3,6 +3,7 @@
[yenu.layout :refer [error-page]]
[yenu.routes.auth :refer [auth-routes]]
[yenu.routes.core :refer [core-routes]]
[yenu.routes.feed :refer [feed-routes]]
[yenu.routes.admin :refer [admin-routes]]
[compojure.route :as route]
[yenu.env :refer [defaults]]
@ -19,6 +20,10 @@
(wrap-routes middleware/wrap-csrf)
(wrap-routes middleware/wrap-identity)
(wrap-routes middleware/wrap-formats))
(-> #'feed-routes
(wrap-routes middleware/wrap-identity)
(wrap-routes middleware/wrap-formats)
(wrap-routes middleware/wrap-auth))
(-> #'core-routes
(wrap-routes middleware/wrap-csrf)
(wrap-routes middleware/wrap-formats)

View file

@ -6,6 +6,8 @@
[yenu.helpers.images :as image-helper]
[ring.middleware.anti-forgery :refer [*anti-forgery-token*]]
[clj-time.format :as time-format]
[yenu.config :refer [env]]
[digest :as digest]
[clj-time.core :as time])
(:use [markdown.core]))
@ -18,9 +20,7 @@
(filter/add-filter! :markdown-to-html md-to-html-string)
(filter/add-filter! :parse-date #(time/to-time-zone (time-format/parse %) (time/default-time-zone)))
(defn render
"renders the HTML template located relative to resources/templates"
[template & [params]]
(defn render-file [template & [params]]
(content-type
(ok
(parser/render-file
@ -29,9 +29,19 @@
:page template
:csrf-token *anti-forgery-token*
:servlet-context *app-context*
:passwordhash (digest/md5 (:user-password env))
:identity *identity*)))
"text/html; charset=utf-8"))
(defn render [string contenttype]
(content-type
(-> (ok string)
(assoc :servlet-context *app-context*
:csrf-token *anti-forgery-token*
:passwordhash (digest/md5 (:user-password env))
:identity *identity*))
(str contenttype "; charset=utf-8")))
(defn error-page
"error-details should be a map containing the following keys:
:status - error status

View file

@ -16,6 +16,8 @@
[buddy.auth.accessrules :refer [restrict]]
[ring.util.response :refer [redirect]]
[buddy.auth.accessrules :refer [success error]]
[clojure.tools.logging :as log]
[digest :as digest]
[buddy.auth :refer [authenticated?]])
(:import [javax.servlet ServletContext]))
@ -75,8 +77,15 @@
true
(error "Not a creator."))))
(defn external-access-with-pw [request]
(if (= (get (:query-params request) "password") (digest/md5 (:user-password env)))
true
(error "Wrong password.")))
(def rules
[{:uris ["/upload" "/statistics" "/comments"]
[{:uris ["/feed"]
:handler external-access-with-pw}
{:uris ["/upload" "/statistics" "/comments"]
:handler creator-access}
{:pattern #"^/.*"
:handler authenticated?}])

View file

@ -46,12 +46,12 @@
(defn comment-stream []
(let [comments (db/get-recent-comments {:num-comments 20})]
(layout/render "comments.html" {:comments comments})))
(layout/render-file "comments.html" {:comments comments})))
(defn edit-image-form [id request]
(let [image (db/get-image {:id id})
tags (db/get-tags-for-image {:id id})]
(layout/render "admin/upload.html" {:image image :tags tags})))
(layout/render-file "admin/upload.html" {:image image :tags tags})))
(defn edit-image! [id title description tags request]
(db/edit-image! {:id id :title title :description description})
@ -63,7 +63,7 @@
(defroutes admin-routes
(GET "/upload" [:as request]
(-> (layout/render
(-> (layout/render-file
"admin/upload.html"
{:flash (:flash request)})))
(POST "/upload" [file title description tags]
@ -93,6 +93,6 @@
(assoc :flash {:message "Bild wurde bearbeitet" :type "success"})))
(GET "/statistics" []
(layout/render "statistics.html"))
(layout/render-file "statistics.html"))
(GET "/comments" []
(comment-stream)))

View file

@ -28,7 +28,7 @@
(defroutes auth-routes
(GET "/login" [:as request]
(layout/render "login.html", {:flash (:flash request)}))
(layout/render-file "login.html", {:flash (:flash request)}))
(POST "/login" [] login!)
(GET "/logout" [] logout!))

View file

@ -5,6 +5,10 @@
[ring.util.response :refer [redirect file-response]]
[yenu.helpers.images :as images]
[hiccup.core :as h]
[hiccup.page :as p]
[clj-time.format :as time-format]
[clj-time.core :as time]
[yenu.config :refer [env]]
[yenu.db.core :as db]))
(defn number-of-pages [images-on-page]
@ -50,25 +54,25 @@
offset (* (dec current) image-count)
pages (number-of-pages image-count)
images (db/get-all-images {:offset offset :count image-count})]
(layout/render "index.html"
{:images images
:flash (:flash request)
:pagination (pagination pages current)
:pagination-mobile (pagination-mobile pages current)})))
(layout/render-file "index.html"
{:images images
:flash (:flash request)
:pagination (pagination pages current)
:pagination-mobile (pagination-mobile pages current)})))
(defn detail-page [image-id request]
(let [image (db/get-image {:id image-id})
next-img (db/get-next-image {:image-date (:created_at image)})
prev-img (db/get-prev-image {:image-date (:created_at image)})
saved-author (get-in request [:cookies "author" :value])]
(layout/render "detail.html"
{:image image
:flash (:flash request)
:next-image next-img
:prev-image prev-img
:tags (db/get-tags-for-image {:id (:id image)})
:saved-author saved-author
:comments (db/get-comments-for-image {:image_id (:id image)})})))
(layout/render-file "detail.html"
{:image image
:flash (:flash request)
:next-image next-img
:prev-image prev-img
:tags (db/get-tags-for-image {:id (:id image)})
:saved-author saved-author
:comments (db/get-comments-for-image {:image_id (:id image)})})))
(defn add-comment! [image-id request]
(let [author (:author (:params request))

View file

@ -0,0 +1,36 @@
(ns yenu.routes.feed
(:require [hiccup.core :as h]
[compojure.core :refer [defroutes GET]]
[clj-time.format :as time-format]
[clj-time.core :as time]
[yenu.config :refer [env]]
[yenu.layout :refer [render]]
[yenu.db.core :as db])
(:use [markdown.core]))
(defn rss-feed []
(let [entries (db/get-all-images {:offset 0 :count 25})
with-ts #(time/to-time-zone (time-format/parse %) (time/default-time-zone))]
(str
"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
(h/html
[:feed {:xmlns "http://www.w3.org/2005/Atom"}
[:author [:name "Aaron Fischer"]]
[:author [:name "Beatrice Fischer"]]
[:title "yenu -- the image sharing tool for friends"]
[:id (str "https://yenu.de/")]
[:updated (with-ts (:created_at (first entries)))]
(for [e entries]
[:entry
[:title (h/h (:title e))]
[:link {:href (str "https://yenu.de/show/" (:id e)) :rel "alternate"}]
[:id (str "https://yenu.de/show/" (:id e))]
[:updated (with-ts (:created_at e))]
[:summary (h/h (:title e))]
[:content {:type "xhtml"}
[:div {:xmlns "http://www.w3.org/1999/xhtml"}
(md-to-html-string (h/h (:description e)))]]])]))))
(defroutes feed-routes
(GET "/feed" []
(render (rss-feed) "text/xml")))