make RSS feed reflect the filter + search status of the current page (#44)
This commit is contained in:
parent
824b0f8afd
commit
84e0260396
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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>
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue