From 000d8100db357b2cbadcf6969221cc888adc0183 Mon Sep 17 00:00:00 2001 From: Steffen Date: Thu, 8 Aug 2024 18:19:09 +0200 Subject: [PATCH] chore(avs): towards #124 add jobworker for AVS licence synch (WIP) --- src/Jobs/Handler/SynchroniseAvs.hs | 29 +++++++++++++++++++++++++++++ src/Jobs/Types.hs | 1 + 2 files changed, 30 insertions(+) diff --git a/src/Jobs/Handler/SynchroniseAvs.hs b/src/Jobs/Handler/SynchroniseAvs.hs index 2de92b595..2b80faa60 100644 --- a/src/Jobs/Handler/SynchroniseAvs.hs +++ b/src/Jobs/Handler/SynchroniseAvs.hs @@ -7,10 +7,12 @@ module Jobs.Handler.SynchroniseAvs -- , dispatchJobSynchroniseAvsId -- , dispatchJobSynchroniseAvsUser , dispatchJobSynchroniseAvsQueue + , dispatchJobSynchroniseAvsLicences ) where import Import +import qualified Data.Text as Text import qualified Data.Set as Set import qualified Data.Conduit.List as C @@ -128,3 +130,30 @@ dispatchJobSynchroniseAvsQueue = JobHandlerException $ do discernJob accs ( _ , E.Value (Just api), E.Value True ) = accs & over _2 (Set.insert api) discernJob accs (E.Value uid, E.Value Nothing , E.Value True ) = accs & over _1 (Set.insert uid) discernJob accs ( _ , _ , E.Value False ) = accs + + +----------------- +-- AVS Licences + +dispatchJobSynchroniseAvsLicences :: JobHandler UniWorX +-- dispatchJobSynchroniseAvsLicences = error "TODO" +dispatchJobSynchroniseAvsLicences = JobHandlerException $ do -- when (synchLevel > 0) $ do + let synchLevel = 0 -- SynchLevel corresponds to tables of ProblemAvsSynchR: 4=top grant R, 3= reduce R->F, 2= grant F, 1= revoke F + -- TODO: turn level into a setting + -- TODO: enable a cron job by setting + procLic :: AvsLicence -> Bool -> Set AvsPersonId -> Handler () + procLic aLic up apids + | n <- Set.size apids, n > 0 = do + let subtype = Text.cons (bool '↧' '↥' up) $ Text.singleton $ licence2char aLic + logit errm = runDB $ logInterface' "AVS" subtype False (isJust errm) (Just n) (fromMaybe "Automatic synch" errm) + catchAllAvs = flip catch (\err -> logit (Just $ tshow (err :: SomeException)) >> return (-1)) + oks <- catchAllAvs $ setLicencesAvs $ Set.map (AvsPersonLicence aLic) apids + when (oks > 0) $ logit $ toMaybe (oks /= n) [st|Only #{tshow oks}/#{tshow n} licence changes accepted by AVS|] + | otherwise = return () + + AvsLicenceDifferences{..} <- retrieveDifferingLicences + when (synchLevel >= 4) $ procLic AvsLicenceRollfeld True avsLicenceDiffGrantRollfeld --grant Rollfeld + when (synchLevel >= 3) $ procLic AvsLicenceVorfeld False avsLicenceDiffRevokeRollfeld --downgrade Rollfeld -> Vorfeld + when (synchLevel >= 2) $ procLic AvsLicenceVorfeld True avsLicenceDiffGrantVorfeld --grant Vorfeld + when (synchLevel >= 1) $ procLic AvsNoLicence False avsLicenceDiffRevokeAll --revoke Vorfeld & Rollfeld + diff --git a/src/Jobs/Types.hs b/src/Jobs/Types.hs index 5c8f8fde4..24bb89c3a 100644 --- a/src/Jobs/Types.hs +++ b/src/Jobs/Types.hs @@ -109,6 +109,7 @@ data Job -- , jSynchAfter :: Maybe Day -- } | JobSynchroniseAvsQueue + | JobSynchroniseAvsLicences | JobChangeUserDisplayEmail { jUser :: UserId , jDisplayEmail :: UserEmail }