Skip to content

Commit

Permalink
Remove phone and full identity constructor
Browse files Browse the repository at this point in the history
  • Loading branch information
pcapriotti authored and mdimjasevic committed Jun 6, 2024
1 parent 2e1078e commit da929a6
Show file tree
Hide file tree
Showing 25 changed files with 88 additions and 313 deletions.
2 changes: 0 additions & 2 deletions libs/wire-api/src/Wire/API/Routes/Public/Brig.hs
Original file line number Diff line number Diff line change
Expand Up @@ -361,7 +361,6 @@ type SelfAPI =
\email address and a password."
:> MakesFederatedCall 'Brig "send-connection-action"
:> ZUser
:> ZConn
:> "self"
:> "phone"
:> MultiVerb 'DELETE '[JSON] RemoveIdentityResponses (Maybe RemoveIdentityError)
Expand All @@ -377,7 +376,6 @@ type SelfAPI =
\phone number."
:> MakesFederatedCall 'Brig "send-connection-action"
:> ZUser
:> ZConn
:> "self"
:> "email"
:> MultiVerb 'DELETE '[JSON] RemoveIdentityResponses (Maybe RemoveIdentityError)
Expand Down
19 changes: 8 additions & 11 deletions libs/wire-api/src/Wire/API/User.hs
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@ module Wire.API.User
User (..),
userId,
userEmail,
userPhone,
userSSOId,
userIssuer,
userSCIMExternalId,
Expand Down Expand Up @@ -66,7 +65,6 @@ module Wire.API.User
newUserInvitationCode,
newUserTeam,
newUserEmail,
newUserPhone,
newUserSSOId,
isNewUserEphemeral,
isNewUserTeamMember,
Expand Down Expand Up @@ -750,9 +748,6 @@ userObjectSchema =
userEmail :: User -> Maybe Email
userEmail = emailIdentity <=< userIdentity

userPhone :: User -> Maybe Phone
userPhone = phoneIdentity <=< userIdentity

userSSOId :: User -> Maybe UserSSOId
userSSOId = ssoIdentity <=< userIdentity

