-- SPDX-FileCopyrightText: 2022-23 Gregor Kleen , Steffen Jost -- -- SPDX-License-Identifier: AGPL-3.0-or-later module Jobs.Handler.SynchroniseAvs ( dispatchJobSynchroniseAvsId , dispatchJobSynchroniseAvsUser ) where import Import import Handler.Utils.Avs {- TODO: general AVS synchronisation dispatchJobSynchroniseLdap :: Natural -> Natural -> Natural -> JobHandler UniWorX dispatchJobSynchroniseLdap numIterations epoch iteration = JobHandlerAtomic . runConduit $ readUsers .| filterIteration .| sinkDBJobs where readUsers :: ConduitT () UserId (YesodJobDB UniWorX) () readUsers = selectKeys [] [] filterIteration :: ConduitT UserId Job (YesodJobDB UniWorX) () filterIteration = C.mapMaybeM $ \userId -> runMaybeT $ do let userIteration, currentIteration :: Integer userIteration = toInteger (hash epoch `hashWithSalt` userId) `mod` toInteger numIterations currentIteration = toInteger iteration `mod` toInteger numIterations $logDebugS "SynchroniseLdap" [st|User ##{tshow (fromSqlKey userId)}: sync on #{tshow userIteration}/#{tshow numIterations}, now #{tshow currentIteration}|] guard $ userIteration == currentIteration return $ JobSynchroniseLdapUser userId -} dispatchJobSynchroniseAvsId :: AvsPersonId -> JobHandler UniWorX dispatchJobSynchroniseAvsId = JobHandlerException . void . upsertAvsUserById -- updates UserAvsLAstSynch dispatchJobSynchroniseAvsUser :: UserId -> JobHandler UniWorX dispatchJobSynchroniseAvsUser jUser = JobHandlerException $ do runDB (getBy $ UniqueUserAvsUser jUser) >>= \case Nothing -> return () -- no attempt to associate an AVS user is done here Just usrAvsEnt -> void $ upsertAvsUserById $ usrAvsEnt ^. _entityVal . _userAvsPersonId -- updates UserAvsLAstSynch