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*)))