make RSS feed reflect the filter + search status of the current page (#44)

This commit is contained in:
Jon Schoning 2022-08-03 18:16:35 -05:00 committed by Yann Esposito (Yogsototh)
parent 824b0f8afd
commit 84e0260396
Signed by untrusted user who does not match committer: yogsototh
GPG key ID: 7B19A4C650D59646
4 changed files with 73 additions and 18 deletions

View file

@ -20,7 +20,11 @@
!/#UserNameP/#SharedP UserSharedR GET !/#UserNameP/#SharedP UserSharedR GET
!/#UserNameP/#FilterP UserFilterR GET !/#UserNameP/#FilterP UserFilterR GET
!/#UserNameP/#TagsP UserTagsR GET !/#UserNameP/#TagsP UserTagsR GET
!/#UserNameP/feed.xml UserFeedR GET !/#UserNameP/feed.xml UserFeedR GET
!/#UserNameP/#SharedP/feed.xml UserFeedSharedR GET
!/#UserNameP/#FilterP/feed.xml UserFeedFilterR GET
!/#UserNameP/#TagsP/feed.xml UserFeedTagsR GET
-- settings -- settings
/Settings AccountSettingsR GET /Settings AccountSettingsR GET
@ -45,4 +49,4 @@ api/tagcloudmode UserTagCloudModeR POST
/bm/#Int64/unstar UnstarR POST /bm/#Int64/unstar UnstarR POST
-- doc -- doc
/docs/search DocsSearchR GET /docs/search DocsSearchR GET

View file

@ -8,6 +8,7 @@ import qualified Data.Aeson as A
import qualified Data.Text as T import qualified Data.Text as T
import Yesod.RssFeed import Yesod.RssFeed
import qualified Text.Blaze.Html5 as H import qualified Text.Blaze.Html5 as H
import qualified Network.Wai.Internal as W
getNotesR :: UserNameP -> Handler Html getNotesR :: UserNameP -> Handler Html
getNotesR unamep@(UserNameP uname) = do getNotesR unamep@(UserNameP uname) = do
@ -172,10 +173,10 @@ _toNote userId NoteForm {..} = do
, noteUpdated = maybe time unUTCTimeStr _updated , noteUpdated = maybe time unUTCTimeStr _updated
} }
noteToRssEntry :: UserNameP -> Entity Note -> FeedEntry (Route App) noteToRssEntry :: (Route App -> Text) -> UserNameP -> Entity Note -> FeedEntry Text
noteToRssEntry usernamep (Entity entryId entry) = noteToRssEntry render usernamep (Entity entryId entry) =
FeedEntry FeedEntry
{ feedEntryLink = NoteR usernamep (noteSlug entry) { feedEntryLink = render $ NoteR usernamep (noteSlug entry)
, feedEntryUpdated = noteUpdated entry , feedEntryUpdated = noteUpdated entry
, feedEntryTitle = noteTitle entry , feedEntryTitle = noteTitle entry
, feedEntryContent = toHtml (noteText entry) , feedEntryContent = toHtml (noteText entry)
@ -191,21 +192,24 @@ getNotesFeedR unamep@(UserNameP uname) = do
let limit = maybe 20 fromIntegral limit' let limit = maybe 20 fromIntegral limit'
page = maybe 1 fromIntegral page' page = maybe 1 fromIntegral page'
isowner = Just uname == mauthuname isowner = Just uname == mauthuname
sharedp = if isowner then SharedAll else SharedPublic
(_, notes) <- runDB do (_, notes) <- runDB do
Entity userId user <- getBy404 (UniqueUserName uname) Entity userId user <- getBy404 (UniqueUserName uname)
when (not isowner && userPrivacyLock user) when (not isowner && userPrivacyLock user)
(redirect (AuthR LoginR)) (redirect (AuthR LoginR))
getNoteList userId mquery SharedPublic limit page getNoteList userId mquery sharedp limit page
render <- getUrlRender
let (descr :: Html) = toHtml $ H.text (uname <> " notes") let (descr :: Html) = toHtml $ H.text (uname <> " notes")
entries = map (noteToRssEntry unamep) notes entries = map (noteToRssEntry render unamep) notes
updated <- case maximumMay (map feedEntryUpdated entries) of updated <- case maximumMay (map feedEntryUpdated entries) of
Nothing -> liftIO getCurrentTime Nothing -> liftIO getCurrentTime
Just m -> return m Just m -> return m
rssFeed $ (feedLinkSelf, feedLinkHome) <- getFeedLinkSelf
rssFeedText $
Feed Feed
{ feedTitle = uname <> " notes" { feedTitle = uname <> " notes"
, feedLinkSelf = NotesFeedR unamep , feedLinkSelf = feedLinkSelf
, feedLinkHome = NotesR unamep , feedLinkHome = feedLinkHome
, feedAuthor = uname , feedAuthor = uname
, feedDescription = descr , feedDescription = descr
, feedLanguage = "en" , feedLanguage = "en"
@ -213,3 +217,11 @@ getNotesFeedR unamep@(UserNameP uname) = do
, feedLogo = Nothing , feedLogo = Nothing
, feedEntries = entries , feedEntries = entries
} }
where
getFeedLinkSelf = do
request <- getRequest
render <- getUrlRender
let rawRequest = reqWaiRequest request
feedLinkSelf = render HomeR <> (T.drop 1 (decodeUtf8 (W.rawPathInfo rawRequest <> W.rawQueryString rawRequest)))
feedLinkHome = render (UserR unamep)
pure (feedLinkSelf, feedLinkHome)

View file

@ -8,9 +8,10 @@ import Import
import qualified Text.Blaze.Html5 as H import qualified Text.Blaze.Html5 as H
import Yesod.RssFeed import Yesod.RssFeed
import qualified Data.Map as Map import qualified Data.Map as Map
import qualified Network.Wai.Internal as W
getUserR :: UserNameP -> Handler Html getUserR :: UserNameP -> Handler Html
getUserR uname@(UserNameP name) = getUserR uname=
_getUser uname SharedAll FilterAll (TagsP []) _getUser uname SharedAll FilterAll (TagsP [])
getUserSharedR :: UserNameP -> SharedP -> Handler Html getUserSharedR :: UserNameP -> SharedP -> Handler Html
@ -110,30 +111,50 @@ bookmarkToRssEntry (Entity entryId entry, tags) =
} }
getUserFeedR :: UserNameP -> Handler RepRss getUserFeedR :: UserNameP -> Handler RepRss
getUserFeedR unamep@(UserNameP uname) = do getUserFeedR unamep = do
_getUserFeed unamep SharedAll FilterAll (TagsP [])
getUserFeedSharedR :: UserNameP -> SharedP -> Handler RepRss
getUserFeedSharedR uname sharedp =
_getUserFeed uname sharedp FilterAll (TagsP [])
getUserFeedFilterR :: UserNameP -> FilterP -> Handler RepRss
getUserFeedFilterR uname filterp =
_getUserFeed uname SharedAll filterp (TagsP [])
getUserFeedTagsR :: UserNameP -> TagsP -> Handler RepRss
getUserFeedTagsR uname = _getUserFeed uname SharedAll FilterAll
_getUserFeed :: UserNameP -> SharedP -> FilterP -> TagsP -> Handler RepRss
_getUserFeed unamep@(UserNameP uname) sharedp' filterp' (TagsP pathtags) = do
mauthuname <- maybeAuthUsername mauthuname <- maybeAuthUsername
(limit', page') <- lookupPagingParams (limit', page') <- lookupPagingParams
let limit = maybe 120 fromIntegral limit' let limit = maybe 120 fromIntegral limit'
page = maybe 1 fromIntegral page' page = maybe 1 fromIntegral page'
queryp = "query" :: Text
isowner = Just uname == mauthuname isowner = Just uname == mauthuname
sharedp = if isowner then sharedp' else SharedPublic
filterp = case filterp' of
FilterSingle _ -> filterp'
_ -> if isowner then filterp' else FilterAll
-- isAll = filterp == FilterAll && sharedp == SharedAll && null pathtags
queryp = "query" :: Text
mquery <- lookupGetParam queryp mquery <- lookupGetParam queryp
(_, btmarks) <- runDB $ do (_, btmarks) <- runDB $ do
Entity userId user <- getBy404 (UniqueUserName uname) Entity userId user <- getBy404 (UniqueUserName uname)
when (not isowner && userPrivacyLock user) when (not isowner && userPrivacyLock user)
(redirect (AuthR LoginR)) (redirect (AuthR LoginR))
bookmarksTagsQuery userId SharedPublic FilterAll [] mquery limit page bookmarksTagsQuery userId sharedp filterp pathtags mquery limit page
let (descr :: Html) = toHtml $ H.text ("Bookmarks saved by " <> uname) let (descr :: Html) = toHtml $ H.text ("Bookmarks saved by " <> uname)
entries = map bookmarkToRssEntry btmarks entries = map bookmarkToRssEntry btmarks
updated <- case maximumMay (map feedEntryUpdated entries) of updated <- case maximumMay (map feedEntryUpdated entries) of
Nothing -> liftIO getCurrentTime Nothing -> liftIO getCurrentTime
Just m -> return m Just m -> return m
render <- getUrlRender (feedLinkSelf, feedLinkHome) <- getFeedLinkSelf
rssFeedText $ rssFeedText $
Feed Feed
{ feedTitle = "espial " <> uname { feedTitle = "espial " <> uname
, feedLinkSelf = render (UserFeedR unamep) , feedLinkSelf = feedLinkSelf
, feedLinkHome = render (UserR unamep) , feedLinkHome = feedLinkHome
, feedAuthor = uname , feedAuthor = uname
, feedDescription = descr , feedDescription = descr
, feedLanguage = "en" , feedLanguage = "en"
@ -141,3 +162,11 @@ getUserFeedR unamep@(UserNameP uname) = do
, feedLogo = Nothing , feedLogo = Nothing
, feedEntries = entries , feedEntries = entries
} }
where
getFeedLinkSelf = do
request <- getRequest
render <- getUrlRender
let rawRequest = reqWaiRequest request
feedLinkSelf = render HomeR <> (T.drop 1 (decodeUtf8 (W.rawPathInfo rawRequest <> W.rawQueryString rawRequest)))
feedLinkHome = render (UserR unamep)
pure (feedLinkSelf, feedLinkHome)

