packages feed

espial-0.0.7: src/Handler/User.hs

{-# OPTIONS_GHC -fno-warn-unused-matches #-}
module Handler.User where

import Import
import qualified Data.Text as T
import Handler.Common (lookupPagingParams)

getUserR :: UserNameP -> Handler Html
getUserR uname@(UserNameP name) = do
  _getUser uname SharedAll FilterAll (TagsP [])

getUserSharedR :: UserNameP -> SharedP -> Handler Html
getUserSharedR uname sharedp =
  _getUser uname sharedp FilterAll (TagsP [])

getUserFilterR :: UserNameP -> FilterP -> Handler Html
getUserFilterR uname filterp =
  _getUser uname SharedAll filterp (TagsP [])

getUserTagsR :: UserNameP -> TagsP -> Handler Html
getUserTagsR uname pathtags =
  _getUser uname SharedAll FilterAll pathtags

_getUser :: UserNameP -> SharedP -> FilterP -> TagsP -> Handler Html
_getUser unamep@(UserNameP uname) sharedp' filterp' (TagsP pathtags) = do
  mauthuname <- maybeAuthUsername
  (limit', page') <- lookupPagingParams
  let limit = maybe 120 fromIntegral limit'
      page  = maybe 1   fromIntegral page'
      isowner = maybe False (== 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 && pathtags == []
      queryp = "query" :: Text
  mquery <- lookupGetParam queryp
  let mqueryp = fmap (\q -> (queryp, q)) mquery 
  (bcount, bmarks, alltags) <-
    runDB $
    do Entity userId user <- getBy404 (UniqueUserName uname)
       when (not isowner && userPrivacyLock user)
         (redirect (AuthR LoginR))
       (cnt, bm) <- bookmarksQuery userId sharedp filterp pathtags mquery limit page
       tg <- tagsQuery bm
       pure (cnt, bm, tg)
  when (bcount == 0) (case filterp of FilterSingle _ -> notFound; _ -> pure ())
  mroute <- getCurrentRoute 
  req <- getRequest
  defaultLayout $ do
    let pager = $(widgetFile "pager")
        search = $(widgetFile "search")
        renderEl = "bookmarks" :: Text
    $(widgetFile "user")
    toWidgetBody [julius|
        app.dat.bmarks = #{ toJSON $ toBookmarkFormList bmarks alltags } || []; 
        app.dat.isowner = #{ isowner };
        app.userR = "@{UserR unamep}";
    |]
    toWidget [julius|
      PS['Main'].renderBookmarks('##{rawJS renderEl}')(app.dat.bmarks)();
    |]