module Controller.Periodic
( periodicHandler
, postPeriodic
) where
import qualified Data.ByteString as BS
import Control.Exception (throwTo)
import Control.Monad.IO.Class (liftIO)
import Network.HTTP.Types.Method (methodGet, methodPost)
import qualified Network.HTTP.Types.Method as HTM
import Has
import Model.Periodic
import Service.Types
import Action
import HTTP.Form.Deform
import HTTP.Path.Parser
import Controller.Permission
import Controller.Form
import View.Periodic
periodicHandler :: HTM.Method -> [(BS.ByteString, BS.ByteString)] -> Action
periodicHandler method _
| method == methodGet = viewPeriodicHandler
| method == methodPost = postPeriodicHandler
| otherwise = error "unhandled api/method combo"
viewPeriodicHandler :: Action
viewPeriodicHandler = withAuth $ do
checkMemberADMIN
peeks $ blankForm . htmlPeriodic
postPeriodic :: ActionRoute ()
postPeriodic = action POST ("admin" >/> "periodic") $ \() -> postPeriodicHandler
data RunPeriodicRequest = RunPeriodicRequest Bool
postPeriodicHandler :: Action
postPeriodicHandler = withAuth $ do
checkMemberADMIN
t <- peeks servicePeriodic
RunPeriodicRequest w <- runForm (Just htmlPeriodic) (RunPeriodicRequest <$> ("weekly" .:> deform))
liftIO $ mapM_ (`throwTo` if w then PeriodWeekly else PeriodDaily) t
return $ okResponse [] (maybe "no" (const "ok") t :: String)