View file

@ -32,8 +32,18 @@ $maybe route <- mroute
<a .link.silver.hover-blue :filterp == FilterStarred:.nav-active <a .link.silver.hover-blue :filterp == FilterStarred:.nav-active
href="@{UserFilterR unamep FilterStarred}">starred href="@{UserFilterR unamep FilterStarred}">starred
<div .fr.f6.pr3.dib.mb2> <div .fr.f6.pr3.dib.mb2>
<a .link.gold.hover-orange $if sharedp == SharedPrivate
href="@{UserFeedR unamep}">RSS <a .link.gold.hover-orange href="@?{(UserFeedSharedR unamep SharedPrivate, catMaybes [mqueryp])}">RSS
$elseif sharedp == SharedPublic
<a .link.gold.hover-orange href="@?{(UserFeedSharedR unamep SharedPublic, catMaybes [mqueryp])}">RSS
$elseif filterp == FilterUnread
<a .link.gold.hover-orange href="@?{(UserFeedFilterR unamep FilterUnread, catMaybes [mqueryp])}">RSS
$elseif filterp == FilterUntagged
<a .link.gold.hover-orange href="@?{(UserFeedFilterR unamep FilterUntagged, catMaybes [mqueryp])}">RSS
$elseif filterp == FilterStarred
<a .link.gold.hover-orange href="@?{(UserFeedFilterR unamep FilterStarred, catMaybes [mqueryp])}">RSS
$else
<a .link.gold.hover-orange href="@?{(UserFeedR unamep, catMaybes [mqueryp])}">RSS
<div .cf> <div .cf>