Expand Down Expand Up @@ -1066,7 +1061,8 @@ newUserFromSpar new =
NewUser
{ newUserDisplayName = newUserSparDisplayName new,
newUserUUID = Just $ newUserSparUUID new,
newUserIdentity = Just $ SSOIdentity (newUserSparSSOId new) Nothing Nothing,
newUserIdentity = Just $ SSOIdentity (newUserSparSSOId new) Nothing,
newUserPhone = Nothing,
newUserPict = Nothing,
newUserAssets = [],
newUserAccentId = Nothing,
Expand All @@ -1086,6 +1082,7 @@ data NewUser = NewUser
-- | use this as 'UserId' (if 'Nothing', call 'Data.UUID.nextRandom').
newUserUUID :: Maybe UUID,
newUserIdentity :: Maybe UserIdentity,
newUserPhone :: Maybe Phone,
-- | DEPRECATED
newUserPict :: Maybe Pict,
newUserAssets :: [Asset],
Expand All @@ -1109,6 +1106,7 @@ emptyNewUser name =
{ newUserDisplayName = name,
newUserUUID = Nothing,
newUserIdentity = Nothing,
newUserPhone = Nothing,
newUserPict = Nothing,
newUserAssets = [],
newUserAccentId = Nothing,
Expand Down Expand Up @@ -1208,7 +1206,7 @@ newUserToRaw NewUser {..} =
{ newUserRawDisplayName = newUserDisplayName,
newUserRawUUID = newUserUUID,
newUserRawEmail = emailIdentity =<< newUserIdentity,
newUserRawPhone = phoneIdentity =<< newUserIdentity,
newUserRawPhone = newUserPhone,
newUserRawSSOId = ssoIdentity =<< newUserIdentity,
newUserRawPict = newUserPict,
newUserRawAssets = newUserAssets,
Expand Down Expand Up @@ -1237,7 +1235,7 @@ newUserFromRaw NewUserRaw {..} = do
(newUserRawInvitationCode, newUserRawTeamCode, newUserRawTeam, newUserRawTeamId)
let identity =
maybeUserIdentityFromComponents
(newUserRawEmail, newUserRawPhone, newUserRawSSOId)
(newUserRawEmail, newUserRawSSOId)
expiresIn <-
case (newUserRawExpiresIn, identity) of
(Just _, Just _) -> fail "Only users without an identity can expire"
Expand All @@ -1247,6 +1245,7 @@ newUserFromRaw NewUserRaw {..} = do
{ newUserDisplayName = newUserRawDisplayName,
newUserUUID = newUserRawUUID,
newUserIdentity = identity,
newUserPhone = newUserRawPhone,
newUserPict = newUserRawPict,
newUserAssets = newUserRawAssets,
newUserAccentId = newUserRawAccentId,
Expand All @@ -1265,6 +1264,7 @@ newUserFromRaw NewUserRaw {..} = do
instance Arbitrary NewUser where
arbitrary = do
newUserIdentity <- arbitrary
newUserPhone <- arbitrary
newUserOrigin <- genUserOrigin newUserIdentity
newUserDisplayName <- arbitrary
newUserUUID <- QC.elements [Just nil, Nothing]
Expand Down Expand Up @@ -1316,9 +1316,6 @@ newUserTeam nu = case newUserOrigin nu of
newUserEmail :: NewUser -> Maybe Email
newUserEmail = emailIdentity <=< newUserIdentity

newUserPhone :: NewUser -> Maybe Phone
newUserPhone = phoneIdentity <=< newUserIdentity

newUserSSOId :: NewUser -> Maybe UserSSOId
newUserSSOId = ssoIdentity <=< newUserIdentity

Expand Down
62 changes: 21 additions & 41 deletions libs/wire-api/src/Wire/API/User/Identity.hs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ module Wire.API.User.Identity
isSSOIdentity,
newIdentity,
emailIdentity,
phoneIdentity,
ssoIdentity,
userIdentityObjectSchema,
maybeUserIdentityObjectSchema,
Expand Down Expand Up @@ -73,7 +72,6 @@ import Data.Text.Encoding
import Data.Text.Encoding.Error
import Data.Text.Lazy qualified as LT
import Data.Time.Clock
import Data.Tuple.Extra (fst3, snd3, thd3)
import Imports
import SAML2.WebSSO (UserRef (..))
import SAML2.WebSSO.Test.Arbitrary ()
Expand All @@ -96,15 +94,13 @@ import Wire.Arbitrary (Arbitrary (arbitrary), GenericUniform (..))
-- | The private unique user identity that is used for login and
-- account recovery.
data UserIdentity
= FullIdentity Email Phone
| EmailIdentity Email
| PhoneIdentity Phone
| SSOIdentity UserSSOId (Maybe Email) (Maybe Phone)
= EmailIdentity Email
| SSOIdentity UserSSOId (Maybe Email)
deriving stock (Eq, Show, Generic)
deriving (Arbitrary) via (GenericUniform UserIdentity)

isSSOIdentity :: UserIdentity -> Bool
isSSOIdentity (SSOIdentity _ _ _) = True
isSSOIdentity (SSOIdentity _ _) = True
isSSOIdentity _ = False

userIdentityObjectSchema :: ObjectSchema SwaggerDoc UserIdentity
Expand All @@ -115,53 +111,37 @@ maybeUserIdentityObjectSchema :: ObjectSchema SwaggerDoc (Maybe UserIdentity)
maybeUserIdentityObjectSchema =
dimap maybeUserIdentityToComponents maybeUserIdentityFromComponents userIdentityComponentsObjectSchema

type UserIdentityComponents = (Maybe Email, Maybe Phone, Maybe UserSSOId)
type UserIdentityComponents = (Maybe Email, Maybe UserSSOId)

userIdentityComponentsObjectSchema :: ObjectSchema SwaggerDoc UserIdentityComponents
userIdentityComponentsObjectSchema =
(,,)
<$> fst3 .= maybe_ (optField "email" schema)
<*> snd3 .= maybe_ (optField "phone" schema)
<*> thd3 .= maybe_ (optField "sso_id" genericToSchema)
(,)
<$> fst .= maybe_ (optField "email" schema)
<*> snd .= maybe_ (optField "sso_id" genericToSchema)

maybeUserIdentityFromComponents :: UserIdentityComponents -> Maybe UserIdentity
maybeUserIdentityFromComponents = \case
(maybeEmail, maybePhone, Just ssoid) -> Just $ SSOIdentity ssoid maybeEmail maybePhone
(Just email, Just phone, Nothing) -> Just $ FullIdentity email phone
(Just email, Nothing, Nothing) -> Just $ EmailIdentity email
(Nothing, Just phone, Nothing) -> Just $ PhoneIdentity phone
(Nothing, Nothing, Nothing) -> Nothing
(maybeEmail, Just ssoid) -> Just $ SSOIdentity ssoid maybeEmail
(Just email, Nothing) -> Just $ EmailIdentity email
(Nothing, Nothing) -> Nothing

maybeUserIdentityToComponents :: Maybe UserIdentity -> UserIdentityComponents
maybeUserIdentityToComponents Nothing = (Nothing, Nothing, Nothing)
maybeUserIdentityToComponents (Just (FullIdentity email phone)) = (Just email, Just phone, Nothing)
maybeUserIdentityToComponents (Just (EmailIdentity email)) = (Just email, Nothing, Nothing)
maybeUserIdentityToComponents (Just (PhoneIdentity phone)) = (Nothing, Just phone, Nothing)
maybeUserIdentityToComponents (Just (SSOIdentity ssoid m_email m_phone)) = (m_email, m_phone, Just ssoid)

newIdentity :: Maybe Email -> Maybe Phone -> Maybe UserSSOId -> Maybe UserIdentity
newIdentity email phone (Just sso) = Just $! SSOIdentity sso email phone
newIdentity Nothing Nothing Nothing = Nothing
newIdentity (Just e) Nothing Nothing = Just $! EmailIdentity e
newIdentity Nothing (Just p) Nothing = Just $! PhoneIdentity p
newIdentity (Just e) (Just p) Nothing = Just $! FullIdentity e p
maybeUserIdentityToComponents Nothing = (Nothing, Nothing)
maybeUserIdentityToComponents (Just (EmailIdentity email)) = (Just email, Nothing)
maybeUserIdentityToComponents (Just (SSOIdentity ssoid m_email)) = (m_email, Just ssoid)

newIdentity :: Maybe Email -> Maybe UserSSOId -> Maybe UserIdentity
newIdentity email (Just sso) = Just $! SSOIdentity sso email
newIdentity (Just e) Nothing = Just $! EmailIdentity e
newIdentity Nothing Nothing = Nothing

emailIdentity :: UserIdentity -> Maybe Email
emailIdentity (FullIdentity email _) = Just email
emailIdentity (EmailIdentity email) = Just email
emailIdentity (PhoneIdentity _) = Nothing
emailIdentity (SSOIdentity _ (Just email) _) = Just email
emailIdentity (SSOIdentity _ Nothing _) = Nothing

phoneIdentity :: UserIdentity -> Maybe Phone
phoneIdentity (FullIdentity _ phone) = Just phone
phoneIdentity (PhoneIdentity phone) = Just phone
phoneIdentity (EmailIdentity _) = Nothing
phoneIdentity (SSOIdentity _ _ (Just phone)) = Just phone
phoneIdentity (SSOIdentity _ _ Nothing) = Nothing
emailIdentity (SSOIdentity _ (Just email)) = Just email
emailIdentity (SSOIdentity _ _) = Nothing

ssoIdentity :: UserIdentity -> Maybe UserSSOId
ssoIdentity (SSOIdentity ssoid _ _) = Just ssoid
ssoIdentity (SSOIdentity ssoid _) = Just ssoid
ssoIdentity _ = Nothing

--------------------------------------------------------------------------------
Expand Down
11 changes: 1 addition & 10 deletions libs/wire-api/test/golden/Test/Wire/API/Golden/Generated.hs
Original file line number Diff line number Diff line change
Expand Up @@ -860,15 +860,6 @@ tests =
),
( Test.Wire.API.Golden.Generated.NewUser_user.testObject_NewUser_user_6,
"testObject_NewUser_user_6.json"
),
( Test.Wire.API.Golden.Generated.NewUser_user.testObject_NewUser_user_7,
"testObject_NewUser_user_7.json"
),
( Test.Wire.API.Golden.Generated.NewUser_user.testObject_NewUser_user_8,
"testObject_NewUser_user_8.json"
),
( Test.Wire.API.Golden.Generated.NewUser_user.testObject_NewUser_user_9,
"testObject_NewUser_user_9.json"
)
],
testGroup "Golden: NewUserPublic_user" $
Expand Down Expand Up @@ -987,7 +978,7 @@ tests =
testGroup "Golden: Activate_user" $
testObjects [(Test.Wire.API.Golden.Generated.Activate_user.testObject_Activate_user_1, "testObject_Activate_user_1.json"), (Test.Wire.API.Golden.Generated.Activate_user.testObject_Activate_user_2, "testObject_Activate_user_2.json"), (Test.Wire.API.Golden.Generated.Activate_user.testObject_Activate_user_3, "testObject_Activate_user_3.json"), (Test.Wire.API.Golden.Generated.Activate_user.testObject_Activate_user_4, "testObject_Activate_user_4.json"), (Test.Wire.API.Golden.Generated.Activate_user.testObject_Activate_user_5, "testObject_Activate_user_5.json"), (Test.Wire.API.Golden.Generated.Activate_user.testObject_Activate_user_6, "testObject_Activate_user_6.json"), (Test.Wire.API.Golden.Generated.Activate_user.testObject_Activate_user_7, "testObject_Activate_user_7.json"), (Test.Wire.API.Golden.Generated.Activate_user.testObject_Activate_user_8, "testObject_Activate_user_8.json"), (Test.Wire.API.Golden.Generated.Activate_user.testObject_Activate_user_9, "testObject_Activate_user_9.json"), (Test.Wire.API.Golden.Generated.Activate_user.testObject_Activate_user_10, "testObject_Activate_user_10.json"), (Test.Wire.API.Golden.Generated.Activate_user.testObject_Activate_user_11, "testObject_Activate_user_11.json"), (Test.Wire.API.Golden.Generated.Activate_user.testObject_Activate_user_12, "testObject_Activate_user_12.json"), (Test.Wire.API.Golden.Generated.Activate_user.testObject_Activate_user_13, "testObject_Activate_user_13.json"), (Test.Wire.API.Golden.Generated.Activate_user.testObject_Activate_user_14, "testObject_Activate_user_14.json"), (Test.Wire.API.Golden.Generated.Activate_user.testObject_Activate_user_15, "testObject_Activate_user_15.json"), (Test.Wire.API.Golden.Generated.Activate_user.testObject_Activate_user_16, "testObject_Activate_user_16.json"), (Test.Wire.API.Golden.Generated.Activate_user.testObject_Activate_user_17, "testObject_Activate_user_17.json"), (Test.Wire.API.Golden.Generated.Activate_user.testObject_Activate_user_18, "testObject_Activate_user_18.json"), (Test.Wire.API.Golden.Generated.Activate_user.testObject_Activate_user_19, "testObject_Activate_user_19.json"), (Test.Wire.API.Golden.Generated.Activate_user.testObject_Activate_user_20, "testObject_Activate_user_20.json")],
testGroup "Golden: ActivationResponse_user" $
testObjects [(Test.Wire.API.Golden.Generated.ActivationResponse_user.testObject_ActivationResponse_user_1, "testObject_ActivationResponse_user_1.json"), (Test.Wire.API.Golden.Generated.ActivationResponse_user.testObject_ActivationResponse_user_2, "testObject_ActivationResponse_user_2.json"), (Test.Wire.API.Golden.Generated.ActivationResponse_user.testObject_ActivationResponse_user_3, "testObject_ActivationResponse_user_3.json"), (Test.Wire.API.Golden.Generated.ActivationResponse_user.testObject_ActivationResponse_user_4, "testObject_ActivationResponse_user_4.json"), (Test.Wire.API.Golden.Generated.ActivationResponse_user.testObject_ActivationResponse_user_5, "testObject_ActivationResponse_user_5.json"), (Test.Wire.API.Golden.Generated.ActivationResponse_user.testObject_ActivationResponse_user_6, "testObject_ActivationResponse_user_6.json"), (Test.Wire.API.Golden.Generated.ActivationResponse_user.testObject_ActivationResponse_user_7, "testObject_ActivationResponse_user_7.json"), (Test.Wire.API.Golden.Generated.ActivationResponse_user.testObject_ActivationResponse_user_8, "testObject_ActivationResponse_user_8.json"), (Test.Wire.API.Golden.Generated.ActivationResponse_user.testObject_ActivationResponse_user_9, "testObject_ActivationResponse_user_9.json"), (Test.Wire.API.Golden.Generated.ActivationResponse_user.testObject_ActivationResponse_user_10, "testObject_ActivationResponse_user_10.json"), (Test.Wire.API.Golden.Generated.ActivationResponse_user.testObject_ActivationResponse_user_11, "testObject_ActivationResponse_user_11.json"), (Test.Wire.API.Golden.Generated.ActivationResponse_user.testObject_ActivationResponse_user_12, "testObject_ActivationResponse_user_12.json"), (Test.Wire.API.Golden.Generated.ActivationResponse_user.testObject_ActivationResponse_user_13, "testObject_ActivationResponse_user_13.json"), (Test.Wire.API.Golden.Generated.ActivationResponse_user.testObject_ActivationResponse_user_14, "testObject_ActivationResponse_user_14.json"), (Test.Wire.API.Golden.Generated.ActivationResponse_user.testObject_ActivationResponse_user_15, "testObject_ActivationResponse_user_15.json"), (Test.Wire.API.Golden.Generated.ActivationResponse_user.testObject_ActivationResponse_user_16, "testObject_ActivationResponse_user_16.json"), (Test.Wire.API.Golden.Generated.ActivationResponse_user.testObject_ActivationResponse_user_17, "testObject_ActivationResponse_user_17.json"), (Test.Wire.API.Golden.Generated.ActivationResponse_user.testObject_ActivationResponse_user_18, "testObject_ActivationResponse_user_18.json"), (Test.Wire.API.Golden.Generated.ActivationResponse_user.testObject_ActivationResponse_user_19, "testObject_ActivationResponse_user_19.json"), (Test.Wire.API.Golden.Generated.ActivationResponse_user.testObject_ActivationResponse_user_20, "testObject_ActivationResponse_user_20.json")],
testObjects [(Test.Wire.API.Golden.Generated.ActivationResponse_user.testObject_ActivationResponse_user_1, "testObject_ActivationResponse_user_1.json"), (Test.Wire.API.Golden.Generated.ActivationResponse_user.testObject_ActivationResponse_user_2, "testObject_ActivationResponse_user_2.json"), (Test.Wire.API.Golden.Generated.ActivationResponse_user.testObject_ActivationResponse_user_3, "testObject_ActivationResponse_user_3.json"), (Test.Wire.API.Golden.Generated.ActivationResponse_user.testObject_ActivationResponse_user_4, "testObject_ActivationResponse_user_4.json"), (Test.Wire.API.Golden.Generated.ActivationResponse_user.testObject_ActivationResponse_user_5, "testObject_ActivationResponse_user_5.json"), (Test.Wire.API.Golden.Generated.ActivationResponse_user.testObject_ActivationResponse_user_6, "testObject_ActivationResponse_user_6.json"), (Test.Wire.API.Golden.Generated.ActivationResponse_user.testObject_ActivationResponse_user_7, "testObject_ActivationResponse_user_7.json"), (Test.Wire.API.Golden.Generated.ActivationResponse_user.testObject_ActivationResponse_user_8, "testObject_ActivationResponse_user_8.json"), (Test.Wire.API.Golden.Generated.ActivationResponse_user.testObject_ActivationResponse_user_9, "testObject_ActivationResponse_user_9.json"), (Test.Wire.API.Golden.Generated.ActivationResponse_user.testObject_ActivationResponse_user_10, "testObject_ActivationResponse_user_10.json")],
testGroup "Golden: SendActivationCode_user" $
testObjects [(Test.Wire.API.Golden.Generated.SendActivationCode_user.testObject_SendActivationCode_user_1, "testObject_SendActivationCode_user_1.json"), (Test.Wire.API.Golden.Generated.SendActivationCode_user.testObject_SendActivationCode_user_2, "testObject_SendActivationCode_user_2.json"), (Test.Wire.API.Golden.Generated.SendActivationCode_user.testObject_SendActivationCode_user_3, "testObject_SendActivationCode_user_3.json"), (Test.Wire.API.Golden.Generated.SendActivationCode_user.testObject_SendActivationCode_user_4, "testObject_SendActivationCode_user_4.json"), (Test.Wire.API.Golden.Generated.SendActivationCode_user.testObject_SendActivationCode_user_5, "testObject_SendActivationCode_user_5.json"), (Test.Wire.API.Golden.Generated.SendActivationCode_user.testObject_SendActivationCode_user_6, "testObject_SendActivationCode_user_6.json"), (Test.Wire.API.Golden.Generated.SendActivationCode_user.testObject_SendActivationCode_user_7, "testObject_SendActivationCode_user_7.json"), (Test.Wire.API.Golden.Generated.SendActivationCode_user.testObject_SendActivationCode_user_8, "testObject_SendActivationCode_user_8.json"), (Test.Wire.API.Golden.Generated.SendActivationCode_user.testObject_SendActivationCode_user_9, "testObject_SendActivationCode_user_9.json"), (Test.Wire.API.Golden.Generated.SendActivationCode_user.testObject_SendActivationCode_user_10, "testObject_SendActivationCode_user_10.json"), (Test.Wire.API.Golden.Generated.SendActivationCode_user.testObject_SendActivationCode_user_11, "testObject_SendActivationCode_user_11.json"), (Test.Wire.API.Golden.Generated.SendActivationCode_user.testObject_SendActivationCode_user_12, "testObject_SendActivationCode_user_12.json"), (Test.Wire.API.Golden.Generated.SendActivationCode_user.testObject_SendActivationCode_user_13, "testObject_SendActivationCode_user_13.json"), (Test.Wire.API.Golden.Generated.SendActivationCode_user.testObject_SendActivationCode_user_14, "testObject_SendActivationCode_user_14.json"), (Test.Wire.API.Golden.Generated.SendActivationCode_user.testObject_SendActivationCode_user_15, "testObject_SendActivationCode_user_15.json"), (Test.Wire.API.Golden.Generated.SendActivationCode_user.testObject_SendActivationCode_user_16, "testObject_SendActivationCode_user_16.json"), (Test.Wire.API.Golden.Generated.SendActivationCode_user.testObject_SendActivationCode_user_17, "testObject_SendActivationCode_user_17.json"), (Test.Wire.API.Golden.Generated.SendActivationCode_user.testObject_SendActivationCode_user_18, "testObject_SendActivationCode_user_18.json"), (Test.Wire.API.Golden.Generated.SendActivationCode_user.testObject_SendActivationCode_user_19, "testObject_SendActivationCode_user_19.json"), (Test.Wire.API.Golden.Generated.SendActivationCode_user.testObject_SendActivationCode_user_20, "testObject_SendActivationCode_user_20.json")],
testGroup "Golden: LoginId_user" $
Expand Down
Loading

0 comments on commit da929a6

Please sign in to comment.