packages feed

HAppS-Server-0.9.2: src/HAppS/Store/HelpReqs.hs

{-# LANGUAGE TemplateHaskell, FlexibleInstances, DeriveDataTypeable,
             ImplicitParams, TypeSynonymInstances, TypeFamilies,
             MultiParamTypeClasses, TypeOperators #-}

{- LANGUAGE    TemplateHaskell , FlexibleInstances, UndecidableInstances, OverlappingInstances, 
                DeriveDataTypeable, FlexibleContexts, ImplicitParams,
                MultiParamTypeClasses, TypeSynonymInstances, TypeFamilies -}

-- MultiParamTypeClasses
module HAppS.Store.HelpReqs where

import Control.Monad.State hiding (State)
import Control.Monad.Reader

import HAppS.Data
import HAppS.Data.Atom
import HAppS.Data.IxSet
import HAppS.State
import HAppS.Server.Facebook as FB 
    (Uid,uid,FBSession,fbSeeOther,getIsAdmin
    ,getAdmins,notifications_send  )
import HAppS.Store.Util
import HAppS.Server.SimpleHTTP -- hiding (ok)
import HAppS.Store.FlashMsgs
import HAppS.Server.HTTP.Types (Response)
{--

  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..

--}
#ifndef __HADDOCK__
$( 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
       --data Status = Open | Assigned FB.Uid Published | Closed FB.Uid Published
     |])

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] )
#endif
{-
$(deriveAll [''Show,''Default,''Read]
  [d| data HelpReqs = HelpReqs {unHelpReqs :: HelpReqs_ } |]
 )
-}

--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

#ifndef __HADDOCK__
$(mkMethods ''HelpReqs ['addHelpReq,'getHelpReqs])
instance Component HelpReqs where
    type Dependencies HelpReqs = FlashMsgs HelpMsgReceived :+: End
#endif



-- http stuff 
http::( ?fbSession::FBSession
      , MonadIO m
      ) => [ServerPartT m Response]
http = 
    [
     dir "help" [ method () $ ok $ toResponse HelpReqForm]

    ,dir "addHelp" 
             [withData $ \helpReq -> 
                  [method () $ do
                               webUpdate $ AddHelpReq helpReq
                               liftIO $ insFlashMsg uid HelpMsgReceived
                               admins <- liftIO $ getAdmins
                               unless (null admins) $ 
                                      do
                                      conf <- liftIO $ notifications_send admins 
                                                      (Title "helpreq")
                                                      ()
                                      return ()
                               liftM toResponse $ fbSeeOther "side-nav"
                   ]]

    ,dir "helps" [method () $ do
                  isAdmin <- liftIO $ getIsAdmin
                  if not isAdmin then forbidden (toResponse "not admin!") else do
                  flashMsg <- liftIO $ (extFlashMsg uid :: IO (Maybe HelpMsgReceived))
                  helpReqs <- webQuery $ GetHelpReqs
                  (ok . toResponse .
                     insEl (Attr "context" "helpfeed") . 
                     insEl flashMsg .
                     HelpFeed . 
                     take 1000) helpReqs 
                 ]
      ]






































--controls
--addHelpReq = update . AddHelpReq'
{--

--addHelpReq' adr = update . adr 

controls::Q [Dec]
controls = return  
           [
--            fun0_1 "addHelpReq" "addHelpReq'" "AddHelpReq"
           fun0_1 "getHelpReqs" "query" "GetHelpReqs"
           ]
--}                    
-- $(return 
--  [fun0_1 "addHelpReq" "addHelpReq'" "AddHelpReq"])           


--OBSOLETE? ---
-- Control functions that need some help
{--
addHelpMsg help@(HelpMsg uid (Published t) msg) = 
    do
    TOD eTime _ <- getClockTime
    if t > eTime || t < eTime - 3600000 then return () else do
    update $ AddHelpMsg help

getHelpMsgs = query GetHelpMsgs
--}