chore(avs): work on new avs upsert user (WIP)
This commit is contained in:
parent
453bbd6ce4
commit
88d0bf03bf
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
module Foundation.Yesod.Auth
|
module Foundation.Yesod.Auth
|
||||||
( authenticate
|
( authenticate
|
||||||
, upsertCampusUser
|
, upsertCampusUser, upsertCampusUserByCn
|
||||||
, decodeUserTest
|
, decodeUserTest
|
||||||
, CampusUserConversionException(..)
|
, CampusUserConversionException(..)
|
||||||
, campusUserFailoverMode, updateUserLanguage
|
, campusUserFailoverMode, updateUserLanguage
|
||||||
@ -152,6 +152,14 @@ _upsertCampusUserMode mMode cs@Creds{..}
|
|||||||
|
|
||||||
defaultOther = apHash
|
defaultOther = apHash
|
||||||
|
|
||||||
|
upsertCampusUserByCn :: forall m.
|
||||||
|
( MonadHandler m, HandlerSite m ~ UniWorX
|
||||||
|
, MonadThrow m
|
||||||
|
)
|
||||||
|
=> Text -> SqlPersistT m (Entity User)
|
||||||
|
upsertCampusUserByCn persNo = upsertCampusUser UpsertCampusUserGuessUser [(ldapPrimaryKey,[Text.encodeUtf8 persNo])]
|
||||||
|
|
||||||
|
|
||||||
upsertCampusUser :: forall m.
|
upsertCampusUser :: forall m.
|
||||||
( MonadHandler m, HandlerSite m ~ UniWorX
|
( MonadHandler m, HandlerSite m ~ UniWorX
|
||||||
, MonadThrow m
|
, MonadThrow m
|
||||||
|
|||||||
@ -9,7 +9,7 @@ module Handler.Utils.Avs
|
|||||||
, setLicence, setLicenceAvs, setLicencesAvs
|
, setLicence, setLicenceAvs, setLicencesAvs
|
||||||
, checkLicences
|
, checkLicences
|
||||||
, lookupAvsUser, lookupAvsUsers
|
, lookupAvsUser, lookupAvsUsers
|
||||||
, upsertAvsUser, upsertAvsUserByCard
|
, upsertAvsUserById, upsertAvsUserByCard
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import Import
|
import Import
|
||||||
@ -21,11 +21,10 @@ import Utils.Avs
|
|||||||
|
|
||||||
import qualified Data.Set as Set
|
import qualified Data.Set as Set
|
||||||
import qualified Data.Map as Map
|
import qualified Data.Map as Map
|
||||||
import qualified Data.Text.Encoding as Text
|
|
||||||
|
|
||||||
import qualified Data.CaseInsensitive as CI
|
import qualified Data.CaseInsensitive as CI
|
||||||
import Auth.LDAP (ldapUserPrincipalName)
|
-- import Auth.LDAP (ldapUserPrincipalName)
|
||||||
import Foundation.Yesod.Auth (upsertCampusUser,CampusUserConversionException())
|
import Foundation.Yesod.Auth (upsertCampusUserByCn,CampusUserConversionException())
|
||||||
|
|
||||||
import Handler.Users.Add
|
import Handler.Users.Add
|
||||||
|
|
||||||
@ -115,16 +114,17 @@ checkLicences = do
|
|||||||
|
|
||||||
|
|
||||||
{-
|
{-
|
||||||
upsertAvsUser :: AvsStatusPerson ->
|
upsertAvsUser :: Text -> Handler (Maybe UserId)
|
||||||
|
upsertAvsUser someid
|
||||||
or
|
| isAvsId someid = error "TODO"
|
||||||
|
| isEmail someid = error "TODO"
|
||||||
|
| isNumber someid = error "TODO"
|
||||||
-}
|
-}
|
||||||
|
|
||||||
-- | Retrieve and _always_ update user by AvsPersonId. Non-existing users are created.
|
-- | Retrieve and _always_ update user by AvsPersonId. Non-existing users are created.
|
||||||
-- Throws errors if the avsInterface in unavailable or the user is non-unique within external AVS DB (should never happen).
|
-- Throws errors if the avsInterface in unavailable or the user is non-unique within external AVS DB (should never happen).
|
||||||
upsertAvsUser :: AvsPersonId -> Handler (Maybe UserId)
|
upsertAvsUserById :: AvsPersonId -> Handler (Maybe UserId)
|
||||||
upsertAvsUser api = do
|
upsertAvsUserById api = do
|
||||||
mbapd <- lookupAvsUser api
|
mbapd <- lookupAvsUser api
|
||||||
mbuid <- runDB $ do
|
mbuid <- runDB $ do
|
||||||
mbuid <- getBy (UniqueUserAvsId api)
|
mbuid <- getBy (UniqueUserAvsId api)
|
||||||
@ -136,7 +136,8 @@ upsertAvsUser api = do
|
|||||||
[uid] -> insertUniqueEntity $ UserAvs api uid
|
[uid] -> insertUniqueEntity $ UserAvs api uid
|
||||||
(_:_) -> throwM AvsUserAmbiguous
|
(_:_) -> throwM AvsUserAmbiguous
|
||||||
[] -> do
|
[] -> do
|
||||||
upsRes :: Either CampusUserConversionException (Entity User) <- try $ upsertCampusUser UpsertCampusUserGuessUser [(ldapUserPrincipalName,[Text.encodeUtf8 persNo])]
|
upsRes :: Either CampusUserConversionException (Entity User)
|
||||||
|
<- try $ upsertCampusUserByCn persNo
|
||||||
case upsRes of
|
case upsRes of
|
||||||
Right Entity{entityKey=uid} -> insertUniqueEntity $ UserAvs api uid
|
Right Entity{entityKey=uid} -> insertUniqueEntity $ UserAvs api uid
|
||||||
_other -> return mbuid -- ==Nothing -- user could not be created somehow
|
_other -> return mbuid -- ==Nothing -- user could not be created somehow
|
||||||
@ -144,7 +145,7 @@ upsertAvsUser api = do
|
|||||||
case (mbuid, mbapd) of
|
case (mbuid, mbapd) of
|
||||||
( _ , Nothing ) -> throwM $ AvsUserUnknownByAvs api -- User not found in AVS at all, i.e. no valid card exists yet
|
( _ , Nothing ) -> throwM $ AvsUserUnknownByAvs api -- User not found in AVS at all, i.e. no valid card exists yet
|
||||||
(Nothing, Just AvsDataPerson{..}) -> do -- No LDAP User, but found in AVS; create user
|
(Nothing, Just AvsDataPerson{..}) -> do -- No LDAP User, but found in AVS; create user
|
||||||
let firmAddress = mergeFirmAddress <$> guessLicenceAddress avsPersonPersonCards
|
let firmAddress = mergeCompanyAddress <$> guessLicenceAddress avsPersonPersonCards
|
||||||
bestCard = Set.lookupMax avsPersonPersonCards
|
bestCard = Set.lookupMax avsPersonPersonCards
|
||||||
fakeIdent = CI.mk $ tshow api
|
fakeIdent = CI.mk $ tshow api
|
||||||
newUsr = AdminUserForm
|
newUsr = AdminUserForm
|
||||||
@ -166,7 +167,7 @@ upsertAvsUser api = do
|
|||||||
, aufIdent = fakeIdent -- use AvsPersonId instead
|
, aufIdent = fakeIdent -- use AvsPersonId instead
|
||||||
, aufAuth = maybe AuthKindNoLogin (const AuthKindLDAP) avsPersonInternalPersonalNo -- FUTURE TODO: if email is known, use AuthKinfPWHash for email invite, if no internal personal number is known
|
, aufAuth = maybe AuthKindNoLogin (const AuthKindLDAP) avsPersonInternalPersonalNo -- FUTURE TODO: if email is known, use AuthKinfPWHash for email invite, if no internal personal number is known
|
||||||
}
|
}
|
||||||
_ <- addNewUser newUsr
|
_ <- addNewUser newUsr -- trigger JobSynchroniseLdapUser, JobSendPasswordReset and NotificationUserAutoModeUpdate -- TODO: check if these are failsafe
|
||||||
-- _newAvs = UserAvs avsPersonPersonID uid
|
-- _newAvs = UserAvs avsPersonPersonID uid
|
||||||
-- _newAvsCards = UserAvsCard
|
-- _newAvsCards = UserAvsCard
|
||||||
error "TODO" -- CONTINUE HERE
|
error "TODO" -- CONTINUE HERE
|
||||||
@ -193,7 +194,7 @@ upsertAvsUserByCard persNo = do
|
|||||||
mbuid <- runDB $ getBy $ UniqueUserAvsId appi
|
mbuid <- runDB $ getBy $ UniqueUserAvsId appi
|
||||||
case mbuid of
|
case mbuid of
|
||||||
(Just (Entity _ UserAvs{userAvsUser=uau})) -> return $ Just uau
|
(Just (Entity _ UserAvs{userAvsUser=uau})) -> return $ Just uau
|
||||||
Nothing -> upsertAvsUser appi
|
Nothing -> upsertAvsUserById appi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -98,9 +98,9 @@ guessLicenceAddress cards
|
|||||||
| otherwise = Nothing
|
| otherwise = Nothing
|
||||||
|
|
||||||
-- | Helper for guessLicenceAddress
|
-- | Helper for guessLicenceAddress
|
||||||
mergeFirmAddress :: (Maybe Text, Text, a) -> Text
|
mergeCompanyAddress :: (Maybe Text, Text, a) -> Text
|
||||||
mergeFirmAddress (Nothing , addr, _) = addr
|
mergeCompanyAddress (Nothing , addr, _) = addr
|
||||||
mergeFirmAddress (Just firm, addr, _) = firm <> Text.cons '\n' addr
|
mergeCompanyAddress (Just firm, addr, _) = firm <> Text.cons '\n' addr
|
||||||
|
|
||||||
hasAddress :: AvsDataPersonCard -> Bool
|
hasAddress :: AvsDataPersonCard -> Bool
|
||||||
hasAddress AvsDataPersonCard{..} = isJust avsDataStreet && isJust avsDataCity && isJust avsDataPostalCode
|
hasAddress AvsDataPersonCard{..} = isJust avsDataStreet && isJust avsDataCity && isJust avsDataPostalCode
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user