happstack-contrib-0.2.1: src/Happstack/Store/HelpReqs.hs
{-# LANGUAGE TemplateHaskell, FlexibleInstances, DeriveDataTypeable,
ImplicitParams, TypeSynonymInstances, TypeFamilies,
MultiParamTypeClasses, TypeOperators, FlexibleContexts,
UndecidableInstances #-}
module Happstack.Store.HelpReqs where
import Control.Monad.State hiding (State)
import Control.Monad.Reader
import Happstack.Data
import Happstack.Data.IxSet
import Happstack.Contrib.Atom
import Happstack.State
import Happstack.Server.Facebook as FB
(Uid,uid,FBSession,fbSeeOther,getIsAdmin
,getAdmins,notifications_send )
import Happstack.Server.SimpleHTTP
import Happstack.Store.FlashMsgs
import Happstack.Server.HTTP.Types (Response)
-- Kept from old Happstack.Store.Util
byTime::(Typeable a) => IxSet a -> [a]
byTime = concatMap (\(Published _,es)->es) . groupBy
byRevTime::(Typeable a) => IxSet a -> [a]
byRevTime = concatMap (\(Published _,es)->es) . rGroupBy
{--
Use HelpReqs to track help requests on your app. The concept is that the
user just fills out a form describing their needs and you get back to them.
See FlashMsgs for the cannonical info, but..
--}
$( deriveAll [''Show,''Default,''Read,''Eq,''Ord]
[d|
-- the data for the help system
data HelpReqForm = HelpReqForm --get the form
data HelpReq = HelpReq FB.Uid Published Title HelpText Status--post the help
newtype HelpText = HelpText String
data Status = Open | Closed Published
newtype HelpFeed = HelpFeed [HelpReq] -- provide a help feed
data HelpMsgReceived = HelpMsgReceived
|])
instance Version HelpReq
instance Version Status
instance Version HelpFeed
instance Version HelpText
instance Version HelpMsgReceived
$(deriveSerialize ''HelpReq)
$(deriveSerialize ''Status)
$(deriveSerialize ''HelpFeed)
$(deriveSerialize ''HelpText)
$(deriveSerialize ''HelpMsgReceived)
$(inferIxSet "HelpReqs" ''HelpReq 'noCalcs [''FB.Uid,''Published,''Status] )
--Command functions
addHelpReq :: HelpReq -> Update HelpReqs ()
addHelpReq helpReq
= do seconds <- liftM (`div` 1000) getTime
modify $ insert (gSet (Published seconds) helpReq)
getHelpReqs :: Query HelpReqs [HelpReq]
getHelpReqs = liftM byRevTime ask
$(mkMethods ''HelpReqs ['addHelpReq,'getHelpReqs])
instance Component HelpReqs where
initialValue = error "initialValue not defined for Component HelpReqs"
type Dependencies HelpReqs = FlashMsgs HelpMsgReceived :+: End
-- http stuff
http::( ?fbSession::FBSession
, MonadIO m
, ServerMonad m
, FilterMonad Response m
, MonadPlus m
) => [m Response]
http =
[
dir "help" $ ok $ toResponse HelpReqForm
,dir "addHelp" $ do
mbHelpReq <- getData
helpReq <- maybe mzero return mbHelpReq
liftIO $ update $ AddHelpReq helpReq
liftIO $ insFlashMsg uid HelpMsgReceived
admins <- liftIO $ getAdmins
unless (null admins) $
do
liftIO $ notifications_send admins
(Title "helpreq")
()
return ()
liftM toResponse $ fbSeeOther "side-nav"
,dir "helps" $ do
isAdmin <- liftIO $ getIsAdmin
if not isAdmin then forbidden (toResponse "not admin!") else do
flashMsg <- liftIO $ (extFlashMsg uid :: IO (Maybe HelpMsgReceived))
helpReqs <- liftIO $ query $ GetHelpReqs
(ok . toResponse .
insEl (Attr "context" "helpfeed") .
insEl flashMsg .
HelpFeed .
take 1000) helpReqs
]