chore(lms): implement job handler to enqueue renewals
This commit is contained in:
parent
21b74a5d7f
commit
19f77dad02
@ -58,9 +58,9 @@ QualificationUser
|
|||||||
-- LMS Interface Tables, need regular processing by background jobs, per QualificationId:
|
-- LMS Interface Tables, need regular processing by background jobs, per QualificationId:
|
||||||
--
|
--
|
||||||
-- 1. Daily Job: Add to LmsUser daily all qualification holders with
|
-- 1. Daily Job: Add to LmsUser daily all qualification holders with
|
||||||
-- 0 <= QualificationUserValidUntil - now < QualificationRefreshWithin (time to schedule refresher)
|
-- QualificationUserValidUntil >= now
|
||||||
-- /\ now - max(LmsUserStarted) > QualificationRefreshWithin (not already enlisted; Problem: QualificationELearningOnly!)
|
-- /\ QualificationUserValudUntil <= now + QualificationRefreshWithin (time to schedule refresher)
|
||||||
-- generate fresh ident and pin. (Bools?)
|
-- /\ not already enlisted
|
||||||
--
|
--
|
||||||
-- 2. REST GET User.csv:
|
-- 2. REST GET User.csv:
|
||||||
-- - where LmsUserReceived == Nothing \/ (LmsUserResetPin /\ LmsUserEnded == Nothing)
|
-- - where LmsUserReceived == Nothing \/ (LmsUserResetPin /\ LmsUserEnded == Nothing)
|
||||||
|
|||||||
@ -1,13 +1,14 @@
|
|||||||
{-# LANGUAGE TypeApplications #-}
|
{-# LANGUAGE TypeApplications #-}
|
||||||
|
|
||||||
module Jobs.Handler.LMS
|
module Jobs.Handler.LMS
|
||||||
( dispatchJobLmsEnqueue
|
( dispatchJobLmsEnqueue, dispatchJobLmsEnqueueUser
|
||||||
, dispatchJobLmsDequeue
|
, dispatchJobLmsDequeue
|
||||||
, dispatchJobLmsResults
|
, dispatchJobLmsResults
|
||||||
, dispatchJobLmsUserlist
|
, dispatchJobLmsUserlist
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import Import
|
import Import
|
||||||
|
import Jobs.Queue
|
||||||
|
|
||||||
-- import Jobs.Handler.Intervals.Utils
|
-- import Jobs.Handler.Intervals.Utils
|
||||||
import qualified Database.Esqueleto.Experimental as E
|
import qualified Database.Esqueleto.Experimental as E
|
||||||
@ -18,14 +19,32 @@ import qualified Database.Esqueleto.Utils as E
|
|||||||
-- import Handler.Utils.DateTime (addDiffDays)
|
-- import Handler.Utils.DateTime (addDiffDays)
|
||||||
|
|
||||||
dispatchJobLmsEnqueue :: QualificationId -> JobHandler UniWorX
|
dispatchJobLmsEnqueue :: QualificationId -> JobHandler UniWorX
|
||||||
dispatchJobLmsEnqueue _qid = JobHandlerAtomic act
|
dispatchJobLmsEnqueue qid = JobHandlerAtomic act
|
||||||
where
|
where
|
||||||
-- act :: YesodJobDB UniWorX ()
|
-- act :: YesodJobDB UniWorX ()
|
||||||
act = hoist lift $ do
|
act = do
|
||||||
{-
|
quali <- getJust qid -- may throw an error, aborting the job
|
||||||
now <- liftIO getCurrentTime
|
case qualificationRefreshWithin quali of
|
||||||
mbq <- E.selectOne $ E.from $ \quali -> E.where_ (quali E.^. QualificationId E.==. E.val qid) >> pure quali
|
Nothing -> return () -- no automatic scheduling for this qid
|
||||||
-- Just quali <- get qid
|
(Just renewalPeriod) -> do
|
||||||
|
nowaday <- utctDay <$> liftIO getCurrentTime
|
||||||
|
let renewalDate = addGregorianDurationClip renewalPeriod nowaday
|
||||||
|
renewalUsers <- E.select $ do
|
||||||
|
quser <- E.from $ E.table @QualificationUser
|
||||||
|
E.where_ $ quser E.^. QualificationUserQualification E.==. E.val qid
|
||||||
|
E.&&. quser E.^. QualificationUserValidUntil E.>=. E.val nowaday
|
||||||
|
E.&&. quser E.^. QualificationUserValidUntil E.<=. E.val renewalDate
|
||||||
|
E.&&. E.notExists (do
|
||||||
|
luser <- E.from $ E.table @LmsUser
|
||||||
|
E.where_ $ luser E.^. LmsUserQualification E.==. E.val qid
|
||||||
|
E.&&. luser E.^. LmsUserUser E.==. quser E.^. QualificationUserUser
|
||||||
|
)
|
||||||
|
pure (quser E.^. QualificationUserUser)
|
||||||
|
forM_ renewalUsers (\uid -> queueDBJob JobLmsEnqueueUser { jQualification = qid, jUser = E.unValue uid } )
|
||||||
|
|
||||||
|
|
||||||
|
{-
|
||||||
|
hoist lift $ do
|
||||||
|
|
||||||
let (Entity _ quali) = fromMaybe (error "TODO") mbq -- HACK / TODO
|
let (Entity _ quali) = fromMaybe (error "TODO") mbq -- HACK / TODO
|
||||||
refreshTime = fromMaybe (error "TODO") $ qualificationRefreshWithin quali -- HACK / TODO
|
refreshTime = fromMaybe (error "TODO") $ qualificationRefreshWithin quali -- HACK / TODO
|
||||||
@ -51,7 +70,7 @@ dispatchJobLmsEnqueue _qid = JobHandlerAtomic act
|
|||||||
E.<# E.val qid
|
E.<# E.val qid
|
||||||
E.<&> (quser E.^. QualificationUserUser)
|
E.<&> (quser E.^. QualificationUserUser)
|
||||||
E.<&> E.val freshIdent -- ident -- THIS IS A PROBLEM! MUST ALSO BE UNIQUE!
|
E.<&> E.val freshIdent -- ident -- THIS IS A PROBLEM! MUST ALSO BE UNIQUE!
|
||||||
E.<&> E.val freshPin -- pin -- THIS IS A PROBLEM!
|
E.<&> E.val freshPin -- pin -- can be done: E.unsafeSqlFunction "substring(gen_random_uuid()::text from 1 for 8)"
|
||||||
E.<&> E.false -- reset
|
E.<&> E.false -- reset
|
||||||
E.<&> E.nothing -- status
|
E.<&> E.nothing -- status
|
||||||
E.<&> E.val now -- started
|
E.<&> E.val now -- started
|
||||||
@ -60,15 +79,22 @@ dispatchJobLmsEnqueue _qid = JobHandlerAtomic act
|
|||||||
)
|
)
|
||||||
|
|
||||||
-- find qualification holders
|
-- find qualification holders
|
||||||
-}
|
-
|
||||||
error "lms dequeu stub"
|
error "lms dequeu stub"
|
||||||
|
-}
|
||||||
|
|
||||||
|
dispatchJobLmsEnqueueUser :: QualificationId -> UserId -> JobHandler UniWorX
|
||||||
|
dispatchJobLmsEnqueueUser _qid _uid =
|
||||||
|
-- lident <- randomLMSIdent
|
||||||
|
-- lpw <- randomLMSpw
|
||||||
|
error "lms enqueue user stub"
|
||||||
|
|
||||||
dispatchJobLmsDequeue :: QualificationId -> JobHandler UniWorX
|
dispatchJobLmsDequeue :: QualificationId -> JobHandler UniWorX
|
||||||
dispatchJobLmsDequeue _qid =
|
dispatchJobLmsDequeue _qid =
|
||||||
-- wenn bestanden: qualification verlängern & LmsIdent löschen
|
-- wenn bestanden: qualification verlängern & LmsIdent löschen
|
||||||
-- wenn durchgefallen: LmsIdent löschen
|
-- wenn durchgefallen: LmsIdent löschen
|
||||||
-- wenn Zeit abgelaufen: LmsIdent löschen
|
-- wenn Zeit abgelaufen: LmsIdent löschen
|
||||||
error "lms dequeu stub"
|
error "lms dequeue stub"
|
||||||
|
|
||||||
dispatchJobLmsResults :: QualificationId -> JobHandler UniWorX
|
dispatchJobLmsResults :: QualificationId -> JobHandler UniWorX
|
||||||
dispatchJobLmsResults qid = JobHandlerAtomic act
|
dispatchJobLmsResults qid = JobHandlerAtomic act
|
||||||
|
|||||||
@ -105,10 +105,11 @@ data Job
|
|||||||
, jEpoch
|
, jEpoch
|
||||||
, jIteration :: Natural
|
, jIteration :: Natural
|
||||||
}
|
}
|
||||||
| JobLmsEnqueue { jQualification :: QualificationId }
|
| JobLmsEnqueue { jQualification :: QualificationId }
|
||||||
| JobLmsDequeue { jQualification :: QualificationId }
|
| JobLmsEnqueueUser { jQualification :: QualificationId, jUser :: UserId }
|
||||||
| JobLmsUserlist { jQualification :: QualificationId }
|
| JobLmsDequeue { jQualification :: QualificationId }
|
||||||
| JobLmsResults { jQualification :: QualificationId }
|
| JobLmsUserlist { jQualification :: QualificationId }
|
||||||
|
| JobLmsResults { jQualification :: QualificationId }
|
||||||
deriving (Eq, Ord, Show, Read, Generic, Typeable)
|
deriving (Eq, Ord, Show, Read, Generic, Typeable)
|
||||||
data Notification
|
data Notification
|
||||||
= NotificationSubmissionRated { nSubmission :: SubmissionId }
|
= NotificationSubmissionRated { nSubmission :: SubmissionId }
|
||||||
|
|||||||
Reference in New Issue
Block a user