Minor Cron cleanup
This commit is contained in:
parent
0a2b676a42
commit
37644a242f
@ -2,18 +2,17 @@ module Jobs.Crontab
|
|||||||
( determineCrontab
|
( determineCrontab
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import Import
|
import Import
|
||||||
|
|
||||||
import qualified Data.HashMap.Strict as HashMap
|
import qualified Data.HashMap.Strict as HashMap
|
||||||
import Jobs.Types
|
import Jobs.Types
|
||||||
|
|
||||||
import Data.Maybe (fromJust)
|
|
||||||
import qualified Data.Map as Map
|
import qualified Data.Map as Map
|
||||||
import Data.Semigroup (Max(..))
|
import Data.Semigroup (Max(..))
|
||||||
|
|
||||||
import Data.Time.Zones
|
import Data.Time.Zones
|
||||||
|
|
||||||
import Control.Monad.Trans.Writer (execWriterT)
|
import Control.Monad.Trans.Writer (WriterT, execWriterT)
|
||||||
import Control.Monad.Writer.Class (MonadWriter(..))
|
import Control.Monad.Writer.Class (MonadWriter(..))
|
||||||
|
|
||||||
import qualified Data.Conduit.List as C
|
import qualified Data.Conduit.List as C
|
||||||
@ -88,28 +87,31 @@ determineCrontab = execWriterT $ do
|
|||||||
, cronRateLimit = 3600 -- Irrelevant due to `cronRepeat`
|
, cronRateLimit = 3600 -- Irrelevant due to `cronRepeat`
|
||||||
, cronNotAfter = Left nominalDay
|
, cronNotAfter = Left nominalDay
|
||||||
}
|
}
|
||||||
|
|
||||||
sheetSubmissions <- lift $ collateSubmissions <$>
|
|
||||||
selectList [SubmissionRatingBy !=. Nothing, SubmissionSheet ==. nSheet] []
|
|
||||||
tell $ flip Map.foldMapWithKey sheetSubmissions $
|
|
||||||
\nUser (Max mbTime) -> if
|
|
||||||
| Just time <- mbTime -> HashMap.singleton
|
|
||||||
(JobCtlQueue $ JobQueueNotification NotificationCorrectionsAssigned { nUser, nSheet } )
|
|
||||||
Cron
|
|
||||||
{ cronInitial = CronTimestamp $ utcToLocalTimeTZ appTZ $ addUTCTime appNotificationCollateDelay time
|
|
||||||
, cronRepeat = CronRepeatNever
|
|
||||||
, cronRateLimit = appNotificationRateLimit
|
|
||||||
, cronNotAfter = Left appNotificationExpiration
|
|
||||||
}
|
|
||||||
| otherwise -> mempty
|
|
||||||
|
|
||||||
runConduit $ transPipe lift (selectSource [] []) .| C.mapM_ sheetJobs
|
runConduit $ transPipe lift (selectSource [] []) .| C.mapM_ sheetJobs
|
||||||
|
|
||||||
-- | Partial function: Submission must not have Nothing at ratingBy
|
let
|
||||||
collateSubmissions :: [Entity Submission] -> Map UserId (Max (Maybe UTCTime))
|
correctorNotifications :: Map (UserId, SheetId) (Max UTCTime) -> WriterT (Crontab JobCtl) DB ()
|
||||||
collateSubmissions = Map.fromListWith (<>) . fmap procCorrector
|
correctorNotifications = (tell .) . Map.foldMapWithKey $ \(nUser, nSheet) (Max time) -> HashMap.singleton
|
||||||
where
|
(JobCtlQueue $ JobQueueNotification NotificationCorrectionsAssigned { nUser, nSheet } )
|
||||||
procCorrector :: Entity Submission -> (UserId ,Max (Maybe UTCTime))
|
Cron
|
||||||
procCorrector = (,) <$> fromJust . submissionRatingBy . entityVal
|
{ cronInitial = CronTimestamp . utcToLocalTimeTZ appTZ $ addUTCTime appNotificationCollateDelay time
|
||||||
<*> Max . submissionRatingAssigned . entityVal
|
, cronRepeat = CronRepeatNever
|
||||||
|
, cronRateLimit = appNotificationRateLimit
|
||||||
|
, cronNotAfter = Left appNotificationExpiration
|
||||||
|
}
|
||||||
|
|
||||||
|
submissionsByCorrector :: Entity Submission -> Map (UserId, SheetId) (Max UTCTime)
|
||||||
|
submissionsByCorrector (Entity _ sub)
|
||||||
|
| Just ratingBy <- submissionRatingBy sub
|
||||||
|
, Just assigned <- submissionRatingAssigned sub
|
||||||
|
, not $ submissionRatingDone sub
|
||||||
|
= Map.singleton (ratingBy, submissionSheet sub) $ Max assigned
|
||||||
|
| otherwise
|
||||||
|
= Map.empty
|
||||||
|
|
||||||
|
collateSubmissionsByCorrector acc entity = Map.unionWith (<>) acc $ submissionsByCorrector entity
|
||||||
|
correctorNotifications <=< runConduit $
|
||||||
|
transPipe lift ( selectSource [ SubmissionRatingBy !=. Nothing, SubmissionRatingAssigned !=. Nothing ] []
|
||||||
|
)
|
||||||
|
.| C.fold collateSubmissionsByCorrector Map.empty
|
||||||
|
|||||||
Reference in New Issue
Block a user