From f1021d4e104bace030a7e69b6cb6cc923c50c3e6 Mon Sep 17 00:00:00 2001 From: Steffen Jost Date: Wed, 6 Apr 2022 18:19:36 +0200 Subject: [PATCH] chore(lms): add primary lms job handler for kickoff of all qualifications --- src/Jobs/Handler/LMS.hs | 23 ++++++++++++++++++++--- src/Jobs/Types.hs | 1 + src/Model/Types/DateTime.hs | 2 +- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/Jobs/Handler/LMS.hs b/src/Jobs/Handler/LMS.hs index 5b468288e..864af0e04 100644 --- a/src/Jobs/Handler/LMS.hs +++ b/src/Jobs/Handler/LMS.hs @@ -1,7 +1,8 @@ {-# LANGUAGE TypeApplications #-} module Jobs.Handler.LMS - ( dispatchJobLmsEnqueue, dispatchJobLmsEnqueueUser + ( dispatchJobLmsQualifications + , dispatchJobLmsEnqueue, dispatchJobLmsEnqueueUser , dispatchJobLmsDequeue , dispatchJobLmsResults , dispatchJobLmsUserlist @@ -20,9 +21,25 @@ import qualified Database.Esqueleto.Utils as E import Handler.Utils.LMS (randomLMSIdent, randomLMSpw, maxLmsUserIdentRetries) +dispatchJobLmsQualifications :: JobHandler UniWorX +dispatchJobLmsQualifications = JobHandlerAtomic act + where + act :: YesodJobDB UniWorX () + act = do + qids <- E.select $ do + q <- E.from $ E.table @Qualification + E.where_ $ q E.^. QualificationElearningStart + E.&&. E.isJust (q E.^. QualificationRefreshWithin) + pure $ q E.^. QualificationId + forM_ qids $ \(E.unValue -> qid) -> do + $logInfoS "lms" $ "Start e-learning for qualification " <> tshow qid <> "." + queueDBJob $ JobLmsEnqueue qid + + dispatchJobLmsEnqueue :: QualificationId -> JobHandler UniWorX dispatchJobLmsEnqueue qid = JobHandlerAtomic act where + -- TODO: get rid of QualificationId Parameter and use a join instead? Fails since addGregorianDurationClip cannot be performed within DB -- act :: YesodJobDB UniWorX () act = do quali <- getJust qid -- may throw an error, aborting the job @@ -63,10 +80,10 @@ dispatchJobLmsEnqueueUser qid uid = JobHandlerAtomic act , lmsUserEnded = Nothing } -- startLmsUser :: YesodJobDB UniWorX (Maybe (Entity LmsUser)) - startLmsUser = insertUniqueEntity =<< (mkLmsUser <$> randomLMSIdent <*> randomLMSpw) + startLmsUser = E.insertUniqueEntity =<< (mkLmsUser <$> randomLMSIdent <*> randomLMSpw) inserted <- untilJustMaxM maxLmsUserIdentRetries startLmsUser case inserted of - Nothing -> $logErrorS "lms" "Inserting fresh LmsIdent failed!" + Nothing -> $logErrorS "LMS" "Generating and inserting fresh LmsIdent failed!" (Just _) -> error "continue here by notifying user by email or mail" diff --git a/src/Jobs/Types.hs b/src/Jobs/Types.hs index c7fea5cbc..af12666b4 100644 --- a/src/Jobs/Types.hs +++ b/src/Jobs/Types.hs @@ -105,6 +105,7 @@ data Job , jEpoch , jIteration :: Natural } + | JobLmsQualifications | JobLmsEnqueue { jQualification :: QualificationId } | JobLmsEnqueueUser { jQualification :: QualificationId, jUser :: UserId } | JobLmsDequeue { jQualification :: QualificationId } diff --git a/src/Model/Types/DateTime.hs b/src/Model/Types/DateTime.hs index 065a38f08..97bceaae1 100644 --- a/src/Model/Types/DateTime.hs +++ b/src/Model/Types/DateTime.hs @@ -71,7 +71,7 @@ shortened = iso shorten expand -- Handler.Utils.Widget.tidFromText -- MsgTermPlaceHolder termToText :: TermIdentifier -> Text -termToText TermIdentifier{..} = Text.pack . show $ year -- ^. shortened +termToText TermIdentifier{..} = tshow year -- ^. shortened termFromText :: Text -> Either Text TermIdentifier termFromText t