diff --git a/changelog.d/1-api-changes/WPB-20532-remove-deprecated-pict-from-user-profile b/changelog.d/1-api-changes/WPB-20532-remove-deprecated-pict-from-user-profile new file mode 100644 index 00000000000..4127d42bfea --- /dev/null +++ b/changelog.d/1-api-changes/WPB-20532-remove-deprecated-pict-from-user-profile @@ -0,0 +1 @@ +Remove deprecated field `profilePict` from UserProfile. \ No newline at end of file diff --git a/integration/test/Test/User.hs b/integration/test/Test/User.hs index 99a0169427f..10a2097227b 100644 --- a/integration/test/Test/User.hs +++ b/integration/test/Test/User.hs @@ -433,3 +433,19 @@ testSuspendNonExistingUser = do let quid = object ["domain" .= dom, "id" .= uid] I.setAccountStatus quid "suspended" >>= assertStatus 404 getUser existingUser quid >>= assertStatus 404 + +testUserProfileSchemaContainsPicture17 :: (HasCallStack) => App () +testUserProfileSchemaContainsPicture17 = do + qself <- randomUser OwnDomain def + quser <- randomUser OwnDomain def + withAPIVersion 17 $ getUser qself quser `bindResponse` \resp -> do + resp.status `shouldMatchInt` 200 + resp.json %. "picture" `shouldMatch` (Just ()) + +testUserProfileSchemaContainsPicture :: (HasCallStack) => App () +testUserProfileSchemaContainsPicture = do + qself <- randomUser OwnDomain def + quser <- randomUser OwnDomain def + getUser qself quser `bindResponse` \resp -> do + resp.status `shouldMatchInt` 200 + resp.json `assertFieldMissing` "picture" diff --git a/libs/wire-api-federation/src/Wire/API/Federation/API/Brig.hs b/libs/wire-api-federation/src/Wire/API/Federation/API/Brig.hs index 55a9739b76e..e00946b0189 100644 --- a/libs/wire-api-federation/src/Wire/API/Federation/API/Brig.hs +++ b/libs/wire-api-federation/src/Wire/API/Federation/API/Brig.hs @@ -37,6 +37,8 @@ import Wire.API.Federation.Version import Wire.API.MLS.CipherSuite import Wire.API.MLS.KeyPackage import Wire.API.Routes.SpecialiseToVersion +import Wire.API.Routes.Version qualified as V +import Wire.API.Routes.Versioned qualified as V import Wire.API.User import Wire.API.User.Client import Wire.API.User.Client.Prekey (ClientPrekey, PrekeyBundle) @@ -78,8 +80,10 @@ instance ToSchema SearchResponse -- | For conventions see /docs/developer/federation-api-conventions.md type BrigApi = FedEndpoint "api-version" () VersionInfo - :<|> FedEndpoint "get-user-by-handle" Handle (Maybe UserProfile) - :<|> FedEndpoint "get-users-by-ids" [UserId] [UserProfile] + :<|> FedEndpointWithMods '[Until V5] (Versioned 'V4 "get-user-by-handle") Handle (Maybe (V.Versioned V.V18 UserProfile)) + :<|> FedEndpointWithMods '[From V5] "get-user-by-handle" Handle (Maybe (V.Versioned V.V19 UserProfile)) + :<|> FedEndpointWithMods '[Until V5] (Versioned 'V4 "get-users-by-ids") [UserId] [V.Versioned V.V18 UserProfile] + :<|> FedEndpointWithMods '[From V5] "get-users-by-ids" [UserId] [V.Versioned V.V19 UserProfile] :<|> FedEndpoint "claim-prekey" (UserId, ClientId) (Maybe ClientPrekey) :<|> FedEndpoint "claim-prekey-bundle" UserId PrekeyBundle :<|> FedEndpoint "claim-multi-prekey-bundle" UserClients UserClientPrekeyMap diff --git a/libs/wire-api-federation/src/Wire/API/Federation/Version.hs b/libs/wire-api-federation/src/Wire/API/Federation/Version.hs index f9a6136f393..916a8ed4184 100644 --- a/libs/wire-api-federation/src/Wire/API/Federation/Version.hs +++ b/libs/wire-api-federation/src/Wire/API/Federation/Version.hs @@ -25,6 +25,7 @@ module Wire.API.Federation.Version V2Sym0, V3Sym0, V4Sym0, + V5Sym0, intToVersion, versionInt, versionText, @@ -56,7 +57,7 @@ import Imports import Servant.API (ToHttpApiData (..)) import Wire.API.MLS.Group.Serialisation -data Version = V0 | V1 | V2 | V3 | V4 +data Version = V0 | V1 | V2 | V3 | V4 | V5 deriving stock (Eq, Ord, Bounded, Enum, Show, Generic) deriving (FromJSON, ToJSON) via (Schema Version) @@ -70,6 +71,7 @@ versionInt V1 = 1 versionInt V2 = 2 versionInt V3 = 3 versionInt V4 = 4 +versionInt V5 = 5 versionText :: Version -> Text versionText = ("v" <>) . Text.pack . show . versionInt @@ -90,7 +92,8 @@ instance ToSchema Version where element 1 V1, element 2 V2, element 3 V3, - element 4 V4 + element 4 V4, + element 5 V5 ] supportedVersions :: Set Version diff --git a/libs/wire-api/src/Wire/API/Routes/Public/Brig.hs b/libs/wire-api/src/Wire/API/Routes/Public/Brig.hs index fd3c3901731..40aa02db41a 100644 --- a/libs/wire-api/src/Wire/API/Routes/Public/Brig.hs +++ b/libs/wire-api/src/Wire/API/Routes/Public/Brig.hs @@ -122,14 +122,14 @@ instance ServiceAPI BrigAPITag v where type MaxUsersForListClientsBulk = 500 -type GetUserVerb = +type GetUserVerb v = MultiVerb 'GET '[JSON] '[ ErrorResponse 'UserNotFound, - Respond 200 "User found" UserProfile + VersionedRespond (ToVersion v) 200 "User found" UserProfile ] - (Maybe UserProfile) + (Maybe (Versioned (ToVersion v) UserProfile)) type CaptureUserId name = Capture' '[Description "User Id"] name UserId @@ -166,15 +166,25 @@ type UserAPI = :> ZLocalUser :> "users" :> CaptureUserId "uid" - :> GetUserVerb + :> GetUserVerb (Until 'V19) ) + :<|> Named + "get-user-qualified@v18" + ( Summary "Get a user by Domain and UserId" + :> Until 'V19 + :> ZLocalUser + :> "users" + :> QualifiedCaptureUserId "uid" + :> GetUserVerb (Until 'V19) + ) :<|> Named "get-user-qualified" ( Summary "Get a user by Domain and UserId" + :> From 'V19 :> ZLocalUser :> "users" :> QualifiedCaptureUserId "uid" - :> GetUserVerb + :> GetUserVerb (From 'V19) ) :<|> Named "update-user-email" @@ -215,23 +225,23 @@ type UserAPI = 'GET '[JSON] '[ ErrorResponse 'HandleNotFound, - Respond 200 "User found" UserProfile + VersionedRespond (ToVersion (Until 'V19)) 200 "User found" UserProfile ] - (Maybe UserProfile) + (Maybe (Versioned (ToVersion (Until 'V19)) UserProfile)) ) :<|> Named - "list-users-by-unqualified-ids-or-handles" - ( Summary "List users (deprecated)" - :> Until 'V2 - :> Description "The 'ids' and 'handles' parameters are mutually exclusive." - :> ZUser - :> "users" - :> QueryParam' [Optional, Strict, Description "User IDs of users to fetch"] "ids" (CommaSeparatedList UserId) - :> QueryParam' [Optional, Strict, Description "Handles of users to fetch, min 1 and max 4 (the check for handles is rather expensive)"] "handles" (Range 1 4 (CommaSeparatedList Handle)) - :> Get '[JSON] [UserProfile] - ) + "list-users-by-unqualified-ids-or-handles" + ( Summary "List users (deprecated)" + :> Until 'V2 + :> Description "The 'ids' and 'handles' parameters are mutually exclusive." + :> ZUser + :> "users" + :> QueryParam' [Optional, Strict, Description "User IDs of users to fetch"] "ids" (CommaSeparatedList UserId) + :> QueryParam' [Optional, Strict, Description "Handles of users to fetch, min 1 and max 4 (the check for handles is rather expensive)"] "handles" (Range 1 4 (CommaSeparatedList Handle)) + :> Get '[JSON] [Versioned (ToVersion (Until 'V19)) UserProfile] + ) :<|> Named - "list-users-by-ids-or-handles" + "list-users-by-ids-or-handles@v18" ( Summary "List users" :> Description "The 'qualified_ids' and 'qualified_handles' parameters are mutually exclusive." :> ZUser @@ -239,8 +249,19 @@ type UserAPI = :> "list-users" :> QueryParam' [Optional, Strict, Description "Include whether each local user can currently be contacted"] "include-contact-status" Bool :> ReqBody '[JSON] ListUsersQuery - :> Post '[JSON] ListUsersById + :> Post '[JSON] (ListUsersById (ToVersion (Until 'V19))) ) + :<|> Named + "list-users-by-ids-or-handles" + ( Summary "List users" + :> Description "The 'qualified_ids' and 'qualified_handles' parameters are mutually exclusive." + :> ZUser + :> From 'V4 + :> "list-users" + :> QueryParam' [Optional, Strict, Description "Include whether each local user can currently be contacted"] "include-contact-status" Bool + :> ReqBody '[JSON] ListUsersQuery + :> Post '[JSON] (ListUsersById (ToVersion (From 'V19))) + ) :<|> Named "list-users-by-ids-or-handles@V3" ( Summary "List users" @@ -249,7 +270,7 @@ type UserAPI = :> Until 'V4 :> "list-users" :> ReqBody '[JSON] ListUsersQuery - :> Post '[JSON] [UserProfile] + :> Post '[JSON] [Versioned (ToVersion (Until 'V19)) UserProfile] ) :<|> Named "send-verification-code" @@ -2120,7 +2141,7 @@ type SystemSettingsAPI = type AppsAPI = Named - "create-app" + "create-app@v18" ( Summary "Create a new app" :> From 'V12 :> ZLocalUser @@ -2128,7 +2149,17 @@ type AppsAPI = :> Capture "tid" TeamId :> "apps" :> ReqBody '[JSON] NewApp - :> Post '[JSON] CreatedApp + :> Post '[JSON] (CreatedApp (ToVersion (Until 'V19))) + ) + :<|> Named "create-app" + ( Summary "Create a new app" + :> From 'V12 + :> ZLocalUser + :> "teams" + :> Capture "tid" TeamId + :> "apps" + :> ReqBody '[JSON] NewApp + :> Post '[JSON] (CreatedApp (ToVersion (From 'V19))) ) :<|> Named "get-app" @@ -2140,7 +2171,17 @@ type AppsAPI = :> Capture "tid" TeamId :> "apps" :> Capture "uid" UserId - :> Get '[JSON] UserProfile + :> Get '[JSON] (Versioned (ToVersion (Until 'V19)) UserProfile) + ) + :<|> Named + "get-apps@v18" + ( Summary "Get all apps owned by the given team (not including collaborators)" + :> From 'V15 + :> ZLocalUser + :> "teams" + :> Capture "tid" TeamId + :> "apps" + :> Get '[JSON] [Versioned (ToVersion (Until 'V19)) UserProfile] ) :<|> Named "get-apps" @@ -2150,7 +2191,7 @@ type AppsAPI = :> "teams" :> Capture "tid" TeamId :> "apps" - :> Get '[JSON] [UserProfile] + :> Get '[JSON] [Versioned (ToVersion (From 'V19)) UserProfile] ) :<|> Named "put-app" diff --git a/libs/wire-api/src/Wire/API/Routes/Public/Brig/Bot.hs b/libs/wire-api/src/Wire/API/Routes/Public/Brig/Bot.hs index f7a7868b561..60aea4cd1b4 100644 --- a/libs/wire-api/src/Wire/API/Routes/Public/Brig/Bot.hs +++ b/libs/wire-api/src/Wire/API/Routes/Public/Brig/Bot.hs @@ -105,12 +105,13 @@ type BotAPI = :<|> Named "bot-get-self" ( Summary "Get self" + :> Until V19 :> CanThrow 'UserNotFound :> CanThrow 'AccessDenied :> ZBot :> "bot" :> "self" - :> Get '[JSON] UserProfile + :> Get '[JSON] (Versioned (ToVersion (Until 'V19)) UserProfile) ) :<|> Named "bot-delete-self" diff --git a/libs/wire-api/src/Wire/API/Routes/Version.hs b/libs/wire-api/src/Wire/API/Routes/Version.hs index f360467b700..fa402e48d26 100644 --- a/libs/wire-api/src/Wire/API/Routes/Version.hs +++ b/libs/wire-api/src/Wire/API/Routes/Version.hs @@ -61,6 +61,8 @@ module Wire.API.Routes.Version -- * Servant combinators Until, From, + Prev, + ToVersion, -- * Versioned schema-profunctor things. versionedObject, @@ -88,6 +90,7 @@ import Data.Set qualified as Set import Data.Singletons.Base.TH import Data.Text qualified as Text import Data.Text.Encoding as Text +import GHC.TypeError import Imports hiding ((\\)) import Servant import Wire.API.Routes.Named hiding (unnamed) @@ -108,6 +111,34 @@ data Version = V0 | V1 | V2 | V3 | V4 | V5 | V6 | V7 | V8 | V9 | V10 | V11 | V12 deriving (FromJSON, ToJSON) via (Schema Version) deriving (Arbitrary) via (GenericUniform Version) +-- Type family to be used in endpoints to reflect usage of Until and From +-- and is used to give information to `toSchema` instances +type family ToVersion r where + ToVersion (Until (v :: Version)) = Prev v + ToVersion (From (v :: Version)) = v + +type family Prev (v :: Version) where + Prev V0 = TypeError (GHC.TypeError.Text "There is no version before V0.") + Prev V1 = V0 + Prev V2 = V1 + Prev V3 = V2 + Prev V4 = V3 + Prev V5 = V4 + Prev V6 = V5 + Prev V7 = V6 + Prev V8 = V7 + Prev V9 = V8 + Prev V10 = V9 + Prev V11 = V10 + Prev V12 = V11 + Prev V13 = V12 + Prev V14 = V13 + Prev V15 = V14 + Prev V16 = V15 + Prev V17 = V16 + Prev V18 = V17 + Prev V19 = V18 + instance RenderableSymbol V1 where renderSymbol = "V1" instance RenderableSymbol V2 where renderSymbol = "V2" diff --git a/libs/wire-api/src/Wire/API/Routes/Versioned.hs b/libs/wire-api/src/Wire/API/Routes/Versioned.hs index 75493452870..90423edb64a 100644 --- a/libs/wire-api/src/Wire/API/Routes/Versioned.hs +++ b/libs/wire-api/src/Wire/API/Routes/Versioned.hs @@ -93,7 +93,7 @@ instance responseUnrender c = fmap unVersioned . responseUnrender @cs @(Respond s desc (Versioned v a)) c instance - (KnownSymbol desc, S.ToSchema a, SingI v, ToSchema (Versioned v a), Typeable v) => + (KnownSymbol desc, S.ToSchema (Versioned v a)) => IsSwaggerResponse (VersionedRespond (v :: Version) s desc a) where responseSwagger = simpleResponseSwagger @(Versioned v a) @'[JSON] @desc diff --git a/libs/wire-api/src/Wire/API/User.hs b/libs/wire-api/src/Wire/API/User.hs index 161040a456e..10d453f6224 100644 --- a/libs/wire-api/src/Wire/API/User.hs +++ b/libs/wire-api/src/Wire/API/User.hs @@ -221,6 +221,8 @@ import Wire.API.Password import Wire.API.PostgresMarshall import Wire.API.Provider.Service (ServiceRef) import Wire.API.Routes.MultiVerb +import Wire.API.Routes.Version +import Wire.API.Routes.Versioned import Wire.API.Team import Wire.API.Team.Member (TeamMember) import Wire.API.Team.Member qualified as TeamMember @@ -531,8 +533,6 @@ data UserProfile = UserProfile { profileQualifiedId :: Qualified UserId, profileName :: Name, profileTextStatus :: Maybe TextStatus, - -- | DEPRECATED - profilePict :: Pict, profileAssets :: [Asset], profileAccentId :: ColourId, profileDeleted :: Bool, @@ -552,13 +552,17 @@ data UserProfile = UserProfile } deriving stock (Eq, Show, Generic) deriving (Arbitrary) via (GenericUniform UserProfile) - deriving (FromJSON, ToJSON, S.ToSchema) via (Schema UserProfile) -instance ToSchema UserProfile where - schema = object userProfileObjectSchema +instance ToSchema (Versioned V19 UserProfile) where + schema :: ValueSchema NamedSwaggerDoc (Versioned V19 UserProfile) + schema = Versioned <$> unVersioned .= object (userProfileObjectSchema (Just V19)) + +instance ToSchema (Versioned V18 UserProfile) where + schema :: ValueSchema NamedSwaggerDoc (Versioned V18 UserProfile) + schema = Versioned <$> unVersioned .= object (userProfileObjectSchema (Just V18)) -userProfileObjectSchema :: ObjectSchema SwaggerDoc UserProfile -userProfileObjectSchema = +userProfileObjectSchema :: Maybe Version -> ObjectSchema SwaggerDoc UserProfile +userProfileObjectSchema mVersion = UserProfile <$> profileQualifiedId .= field "qualified_id" schema @@ -568,8 +572,7 @@ userProfileObjectSchema = .= field "name" schema <*> profileTextStatus .= maybe_ (optField "text_status" schema) - <*> profilePict - .= (field "picture" schema <|> pure noPict) + <* profilePict <*> profileAssets .= (field "assets" (array schema) <|> pure []) <*> profileAccentId @@ -593,6 +596,13 @@ userProfileObjectSchema = <*> profileApp .= maybe_ (optField "app" schema) <*> profileSearchable .= fmap (fromMaybe True) (optField "searchable" schema) <*> profileContactStatus .= maybe_ (optField "contact_status" schema) + where + profilePict :: SchemaP SwaggerDoc A.Object [A.Pair] UserProfile Pict + profilePict = + case mVersion of + Just v + | v > V18 -> pure noPict + _ -> const noPict .= (field "picture" schema <|> pure noPict) data ContactStatusState = Contactable @@ -792,7 +802,6 @@ mkUserProfileWithEmail memail u mba legalHoldStatus = profileHandle = userHandle u, profileName = userDisplayName u, profileTextStatus = userTextStatus u, - profilePict = userPict u, profileAssets = userAssets u, profileAccentId = userAccentId u, profileService = userService u, @@ -2124,14 +2133,29 @@ instance ToSchema SupportedProtocolUpdate where .= field "supported_protocols" (set schema) ------- Partial Successes -data ListUsersById = ListUsersById - { listUsersByIdFound :: [UserProfile], +data ListUsersById v = ListUsersById + { listUsersByIdFound :: [Versioned v UserProfile], listUsersByIdFailed :: Maybe (NonEmpty (Qualified UserId)) } deriving (Eq, Show) - deriving (ToJSON, FromJSON, S.ToSchema) via Schema ListUsersById -instance ToSchema ListUsersById where +deriving via (Schema (ListUsersById 'V18)) instance S.ToSchema (ListUsersById 'V18) + +deriving via (Schema (ListUsersById 'V19)) instance S.ToSchema (ListUsersById 'V19) + +deriving via (Schema (ListUsersById 'V19)) instance A.ToJSON (ListUsersById 'V19) +deriving via (Schema (ListUsersById 'V19)) instance A.FromJSON (ListUsersById 'V19) + +instance ToSchema (ListUsersById 'V18) where + schema :: ValueSchema NamedSwaggerDoc (ListUsersById 'V18) + schema = + object $ + ListUsersById + <$> listUsersByIdFound .= field "found" (array schema) + <*> listUsersByIdFailed .= maybe_ (optField "failed" $ nonEmptyArray schema) + +instance ToSchema (ListUsersById 'V19) where + schema :: ValueSchema NamedSwaggerDoc (ListUsersById 'V19) schema = object $ ListUsersById @@ -2213,14 +2237,31 @@ instance ToSchema PutApp where <*> (.category) .= maybe_ (optField "category" schema) <*> (.description) .= maybe_ (optField "description" schema) -data CreatedApp = CreatedApp - { user :: UserProfile, +data CreatedApp v = CreatedApp + { user :: (Versioned v UserProfile), cookie :: SomeUserToken } deriving stock (Eq, Show, Generic) - deriving (A.FromJSON, A.ToJSON, S.ToSchema) via Schema CreatedApp -instance ToSchema CreatedApp where +deriving via (Schema (CreatedApp 'V18)) instance S.ToSchema (CreatedApp 'V18) +deriving via (Schema (CreatedApp 'V19)) instance S.ToSchema (CreatedApp 'V19) + +deriving via (Schema (CreatedApp 'V19)) instance A.ToJSON (CreatedApp 'V19) +deriving via (Schema (CreatedApp 'V19)) instance A.FromJSON (CreatedApp 'V19) + +deriving via (Schema (CreatedApp 'V18)) instance A.ToJSON (CreatedApp 'V18) +deriving via (Schema (CreatedApp 'V18)) instance A.FromJSON (CreatedApp 'V18) + +instance ToSchema (CreatedApp V18) where + schema :: ValueSchema NamedSwaggerDoc (CreatedApp V18) + schema = + object $ + CreatedApp + <$> (.user) .= field "user" schema + <*> (.cookie) .= field "cookie" schema + +instance ToSchema (CreatedApp V19) where + schema :: ValueSchema NamedSwaggerDoc (CreatedApp V19) schema = object $ CreatedApp diff --git a/libs/wire-api/test/golden/Test/Wire/API/Golden/Generated.hs b/libs/wire-api/test/golden/Test/Wire/API/Golden/Generated.hs index 3489a1b257a..ab6ff2d0fba 100644 --- a/libs/wire-api/test/golden/Test/Wire/API/Golden/Generated.hs +++ b/libs/wire-api/test/golden/Test/Wire/API/Golden/Generated.hs @@ -899,10 +899,10 @@ tests = ], testGroup "Golden: UserProfile_user" $ testObjects - [ ( Test.Wire.API.Golden.Generated.UserProfile_user.testObject_UserProfile_user_1, + [ ( Versioned @V18 Test.Wire.API.Golden.Generated.UserProfile_user.testObject_UserProfile_user_1, "testObject_UserProfile_user_1.json" ), - ( Test.Wire.API.Golden.Generated.UserProfile_user.testObject_UserProfile_user_2, + ( Versioned @V18 Test.Wire.API.Golden.Generated.UserProfile_user.testObject_UserProfile_user_2, "testObject_UserProfile_user_2.json" ) ], diff --git a/libs/wire-api/test/golden/Test/Wire/API/Golden/Generated/UserProfile_user.hs b/libs/wire-api/test/golden/Test/Wire/API/Golden/Generated/UserProfile_user.hs index 99a69b9e932..c68d8889e1d 100644 --- a/libs/wire-api/test/golden/Test/Wire/API/Golden/Generated/UserProfile_user.hs +++ b/libs/wire-api/test/golden/Test/Wire/API/Golden/Generated/UserProfile_user.hs @@ -41,7 +41,6 @@ testObject_UserProfile_user_1 = }, profileName = Name {fromName = "\50534\3354]$\169938\183604UV`\nF\f\23427ys'd\bXy\ENQ:\ESC\139288\RSD[<\132982E"}, profileTextStatus = rightToMaybe $ mkTextStatus "text status", - profilePict = Pict {fromPict = []}, profileAssets = [], profileAccentId = ColourId {fromColourId = 2}, profileDeleted = False, @@ -68,7 +67,6 @@ testObject_UserProfile_user_2 = }, profileName = Name {fromName = "si4v\999679\ESC^'\12447k\21889\NAK?\1082547\NULBw;\b3*R/\164149lrI"}, profileTextStatus = Nothing, - profilePict = Pict {fromPict = []}, profileAssets = [], profileAccentId = ColourId {fromColourId = -1}, profileDeleted = True, diff --git a/libs/wire-api/test/golden/Test/Wire/API/Golden/Manual/App.hs b/libs/wire-api/test/golden/Test/Wire/API/Golden/Manual/App.hs index 3544ae22ad8..21cc8fc6549 100644 --- a/libs/wire-api/test/golden/Test/Wire/API/Golden/Manual/App.hs +++ b/libs/wire-api/test/golden/Test/Wire/API/Golden/Manual/App.hs @@ -24,6 +24,8 @@ import Test.Wire.API.Golden.Generated.UserProfile_user import Web.HttpApiData import Wire.API.User import Wire.API.User.Auth (SomeUserToken) +import Wire.API.Routes.Version +import Wire.API.Routes.Versioned someToken :: SomeUserToken someToken = either undefined id $ parseUrlPiece "DTHdPvHSFolvyGVvuaexZ9DKptwnxTSn8UhKc-6A9q34s4q0YY3_CgpYxDMr56crHrW79EPwKu2BLwQkFT7wBw==.v=1.k=1.d=1773661988.t=u.l=.u=ac638199-8816-439f-88dd-8e206c9b5baa.r=fa16d9df" @@ -38,9 +40,9 @@ testObject_NewApp_1 = (unsafeRange "good description") (plainTextPassword6Unsafe "good password") -testObject_CreatedApp_1 :: CreatedApp +testObject_CreatedApp_1 :: CreatedApp V19 testObject_CreatedApp_1 = - CreatedApp testObject_UserProfile_user_2 someToken + CreatedApp (Versioned testObject_UserProfile_user_2) someToken testObject_AppInfo_1 :: AppInfo testObject_AppInfo_1 = diff --git a/libs/wire-api/test/golden/Test/Wire/API/Golden/Manual/ListUsersById.hs b/libs/wire-api/test/golden/Test/Wire/API/Golden/Manual/ListUsersById.hs index 02b3d1ae302..9f0e7d1da14 100644 --- a/libs/wire-api/test/golden/Test/Wire/API/Golden/Manual/ListUsersById.hs +++ b/libs/wire-api/test/golden/Test/Wire/API/Golden/Manual/ListUsersById.hs @@ -28,6 +28,8 @@ import Data.Set qualified as Set import Data.UUID qualified as UUID import Imports import Wire.API.User +import Wire.API.Routes.Version +import Wire.API.Routes.Versioned domain1, domain2 :: Domain domain1 = Domain "example.com" @@ -37,13 +39,12 @@ user1, user2 :: UserId user1 = Id . fromJust $ UUID.fromString "4f201a43-935e-4e19-8fe0-0a878d3d6e74" user2 = Id . fromJust $ UUID.fromString "eb48b095-d96f-4a94-b4ec-2a1d61447e13" -profile1, profile2 :: UserProfile +profile1, profile2 :: Versioned V19 UserProfile profile1 = - UserProfile + Versioned UserProfile { profileQualifiedId = Qualified user1 domain1, profileName = Name "user1", profileTextStatus = Nothing, - profilePict = Pict [], profileAssets = [], profileAccentId = ColourId 0, profileDeleted = False, @@ -60,11 +61,10 @@ profile1 = profileContactStatus = Just (ContactStatus NonContactable) } profile2 = - UserProfile + Versioned UserProfile { profileQualifiedId = Qualified user2 domain2, profileName = Name "user2", profileTextStatus = rightToMaybe $ mkTextStatus "text status", - profilePict = Pict [], profileAssets = [], profileAccentId = ColourId 0, profileDeleted = False, @@ -86,17 +86,17 @@ profile2 = profileContactStatus = Nothing } -testObject_ListUsersById_user_1 :: ListUsersById +testObject_ListUsersById_user_1 :: ListUsersById V19 testObject_ListUsersById_user_1 = ListUsersById mempty Nothing -testObject_ListUsersById_user_2 :: ListUsersById +testObject_ListUsersById_user_2 :: ListUsersById V19 testObject_ListUsersById_user_2 = ListUsersById { listUsersByIdFound = [profile1, profile2], listUsersByIdFailed = Nothing } -testObject_ListUsersById_user_3 :: ListUsersById +testObject_ListUsersById_user_3 :: ListUsersById V19 testObject_ListUsersById_user_3 = ListUsersById { listUsersByIdFound = [profile1], diff --git a/libs/wire-api/test/golden/testObject_CreatedApp_1.json b/libs/wire-api/test/golden/testObject_CreatedApp_1.json index a9c0237d56c..43a872b8018 100644 --- a/libs/wire-api/test/golden/testObject_CreatedApp_1.json +++ b/libs/wire-api/test/golden/testObject_CreatedApp_1.json @@ -14,7 +14,6 @@ "id": "00000002-0000-0002-0000-000000000001", "legalhold_status": "no_consent", "name": "si4v󴃿\u001b^'ゟk喁\u0015?􈒳\u0000Bw;\u00083*R/𨄵lrI", - "picture": [], "qualified_id": { "domain": "go.7.w-3r8iy2.a", "id": "00000002-0000-0002-0000-000000000001" diff --git a/libs/wire-api/test/golden/testObject_ListUsersById_user_2.json b/libs/wire-api/test/golden/testObject_ListUsersById_user_2.json index dc3639cc1b8..115121aee9d 100644 --- a/libs/wire-api/test/golden/testObject_ListUsersById_user_2.json +++ b/libs/wire-api/test/golden/testObject_ListUsersById_user_2.json @@ -9,7 +9,6 @@ "id": "4f201a43-935e-4e19-8fe0-0a878d3d6e74", "legalhold_status": "disabled", "name": "user1", - "picture": [], "qualified_id": { "domain": "example.com", "id": "4f201a43-935e-4e19-8fe0-0a878d3d6e74" @@ -30,7 +29,6 @@ "id": "eb48b095-d96f-4a94-b4ec-2a1d61447e13", "legalhold_status": "disabled", "name": "user2", - "picture": [], "qualified_id": { "domain": "test.net", "id": "eb48b095-d96f-4a94-b4ec-2a1d61447e13" diff --git a/libs/wire-api/test/golden/testObject_ListUsersById_user_3.json b/libs/wire-api/test/golden/testObject_ListUsersById_user_3.json index a708c79c97e..7ea2e902496 100644 --- a/libs/wire-api/test/golden/testObject_ListUsersById_user_3.json +++ b/libs/wire-api/test/golden/testObject_ListUsersById_user_3.json @@ -15,7 +15,6 @@ "id": "4f201a43-935e-4e19-8fe0-0a878d3d6e74", "legalhold_status": "disabled", "name": "user1", - "picture": [], "qualified_id": { "domain": "example.com", "id": "4f201a43-935e-4e19-8fe0-0a878d3d6e74" diff --git a/libs/wire-api/test/unit/Test/Wire/API/Roundtrip/Aeson.hs b/libs/wire-api/test/unit/Test/Wire/API/Roundtrip/Aeson.hs index 14f6f83c610..dab18e23737 100644 --- a/libs/wire-api/test/unit/Test/Wire/API/Roundtrip/Aeson.hs +++ b/libs/wire-api/test/unit/Test/Wire/API/Roundtrip/Aeson.hs @@ -62,6 +62,7 @@ import Wire.API.Routes.FederationDomainConfig qualified as FederationDomainConfi import Wire.API.Routes.Internal.Brig.EJPD qualified as EJPD import Wire.API.Routes.Internal.Galley.TeamsIntra qualified as TeamsIntra import Wire.API.Routes.Version qualified as Routes.Version +import Wire.API.Routes.Versioned (Versioned) import Wire.API.SystemSettings qualified as SystemSettings import Wire.API.Team qualified as Team import Wire.API.Team.Conversation qualified as Team.Conversation @@ -286,7 +287,7 @@ tests = testRoundTrip @User.NewUserPublic, testRoundTrip @User.UserIdList, testRoundTrip @(User.LimitedQualifiedUserIdList 20), - testRoundTrip @User.UserProfile, + testRoundTrip @(Versioned Routes.Version.V18 User.UserProfile), testRoundTrip @User.User, testRoundTrip @User.UserSet, testRoundTrip @User.SelfProfile, diff --git a/libs/wire-api/test/unit/Test/Wire/API/Swagger.hs b/libs/wire-api/test/unit/Test/Wire/API/Swagger.hs index c1a1daa4814..5b11916caab 100644 --- a/libs/wire-api/test/unit/Test/Wire/API/Swagger.hs +++ b/libs/wire-api/test/unit/Test/Wire/API/Swagger.hs @@ -23,6 +23,8 @@ import Imports import Test.Tasty qualified as T import Test.Tasty.QuickCheck (Arbitrary, counterexample, testProperty) import Type.Reflection (typeRep) +import Wire.API.Routes.Version (Version (V18)) +import Wire.API.Routes.Versioned (Versioned) import Wire.API.User qualified as User import Wire.API.User.Client qualified as Client import Wire.API.User.Client.Prekey qualified as Prekey @@ -34,7 +36,7 @@ import Wire.API.Wrapped qualified as Wrapped tests :: T.TestTree tests = T.localOption (T.Timeout (60 * 1000000) "60s") . T.testGroup "JSON roundtrip tests" $ - [ testToJSON @User.UserProfile, + [ testToJSON @(Versioned V18 User.UserProfile), testToJSON @User.User, testToJSON @User.SelfProfile, testToJSON @(User.LimitedQualifiedUserIdList 20), diff --git a/libs/wire-api/test/unit/Test/Wire/API/User.hs b/libs/wire-api/test/unit/Test/Wire/API/User.hs index 4285ecf5285..0bc0cb485ff 100644 --- a/libs/wire-api/test/unit/Test/Wire/API/User.hs +++ b/libs/wire-api/test/unit/Test/Wire/API/User.hs @@ -37,6 +37,8 @@ import Wire.API.Team.Member (TeamMember) import Wire.API.Team.Member qualified as TeamMember import Wire.API.Team.Role import Wire.API.User +import Wire.API.Routes.Version (Version (V18)) +import Wire.API.Routes.Versioned (Versioned (..)) tests :: TestTree tests = @@ -122,7 +124,6 @@ testUserProfile = do { profileQualifiedId = Qualified uid domain, profileName = Name "name", profileTextStatus = Nothing, - profilePict = Pict [], profileAssets = [], profileAccentId = colour, profileDeleted = False, @@ -138,7 +139,7 @@ testUserProfile = do profileSearchable = True, profileContactStatus = Nothing } - let profileJSONAsText = show $ Aeson.encode userProfile + let profileJSONAsText = show $ Aeson.encode (Versioned @V18 userProfile) let msg = "toJSON encoding must not convert Nothing to null, but instead omit those json fields for backwards compatibility. UserProfileJSON:" <> profileJSONAsText assertBool msg (not $ "null" `isInfixOf` profileJSONAsText) diff --git a/libs/wire-subsystems/src/Wire/AppSubsystem.hs b/libs/wire-subsystems/src/Wire/AppSubsystem.hs index 0a41bb91fbb..4be9e32dfc5 100644 --- a/libs/wire-subsystems/src/Wire/AppSubsystem.hs +++ b/libs/wire-subsystems/src/Wire/AppSubsystem.hs @@ -30,6 +30,7 @@ import Network.Wai.Utilities.Error qualified as Wai import Polysemy import Wire.API.User import Wire.API.User.Auth +import Wire.API.Routes.Version import Wire.Error data AppSubsystemConfig = AppSubsystemConfig @@ -59,7 +60,7 @@ appSubsystemErrorToHttpError = AppSubsystemErrorNoApp -> Wai.mkError status404 "app-not-found" "App not found" data AppSubsystem m a where - CreateApp :: Local UserId -> TeamId -> NewApp -> AppSubsystem m CreatedApp + CreateApp :: Local UserId -> TeamId -> NewApp -> AppSubsystem m (CreatedApp V19) GetApp :: Local UserId -> TeamId -> UserId -> AppSubsystem m AppInfo GetApps :: Local UserId -> TeamId -> AppSubsystem m [(UserId, AppInfo)] UpdateApp :: Local UserId -> TeamId -> UserId -> PutApp -> AppSubsystem m () diff --git a/libs/wire-subsystems/src/Wire/AppSubsystem/Interpreter.hs b/libs/wire-subsystems/src/Wire/AppSubsystem/Interpreter.hs index e1dd13ff30f..6a550ea49b1 100644 --- a/libs/wire-subsystems/src/Wire/AppSubsystem/Interpreter.hs +++ b/libs/wire-subsystems/src/Wire/AppSubsystem/Interpreter.hs @@ -35,6 +35,8 @@ import Polysemy.TinyLog (TinyLog) import Polysemy.TinyLog qualified as Log import System.Logger.Message qualified as Log import Wire.API.Event.Team +import Wire.API.Routes.Version +import Wire.API.Routes.Versioned import Wire.API.Team.Member qualified as T import Wire.API.Team.Role qualified as R import Wire.API.User @@ -102,7 +104,7 @@ createAppImpl :: Local UserId -> TeamId -> NewApp -> - Sem r CreatedApp + Sem r (CreatedApp V19) createAppImpl lusr tid newApp = do verifyUserPasswordError lusr newApp.password (creator, mem) <- ensureTeamMember lusr tid @@ -141,7 +143,7 @@ createAppImpl lusr tid newApp = do let usr :: User = newStoredUserToUser (tUntagged (qualifyAs lusr u)) Nothing mbApp :: Maybe AppInfo = Just $ storedAppToAppInfo app lh = UserLegalHoldDisabled -- FUTUREWORK: this needs to be changed as soon as apps can be put under LH. - in mkUserProfile EmailVisibleIfOnTeam usr mbApp lh, + in Versioned $ mkUserProfile EmailVisibleIfOnTeam usr mbApp lh, cookie = mkSomeToken c.cookieValue } diff --git a/libs/wire-subsystems/src/Wire/ConversationSubsystem/MLS/Migration.hs b/libs/wire-subsystems/src/Wire/ConversationSubsystem/MLS/Migration.hs index 0922d1588f2..8346f2535e0 100644 --- a/libs/wire-subsystems/src/Wire/ConversationSubsystem/MLS/Migration.hs +++ b/libs/wire-subsystems/src/Wire/ConversationSubsystem/MLS/Migration.hs @@ -32,6 +32,7 @@ import Wire.BrigAPIAccess import Wire.ConversationStore.MLS.Types import Wire.FederationAPIAccess import Wire.StoredConversation +import Wire.API.Routes.Versioned qualified as V -- | Similar to @Ap f All@, but short-circuiting. -- @@ -76,4 +77,4 @@ checkMigrationCriteria now conv ws . runFederatedConcurrently (map (.id_) conv.mcRemoteMembers) $ \ruids -> fedClient @'Brig @"get-users-by-ids" (tUnqualified ruids) - pure $ all (containsMLS . profileSupportedProtocols) remoteProfiles + pure $ all (containsMLS . profileSupportedProtocols) (fmap V.unVersioned remoteProfiles) diff --git a/libs/wire-subsystems/src/Wire/UserSubsystem/Interpreter.hs b/libs/wire-subsystems/src/Wire/UserSubsystem/Interpreter.hs index d5cb2dfee62..8ef94065324 100644 --- a/libs/wire-subsystems/src/Wire/UserSubsystem/Interpreter.hs +++ b/libs/wire-subsystems/src/Wire/UserSubsystem/Interpreter.hs @@ -114,6 +114,9 @@ import Wire.UserSubsystem.Error import Wire.UserSubsystem.HandleBlacklist import Wire.UserSubsystem.UserSubsystemConfig import Witherable (wither) +import Wire.API.Routes.Versioned qualified as RV +import Wire.API.VersionInfo (VersionedMonad) +import qualified Wire.API.Federation.Version as FV runUserSubsystem :: ( Member AppStore r, @@ -131,6 +134,7 @@ runUserSubsystem :: Member DeleteQueue r, Member Events r, Member Now r, + VersionedMonad FV.Version (fedM 'Brig), RunClient (fedM 'Brig), FederationMonad fedM, Typeable fedM, @@ -391,6 +395,7 @@ getUserProfilesImpl :: Member DeleteQueue r, Member Now r, Member (Input (Local any)) r, + VersionedMonad FV.Version (fedM 'Brig), RunClient (fedM 'Brig), FederationMonad fedM, Typeable fedM, @@ -467,6 +472,7 @@ getUserProfilesFromDomain :: Member DeleteQueue r, Member Now r, Member UserStore r, + VersionedMonad FV.Version (fedM 'Brig), RunClient (fedM 'Brig), FederationMonad fedM, Typeable fedM, @@ -488,6 +494,7 @@ getUserProfilesFromDomain self uids = do getUserProfilesRemotePart :: ( Member (FederationAPIAccess fedM) r, Member (Error FederationError) r, + VersionedMonad FV.Version (fedM 'Brig), RunClient (fedM 'Brig), FederationMonad fedM, Typeable fedM @@ -495,7 +502,8 @@ getUserProfilesRemotePart :: Remote [UserId] -> Sem r [UserProfile] getUserProfilesRemotePart ruids = do - runFederated ruids $ fedClient @'Brig @"get-users-by-ids" (tUnqualified ruids) + res <- runFederated ruids $ fedClient @'Brig @"get-users-by-ids" (tUnqualified ruids) + pure $ fmap RV.unVersioned res getUserProfilesLocalPart :: forall r any. @@ -611,6 +619,7 @@ getUserProfilesWithErrorsImpl :: Member (FederationAPIAccess fedM) r, Member DeleteQueue r, Member Now r, + VersionedMonad FV.Version (fedM 'Brig), RunClient (fedM 'Brig), FederationMonad fedM, Typeable fedM, diff --git a/postgres-schema.sql b/postgres-schema.sql index 2d3df5fb27f..fb8fe6e8fb0 100644 --- a/postgres-schema.sql +++ b/postgres-schema.sql @@ -9,8 +9,8 @@ \restrict 79bbfb4630959c48307653a5cd3d83f2582b3c2210f75f10d79e3ebf0015620 --- Dumped from database version 17.10 --- Dumped by pg_dump version 17.10 +-- Dumped from database version 17.11 +-- Dumped by pg_dump version 17.11 SET statement_timeout = 0; SET lock_timeout = 0; diff --git a/services/brig/src/Brig/API/Connection.hs b/services/brig/src/Brig/API/Connection.hs index 375a5300f93..abf3dd111ef 100644 --- a/services/brig/src/Brig/API/Connection.hs +++ b/services/brig/src/Brig/API/Connection.hs @@ -71,6 +71,8 @@ import Wire.NotificationSubsystem import Wire.TeamSubsystem (TeamSubsystem) import Wire.UserStore as UserStore import Wire.UserSubsystem +import Wire.API.VersionInfo (VersionedMonad) +import qualified Wire.API.Federation.Version as FV createConnection :: ( Member FederationConfigStore r, @@ -81,7 +83,8 @@ createConnection :: Member UserSubsystem r, Member (Embed HttpClientIO) r, Member TeamSubsystem r, - HasBrigFederationAccess m r + HasBrigFederationAccess m r, + VersionedMonad FV.Version (m 'Brig) ) => Local UserId -> ConnId -> @@ -227,7 +230,8 @@ updateConnection :: Member (Embed HttpClientIO) r, Member GalleyAPIAccess r, Member UserStore r, - HasBrigFederationAccess m r + HasBrigFederationAccess m r, + VersionedMonad FV.Version (m 'Brig) ) => Local UserId -> Qualified UserId -> diff --git a/services/brig/src/Brig/API/Connection/Remote.hs b/services/brig/src/Brig/API/Connection/Remote.hs index 09d8e11e086..23ca2607acd 100644 --- a/services/brig/src/Brig/API/Connection/Remote.hs +++ b/services/brig/src/Brig/API/Connection/Remote.hs @@ -52,6 +52,9 @@ import Wire.GalleyAPIAccess import Wire.NotificationSubsystem import Wire.UserStore as UserStore import Wire.UserSubsystem +import qualified Wire.API.Routes.Versioned as RV +import Wire.API.VersionInfo (VersionedMonad) +import qualified Wire.API.Federation.Version as FV data LocalConnectionAction = LocalConnect @@ -304,7 +307,8 @@ createConnectionToRemoteUser :: Member UserStore r, Member UserSubsystem r, Member NotificationSubsystem r, - HasBrigFederationAccess m r + HasBrigFederationAccess m r, + VersionedMonad FV.Version (m 'Brig) ) => Local UserId -> ConnId -> @@ -325,7 +329,8 @@ updateConnectionToRemoteUser :: Member NotificationSubsystem r, Member FederationConfigStore r, Member UserStore r, - HasBrigFederationAccess m r + HasBrigFederationAccess m r, + VersionedMonad FV.Version (m 'Brig) ) => Local UserId -> Remote UserId -> @@ -360,7 +365,8 @@ checkLimitForLocalAction u oldRel action = -- don't want to fetch it twice. ensureFederatesWith :: ( Member FederationConfigStore r, - HasBrigFederationAccess m r + HasBrigFederationAccess m r, + VersionedMonad FV.Version (m 'Brig) ) => Remote UserId -> ConnectionM r (Maybe UserProfile) @@ -369,7 +375,8 @@ ensureFederatesWith remote = do profiles <- either (throwE . ConnectFederationError) pure =<< lift (liftSem $ runFederatedEither remote $ fedClient @'Brig @"get-users-by-ids" [tUnqualified remote]) - let rTeam = qualifyAs remote $ profileTeam =<< listToMaybe profiles + let unVersionedProfiles = fmap RV.unVersioned profiles + let rTeam = qualifyAs remote $ profileTeam =<< listToMaybe unVersionedProfiles unlessM (lift . liftSem . backendFederatesWith $ rTeam) $ throwE ConnectTeamFederationError - pure (listToMaybe profiles) + pure (listToMaybe unVersionedProfiles) diff --git a/services/brig/src/Brig/API/Public.hs b/services/brig/src/Brig/API/Public.hs index 60cc7a53bf6..e0df3703831 100644 --- a/services/brig/src/Brig/API/Public.hs +++ b/services/brig/src/Brig/API/Public.hs @@ -443,11 +443,13 @@ servantSitemap = userAPI :: ServerT UserAPI (Handler r) userAPI = Named @"get-user-unqualified" getUserUnqualifiedH + :<|> Named @"get-user-qualified@v18" getUserProfileH :<|> Named @"get-user-qualified" getUserProfileH :<|> Named @"update-user-email" updateUserEmail :<|> Named @"get-handle-info-unqualified" getHandleInfoUnqualifiedH :<|> Named @"get-user-by-handle-qualified" Handle.getHandleInfo :<|> Named @"list-users-by-unqualified-ids-or-handles" listUsersByUnqualifiedIdsOrHandles + :<|> Named @"list-users-by-ids-or-handles@v18" listUsersByIdsOrHandles :<|> Named @"list-users-by-ids-or-handles" listUsersByIdsOrHandles :<|> Named @"list-users-by-ids-or-handles@V3" listUsersByIdsOrHandlesV3 :<|> Named @"send-verification-code" sendVerificationCode @@ -628,8 +630,10 @@ servantSitemap = appsAPI :: ServerT AppsAPI (Handler r) appsAPI = - Named @"create-app" createApp + Named @"create-app@v18" createApp + :<|> Named @"create-app" createApp :<|> Named @"get-app" getApp + :<|> Named @"get-apps@v18" getApps :<|> Named @"get-apps" getApps :<|> Named @"put-app" putApp :<|> Named @"refresh-app-cookie" refreshAppCookie diff --git a/services/brig/src/Brig/Provider/API.hs b/services/brig/src/Brig/Provider/API.hs index 7c5089e9f3c..8c895f29869 100644 --- a/services/brig/src/Brig/Provider/API.hs +++ b/services/brig/src/Brig/Provider/API.hs @@ -107,6 +107,7 @@ import Wire.API.Routes.Named (Named (Named)) import Wire.API.Routes.Public.Brig.Bot (BotAPI) import Wire.API.Routes.Public.Brig.Provider (ProviderAPI) import Wire.API.Routes.Public.Brig.Services (ServicesAPI) +import Wire.API.Routes.Versioned import Wire.API.Team.Feature qualified as Feature import Wire.API.Team.LegalHold (LegalholdProtectee (UnprotectedBot)) import Wire.API.Team.Permission diff --git a/services/brig/test/integration/API/User/Account.hs b/services/brig/test/integration/API/User/Account.hs index da547287827..de73b128bc6 100644 --- a/services/brig/test/integration/API/User/Account.hs +++ b/services/brig/test/integration/API/User/Account.hs @@ -794,7 +794,6 @@ testMultipleUsers opts brig = do { profileQualifiedId = u5, profileName = Name "u5", profileTextStatus = Nothing, - profilePict = Pict [], profileAssets = [], profileAccentId = ColourId 0, profileDeleted = False, @@ -1579,10 +1578,9 @@ execAndAssertUserDeletion brig cannon u hdl others userJournalWatcher execDelete . responseJsonMaybe assertDeletedProfilePublic = do const 200 === statusCode - const (Just noPict, Just True, Nothing) + const (Just True, Nothing) === ( \u' -> - ( fmap profilePict u', - fmap profileDeleted u', + ( fmap profileDeleted u', profileHandle =<< u' ) ) diff --git a/services/federator/test/integration/Test/Federator/IngressSpec.hs b/services/federator/test/integration/Test/Federator/IngressSpec.hs index 483e9cff179..38ef0f10ddd 100644 --- a/services/federator/test/integration/Test/Federator/IngressSpec.hs +++ b/services/federator/test/integration/Test/Federator/IngressSpec.hs @@ -46,6 +46,8 @@ import Util.Options (Endpoint (Endpoint)) import Wire.API.Federation.Client import Wire.API.Federation.Component import Wire.API.Federation.Domain +import Wire.API.Routes.Version qualified as V +import Wire.API.Routes.Versioned qualified as V import Wire.API.User import Wire.Network.DNS.SRV @@ -59,7 +61,7 @@ spec env = do brig <- view teBrig <$> ask user <- randomUser brig - let expectedProfile = mkUserProfile EmailVisibleToSelf user Nothing UserLegalHoldNoConsent + let expectedProfile = V.Versioned @V.V19 $ mkUserProfile EmailVisibleToSelf user Nothing UserLegalHoldNoConsent runTestSem $ do resp <- liftToCodensity diff --git a/services/federator/test/integration/Test/Federator/InwardSpec.hs b/services/federator/test/integration/Test/Federator/InwardSpec.hs index 53e01c2bf07..eb2e9be5a77 100644 --- a/services/federator/test/integration/Test/Federator/InwardSpec.hs +++ b/services/federator/test/integration/Test/Federator/InwardSpec.hs @@ -39,6 +39,8 @@ import Test.QuickCheck (arbitrary, generate) import Util.Options (Endpoint (Endpoint)) import Wire.API.Federation.API.Cargohold import Wire.API.Federation.Domain +import Wire.API.Routes.Version qualified as V +import Wire.API.Routes.Versioned qualified as V import Wire.API.User -- FUTUREWORK(federation): move these tests to brig-integration (benefit: avoid duplicating all of the brig helper code) @@ -70,7 +72,7 @@ spec env = brig <- view teBrig <$> ask user <- randomUser brig - let expectedProfile = mkUserProfile EmailVisibleToSelf user Nothing UserLegalHoldNoConsent + let expectedProfile = V.Versioned @V.V19 $ mkUserProfile EmailVisibleToSelf user Nothing UserLegalHoldNoConsent bdy <- responseJsonError =<< inwardCall "/federation/brig/get-users-by-ids" (encode [userId user]) diff --git a/services/federator/test/unit/Test/Federator/Client.hs b/services/federator/test/unit/Test/Federator/Client.hs index 0660390b393..7ed9113d5ae 100644 --- a/services/federator/test/unit/Test/Federator/Client.hs +++ b/services/federator/test/unit/Test/Federator/Client.hs @@ -70,6 +70,9 @@ import Wire.API.Federation.API import Wire.API.Federation.Client import Wire.API.Federation.Error import Wire.API.User (UserProfile) +import qualified Wire.API.Routes.Versioned as V +import qualified Wire.API.Routes.Version as V + targetDomain :: Domain targetDomain = Domain "target.example.com" @@ -124,7 +127,7 @@ withMockFederatorClient mock action = withTempMockFederator mock $ \port -> do testClientSuccess :: IO () testClientSuccess = do handle <- generate arbitrary - expectedResponse :: UserProfile <- generate arbitrary + expectedResponse :: V.Versioned V.V19 UserProfile <- generate arbitrary (actualResponse, sentRequests) <- withMockFederatorClient diff --git a/services/galley/test/integration/API/Util.hs b/services/galley/test/integration/API/Util.hs index 845a4f54984..98450430a7e 100644 --- a/services/galley/test/integration/API/Util.hs +++ b/services/galley/test/integration/API/Util.hs @@ -2580,7 +2580,6 @@ mkProfile quid name = UserProfile { profileQualifiedId = quid, profileName = name, - profilePict = noPict, profileTextStatus = Nothing, profileAssets = mempty, profileAccentId = defaultAccentId,