chore(lms): implement job handler to enqueue renewals

This commit is contained in:
Steffen Jost 2022-04-05 18:06:33 +02:00
parent 21b74a5d7f
commit 19f77dad02
3 changed files with 44 additions and 17 deletions

View File

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

View File

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

View File

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