diff of af7b988ab7e5f7558a8242566e079c1e17595134
af7b988ab7e5f7558a8242566e079c1e17595134
diff --git a/elm-frontti/src/Ajax_cmds.elm b/elm-frontti/src/Ajax_cmds.elm
index cbebc54..3619d46 100644
--- a/elm-frontti/src/Ajax_cmds.elm
+++ b/elm-frontti/src/Ajax_cmds.elm
@@ -166,3 +166,8 @@ deleteFeed feed_id =
, body = Http.emptyBody
, timeout = Nothing
, tracker = Nothing}
+
+getFeedMeta =
+ Http.get
+ { url = "/api/user/feeds/meta"
+ , expect = Http.expectJson FeedMetaReceived Feeds.metadataDecoder}
diff --git a/elm-frontti/src/FeedView.elm b/elm-frontti/src/FeedView.elm
index cd5320d..c9bf244 100644
--- a/elm-frontti/src/FeedView.elm
+++ b/elm-frontti/src/FeedView.elm
@@ -62,7 +62,7 @@ readerState_str state =
SingleFeed -> "SingleFeed"
FeedManager -> "FeedManager"
-feeds feedReaderState show_archived settings zone fs new_feed =
+feeds feedReaderState show_archived settings zone fs new_feed metadata =
let new_feed_state = Maybe.withDefault (NewFeed "" "") new_feed
in
div [ id "feeds" ]
@@ -90,4 +90,11 @@ feeds feedReaderState show_archived settings zone fs new_feed =
, onInput SetFeedUrl
, value new_feed_state.url
, type_ "text"] []
- , murja_button [ onClick (AddFeed new_feed_state)] [ text "Add a feed"]]
+ , murja_button [ onClick (AddFeed new_feed_state)] [ text "Add a feed"]
+ , case metadata of
+ Just meta ->
+ details [] [ summary [] [ text "Latest feed updates at: "]
+ , ul []
+ ( meta.last_update_timestamps
+ |> List.map (\timestamp -> li [] [ text timestamp]))]
+ Nothing -> text "Metadata didn't load"]
diff --git a/elm-frontti/src/Feeds.elm b/elm-frontti/src/Feeds.elm
index 620efdc..48574da 100644
--- a/elm-frontti/src/Feeds.elm
+++ b/elm-frontti/src/Feeds.elm
@@ -36,6 +36,16 @@ type alias NewFeed =
{ name: String
, url: String}
+type alias FeedMetadata =
+ { last_update_timestamps: List String}
+
+-- metadata decoder
+
+metadataDecoder = Decode.succeed FeedMetadata
+ |> decodeApply (Decode.field "last-update-timestamps" (Decode.list Decode.string))
+
+-- feedDecoder
+
creatorDecoder = Decode.field "creator" Creator.creatorDecoder
urlDecoder = Decode.field "url" Decode.string
nameDecoder = (Decode.field "name" Decode.string)
diff --git a/elm-frontti/src/Main.elm b/elm-frontti/src/Main.elm
index e58f29e..15bd91a 100644
--- a/elm-frontti/src/Main.elm
+++ b/elm-frontti/src/Main.elm
@@ -67,7 +67,7 @@ subscriptions _ = Sub.batch
[ tags ReceivedTag
, aceStateUpdate AceStateUpdate]
-initialModel url key viewstate = Model viewstate Nothing False False [] Nothing LoggedOut key url Nothing Time.utc [] [] Nothing PerFeed
+initialModel url key viewstate = Model viewstate Nothing False False [] Nothing LoggedOut key url Nothing Time.utc [] [] Nothing PerFeed Nothing
viewStatePerUrl : Url.Url -> (ViewState, List (Cmd Msg))
viewStatePerUrl url =
@@ -114,7 +114,8 @@ viewStatePerUrl url =
, getTitles])
RouteParser.FeedReader -> (Loading, [ getSession
, getSettings
- , getFeeds ])
+ , getFeeds
+ , getFeedMeta ])
init _ url key =
let (viewstate, cmds) = (viewStatePerUrl url)
@@ -665,6 +666,15 @@ update msg model =
Err error -> ( { model | view_state = ShowError (errToString error) }
, Cmd.none)
+ FeedMetaReceived result ->
+ case result of
+ Ok metadata ->
+ ({ model
+ | feedMetadata = Just metadata}
+ , Cmd.none)
+ Err error -> ( { model | view_state = ShowError (errToString error) }
+ , Cmd.none)
+
doGoHome_ model other_cmds =
(model, Cmd.batch (List.append [ getSettings
@@ -757,7 +767,7 @@ view model =
Nothing -> [ div [] [ text "No post loaded" ]]
MediaList -> [ medialist model.loadedImages model.medialist_state ]
SettingsEditor -> [ SettingsEditor.editor settings]
- Feeds feeds show_archived -> [ FeedView.feeds model.feedReaderState show_archived settings model.zone feeds model.new_feed ])
+ Feeds feeds show_archived -> [ FeedView.feeds model.feedReaderState show_archived settings model.zone feeds model.new_feed model.feedMetadata])
, div [id "sidebar"] [ User.loginView model.loginState
, (sidebarHistory model.titles )
, (case model.view_state of
diff --git a/elm-frontti/src/Message.elm b/elm-frontti/src/Message.elm
index 19b0808..4015a5c 100644
--- a/elm-frontti/src/Message.elm
+++ b/elm-frontti/src/Message.elm
@@ -90,7 +90,8 @@ type alias Model =
, titles : List Article.Title
, searchedPosts : List Article.PreviousArticle
, new_feed: Maybe Feeds.NewFeed
- , feedReaderState: FeedReaderState}
+ , feedReaderState: FeedReaderState
+ , feedMetadata: Maybe Feeds.FeedMetadata}
type Msg
= PageReceived (Result Http.Error P.Page)
@@ -169,6 +170,7 @@ type Msg
| FeedItemReadResponse (Result Http.Error ())
| DeleteFeed UUID
| FeedDeleted (Result Http.Error ())
+ | FeedMetaReceived (Result Http.Error Feeds.FeedMetadata)
-- ports
port reallySetupAce : String -> Cmd msg
diff --git a/src/routes/rss-reader-routes.lisp b/src/routes/rss-reader-routes.lisp
index 4e645f9..80fb4de 100644
--- a/src/routes/rss-reader-routes.lisp
+++ b/src/routes/rss-reader-routes.lisp
@@ -20,6 +20,15 @@
(let ((feeds (or (get-user-feeds (gethash "id" *user*)) #())))
(com.inuoe.jzon:stringify feeds)))
+(defroute updater-metadata ("/api/user/feeds/meta" :method :get
+ :decorators (@json
+ @transaction
+ @authenticated)) ()
+ (let ((result (make-hash-table :test 'equal)))
+ (setf (gethash "last-update-timestamps" result)
+ murja.rss.reader-db:*updates*)
+ (com.inuoe.jzon:stringify result)))
+
(defroute user-feeds-saving ("/api/user/feeds"
:method :post
:decorators (@transaction @authenticated)) ()
diff --git a/src/rss/reader-db.lisp b/src/rss/reader-db.lisp
index 5289d1f..c814346 100644
--- a/src/rss/reader-db.lisp
+++ b/src/rss/reader-db.lisp
@@ -3,7 +3,7 @@
(:import-from :halisql :defqueries)
(:import-from :lisp-fixup :partial :compose)
(:import-from :cl-date-time-parser :parse-date-time)
- (:export :get-user-feeds :subscribe-to-feed :mark-as-read :delete-feed))
+ (:export :*updates* :get-user-feeds :subscribe-to-feed :mark-as-read :delete-feed))
(in-package :murja.rss.reader-db)
@@ -92,7 +92,12 @@ pipes it through trivial-utf-8:utf-8-bytes-to-string"
(multiple-value-bind (second minute hour) (decode-universal-time (get-universal-time))
hour))
+(defun current-datetime ()
+ (multiple-value-bind (second minute hour day month year) (decode-universal-time (get-universal-time))
+ (format nil "~d-~2,'0d-~2,'0dT~2,'0d:~2,'0d:~2,'0dZ" year month day hour minute second)))
+
(defvar *last-updated* nil)
+(defvar *updates* nil)
(defun update-feeds ()
(setf *last-updated* nil)
@@ -103,4 +108,5 @@ pipes it through trivial-utf-8:utf-8-bytes-to-string"
(dolist (feed (coerce (get-all-feeds) 'list))
(update-feed feed))
- (setf *last-updated* (current-hour))))
+ (setf *last-updated* (current-hour))
+ (push (current-datetime) *updates*)))