Added public feeds to bookmark pages.
- add the link in the header - add a link in the user page.
This commit is contained in:
parent
c36bb695c2
commit
3476642fbb
|
@ -18,6 +18,7 @@
|
||||||
!/#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
|
||||||
|
|
||||||
-- settings
|
-- settings
|
||||||
/Settings AccountSettingsR GET
|
/Settings AccountSettingsR GET
|
||||||
|
|
10
espial.cabal
10
espial.cabal
|
@ -4,7 +4,7 @@ cabal-version: 1.12
|
||||||
--
|
--
|
||||||
-- see: https://github.com/sol/hpack
|
-- see: https://github.com/sol/hpack
|
||||||
--
|
--
|
||||||
-- hash: ac9856c342ac9d7c05b18be91fb062e098dbf3575b2fbe7293f69df2d5b76cce
|
-- hash: da944088abb7ae887d67efd710c100bdbd5587072c6ddcfdc5d05392e7509d85
|
||||||
|
|
||||||
name: espial
|
name: espial
|
||||||
version: 0.0.8
|
version: 0.0.8
|
||||||
|
@ -128,6 +128,7 @@ library
|
||||||
, attoparsec
|
, attoparsec
|
||||||
, base >=4.8.2.0 && <4.9 || >=4.9.1.0 && <5
|
, base >=4.8.2.0 && <4.9 || >=4.9.1.0 && <5
|
||||||
, bcrypt >=0.0.8
|
, bcrypt >=0.0.8
|
||||||
|
, blaze-html >=0.9 && <1.0
|
||||||
, bytestring >=0.9 && <0.11
|
, bytestring >=0.9 && <0.11
|
||||||
, case-insensitive
|
, case-insensitive
|
||||||
, classy-prelude >=1.4 && <1.6
|
, classy-prelude >=1.4 && <1.6
|
||||||
|
@ -179,6 +180,7 @@ library
|
||||||
, yesod-auth >=1.6 && <1.7
|
, yesod-auth >=1.6 && <1.7
|
||||||
, yesod-core >=1.6 && <1.7
|
, yesod-core >=1.6 && <1.7
|
||||||
, yesod-form >=1.6 && <1.7
|
, yesod-form >=1.6 && <1.7
|
||||||
|
, yesod-newsfeed >=1.6 && <1.7
|
||||||
, yesod-static >=1.6 && <1.7
|
, yesod-static >=1.6 && <1.7
|
||||||
if (flag(dev)) || (flag(library-only))
|
if (flag(dev)) || (flag(library-only))
|
||||||
ghc-options: -Wall -fwarn-tabs -O0
|
ghc-options: -Wall -fwarn-tabs -O0
|
||||||
|
@ -201,6 +203,7 @@ executable espial
|
||||||
, attoparsec
|
, attoparsec
|
||||||
, base >=4.8.2.0 && <4.9 || >=4.9.1.0 && <5
|
, base >=4.8.2.0 && <4.9 || >=4.9.1.0 && <5
|
||||||
, bcrypt >=0.0.8
|
, bcrypt >=0.0.8
|
||||||
|
, blaze-html >=0.9 && <1.0
|
||||||
, bytestring >=0.9 && <0.11
|
, bytestring >=0.9 && <0.11
|
||||||
, case-insensitive
|
, case-insensitive
|
||||||
, classy-prelude >=1.4 && <1.6
|
, classy-prelude >=1.4 && <1.6
|
||||||
|
@ -253,6 +256,7 @@ executable espial
|
||||||
, yesod-auth >=1.6 && <1.7
|
, yesod-auth >=1.6 && <1.7
|
||||||
, yesod-core >=1.6 && <1.7
|
, yesod-core >=1.6 && <1.7
|
||||||
, yesod-form >=1.6 && <1.7
|
, yesod-form >=1.6 && <1.7
|
||||||
|
, yesod-newsfeed >=1.6 && <1.7
|
||||||
, yesod-static >=1.6 && <1.7
|
, yesod-static >=1.6 && <1.7
|
||||||
if flag(library-only)
|
if flag(library-only)
|
||||||
buildable: False
|
buildable: False
|
||||||
|
@ -271,6 +275,7 @@ executable migration
|
||||||
, attoparsec
|
, attoparsec
|
||||||
, base >=4.8.2.0 && <4.9 || >=4.9.1.0 && <5
|
, base >=4.8.2.0 && <4.9 || >=4.9.1.0 && <5
|
||||||
, bcrypt >=0.0.8
|
, bcrypt >=0.0.8
|
||||||
|
, blaze-html >=0.9 && <1.0
|
||||||
, bytestring >=0.9 && <0.11
|
, bytestring >=0.9 && <0.11
|
||||||
, case-insensitive
|
, case-insensitive
|
||||||
, classy-prelude >=1.4 && <1.6
|
, classy-prelude >=1.4 && <1.6
|
||||||
|
@ -324,6 +329,7 @@ executable migration
|
||||||
, yesod-auth >=1.6 && <1.7
|
, yesod-auth >=1.6 && <1.7
|
||||||
, yesod-core >=1.6 && <1.7
|
, yesod-core >=1.6 && <1.7
|
||||||
, yesod-form >=1.6 && <1.7
|
, yesod-form >=1.6 && <1.7
|
||||||
|
, yesod-newsfeed >=1.6 && <1.7
|
||||||
, yesod-static >=1.6 && <1.7
|
, yesod-static >=1.6 && <1.7
|
||||||
if flag(library-only)
|
if flag(library-only)
|
||||||
buildable: False
|
buildable: False
|
||||||
|
@ -346,6 +352,7 @@ test-suite test
|
||||||
, attoparsec
|
, attoparsec
|
||||||
, base >=4.8.2.0 && <4.9 || >=4.9.1.0 && <5
|
, base >=4.8.2.0 && <4.9 || >=4.9.1.0 && <5
|
||||||
, bcrypt >=0.0.8
|
, bcrypt >=0.0.8
|
||||||
|
, blaze-html >=0.9 && <1.0
|
||||||
, bytestring >=0.9 && <0.11
|
, bytestring >=0.9 && <0.11
|
||||||
, case-insensitive
|
, case-insensitive
|
||||||
, classy-prelude >=1.4 && <1.6
|
, classy-prelude >=1.4 && <1.6
|
||||||
|
@ -399,6 +406,7 @@ test-suite test
|
||||||
, yesod-auth >=1.6 && <1.7
|
, yesod-auth >=1.6 && <1.7
|
||||||
, yesod-core >=1.6 && <1.7
|
, yesod-core >=1.6 && <1.7
|
||||||
, yesod-form >=1.6 && <1.7
|
, yesod-form >=1.6 && <1.7
|
||||||
|
, yesod-newsfeed >=1.6 && <1.7
|
||||||
, yesod-static >=1.6 && <1.7
|
, yesod-static >=1.6 && <1.7
|
||||||
, yesod-test
|
, yesod-test
|
||||||
default-language: Haskell2010
|
default-language: Haskell2010
|
||||||
|
|
|
@ -86,6 +86,7 @@ dependencies:
|
||||||
- yesod-auth >=1.6 && <1.7
|
- yesod-auth >=1.6 && <1.7
|
||||||
- yesod-static >=1.6 && <1.7
|
- yesod-static >=1.6 && <1.7
|
||||||
- yesod-form >=1.6 && <1.7
|
- yesod-form >=1.6 && <1.7
|
||||||
|
- yesod-newsfeed >= 1.6 && < 1.7
|
||||||
- classy-prelude >=1.4 && <1.6
|
- classy-prelude >=1.4 && <1.6
|
||||||
- classy-prelude-conduit >=1.4 && <1.6
|
- classy-prelude-conduit >=1.4 && <1.6
|
||||||
- classy-prelude-yesod >=1.4 && <1.6
|
- classy-prelude-yesod >=1.4 && <1.6
|
||||||
|
@ -93,6 +94,7 @@ dependencies:
|
||||||
- text >=0.11 && <2.0
|
- text >=0.11 && <2.0
|
||||||
- persistent >=2.8 && <2.10
|
- persistent >=2.8 && <2.10
|
||||||
# - persistent-postgresql >=2.8 && <2.9
|
# - persistent-postgresql >=2.8 && <2.9
|
||||||
|
- blaze-html >= 0.9 && < 1.0
|
||||||
- persistent-template >=2.5 && <2.9
|
- persistent-template >=2.5 && <2.9
|
||||||
- template-haskell
|
- template-haskell
|
||||||
- shakespeare >=2.0 && <2.1
|
- shakespeare >=2.0 && <2.1
|
||||||
|
|
|
@ -1,9 +1,12 @@
|
||||||
{-# OPTIONS_GHC -fno-warn-unused-matches #-}
|
{-# OPTIONS_GHC -fno-warn-unused-matches #-}
|
||||||
module Handler.User where
|
module Handler.User where
|
||||||
|
|
||||||
import Import
|
|
||||||
import qualified Data.Text as T
|
import qualified Data.Text as T
|
||||||
import Handler.Common (lookupPagingParams)
|
import Handler.Common (lookupPagingParams)
|
||||||
|
import Import
|
||||||
|
import Text.Blaze.Html (toHtml)
|
||||||
|
import qualified Text.Blaze.Html5 as H
|
||||||
|
import Yesod.RssFeed
|
||||||
|
|
||||||
getUserR :: UserNameP -> Handler Html
|
getUserR :: UserNameP -> Handler Html
|
||||||
getUserR uname@(UserNameP name) = do
|
getUserR uname@(UserNameP name) = do
|
||||||
|
@ -35,7 +38,7 @@ _getUser unamep@(UserNameP uname) sharedp' filterp' (TagsP pathtags) = do
|
||||||
isAll = filterp == FilterAll && sharedp == SharedAll && pathtags == []
|
isAll = filterp == FilterAll && sharedp == SharedAll && pathtags == []
|
||||||
queryp = "query" :: Text
|
queryp = "query" :: Text
|
||||||
mquery <- lookupGetParam queryp
|
mquery <- lookupGetParam queryp
|
||||||
let mqueryp = fmap (\q -> (queryp, q)) mquery
|
let mqueryp = fmap (\q -> (queryp, q)) mquery
|
||||||
(bcount, bmarks, alltags) <-
|
(bcount, bmarks, alltags) <-
|
||||||
runDB $
|
runDB $
|
||||||
do Entity userId user <- getBy404 (UniqueUserName uname)
|
do Entity userId user <- getBy404 (UniqueUserName uname)
|
||||||
|
@ -45,18 +48,58 @@ _getUser unamep@(UserNameP uname) sharedp' filterp' (TagsP pathtags) = do
|
||||||
tg <- tagsQuery bm
|
tg <- tagsQuery bm
|
||||||
pure (cnt, bm, tg)
|
pure (cnt, bm, tg)
|
||||||
when (bcount == 0) (case filterp of FilterSingle _ -> notFound; _ -> pure ())
|
when (bcount == 0) (case filterp of FilterSingle _ -> notFound; _ -> pure ())
|
||||||
mroute <- getCurrentRoute
|
mroute <- getCurrentRoute
|
||||||
req <- getRequest
|
req <- getRequest
|
||||||
defaultLayout $ do
|
defaultLayout $ do
|
||||||
let pager = $(widgetFile "pager")
|
let pager = $(widgetFile "pager")
|
||||||
search = $(widgetFile "search")
|
search = $(widgetFile "search")
|
||||||
renderEl = "bookmarks" :: Text
|
renderEl = "bookmarks" :: Text
|
||||||
|
rssLink (UserFeedR unamep) "feed"
|
||||||
$(widgetFile "user")
|
$(widgetFile "user")
|
||||||
toWidgetBody [julius|
|
toWidgetBody [julius|
|
||||||
app.dat.bmarks = #{ toJSON $ toBookmarkFormList bmarks alltags } || [];
|
app.dat.bmarks = #{ toJSON $ toBookmarkFormList bmarks alltags } || [];
|
||||||
app.dat.isowner = #{ isowner };
|
app.dat.isowner = #{ isowner };
|
||||||
app.userR = "@{UserR unamep}";
|
app.userR = "@{UserR unamep}";
|
||||||
|]
|
|]
|
||||||
toWidget [julius|
|
toWidget [julius|
|
||||||
PS['Main'].renderBookmarks('##{rawJS renderEl}')(app.dat.bmarks)();
|
PS['Main'].renderBookmarks('##{rawJS renderEl}')(app.dat.bmarks)();
|
||||||
|]
|
|]
|
||||||
|
|
||||||
|
bookmarkToRssEntry :: Entity Bookmark -> FeedEntry Text
|
||||||
|
bookmarkToRssEntry (Entity entryId entry) =
|
||||||
|
FeedEntry { feedEntryLink = (bookmarkHref entry)
|
||||||
|
, feedEntryUpdated = (bookmarkTime entry)
|
||||||
|
, feedEntryTitle = (bookmarkDescription entry)
|
||||||
|
, feedEntryContent = (toHtml (bookmarkExtended entry))
|
||||||
|
, feedEntryEnclosure = Nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
getUserFeedR :: UserNameP -> Handler RepRss
|
||||||
|
getUserFeedR unamep@(UserNameP uname) = do
|
||||||
|
mauthuname <- maybeAuthUsername
|
||||||
|
(limit', page') <- lookupPagingParams
|
||||||
|
let limit = maybe 120 fromIntegral limit'
|
||||||
|
page = maybe 1 fromIntegral page'
|
||||||
|
queryp = "query" :: Text
|
||||||
|
mquery <- lookupGetParam queryp
|
||||||
|
(bcount, bmarks, alltags) <-
|
||||||
|
runDB $
|
||||||
|
do Entity userId user <- getBy404 (UniqueUserName uname)
|
||||||
|
(cnt, bm) <- bookmarksQuery userId SharedPublic FilterAll [] mquery limit page
|
||||||
|
tg <- tagsQuery bm
|
||||||
|
pure (cnt, bm, tg)
|
||||||
|
let (descr :: Html) = toHtml $ H.text ("Bookmarks saved by " <> uname)
|
||||||
|
let entries = map bookmarkToRssEntry bmarks
|
||||||
|
updated <- case maximumMay (map feedEntryUpdated entries) of
|
||||||
|
Nothing -> liftIO $ getCurrentTime
|
||||||
|
Just m -> return m
|
||||||
|
render <- getUrlRender
|
||||||
|
rssFeedText $ Feed ("espial " <> uname)
|
||||||
|
(render (UserFeedR unamep))
|
||||||
|
(render (UserR unamep))
|
||||||
|
uname
|
||||||
|
descr
|
||||||
|
"en"
|
||||||
|
updated
|
||||||
|
Nothing
|
||||||
|
entries
|
||||||
|
|
|
@ -31,6 +31,9 @@ $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>
|
||||||
|
<a .link.gold.hover-orange
|
||||||
|
href="@{UserFeedR unamep}">RSS
|
||||||
|
|
||||||
<div .cf>
|
<div .cf>
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue