batchd-0.1.1.0: src/Batchd/Daemon/Schedule.hs
{-# LANGUAGE DeriveDataTypeable, StandaloneDeriving, RecordWildCards, DeriveGeneric #-}
module Batchd.Daemon.Schedule where
import Control.Monad.Reader
import Data.Maybe
import Database.Persist
import Batchd.Core.Common.Types
import Batchd.Daemon.Types
import Batchd.Common.Data
import Batchd.Common.Schedule
loadSchedule :: Key Schedule -> DB ScheduleInfo
loadSchedule scheduleId@(ScheduleKey sname) = do
mbSchedule <- get scheduleId
case mbSchedule of
Nothing -> throwR (ScheduleNotExists sname)
Just s -> do
let name = scheduleName s
ts <- selectList [ScheduleTimeScheduleName ==. sname] []
let times = map (toPeriod . entityVal) ts
ws <- selectList [ScheduleWeekDayScheduleName ==. sname] []
let weekdays = map (scheduleWeekDayWeekDay . entityVal) ws
return $ ScheduleInfo {
sName = name,
sWeekdays = if null weekdays then Nothing else Just weekdays,
sTime = if null times then Nothing else Just times
}
addSchedule :: ScheduleInfo -> DB String
addSchedule si = do
ScheduleKey sid <- insert $ Schedule (sName si)
case sWeekdays si of
Nothing -> return ()
Just weekdays ->
forM_ weekdays $ \wd -> do
insert_ $ ScheduleWeekDay sid wd
case sTime si of
Nothing -> return ()
Just times ->
forM_ times $ \(Period {..}) -> do
let time = ScheduleTime sid periodBegin periodEnd
insert_ time
return sid
loadAllSchedules :: DB [ScheduleInfo]
loadAllSchedules = do
sids <- selectKeysList [] []
forM sids $ \sid -> loadSchedule sid
removeSchedule :: String -> Bool -> DB ()
removeSchedule name forced = do
qs <- selectFirst [QueueScheduleName ==. name] []
let key = ScheduleKey name
if isNothing qs || forced
then do
deleteWhere [ScheduleTimeScheduleName ==. name]
deleteWhere [ScheduleWeekDayScheduleName ==. name]
deleteCascade key
else throwR ScheduleUsed