diff --git a/changelog.d/1-api-changes/pr-3213 b/changelog.d/1-api-changes/pr-3213 new file mode 100644 index 0000000000..752a714077 --- /dev/null +++ b/changelog.d/1-api-changes/pr-3213 @@ -0,0 +1 @@ +Non-binding team endpoints are removed from API version V4 diff --git a/libs/wire-api/src/Wire/API/Routes/Public/Galley/Team.hs b/libs/wire-api/src/Wire/API/Routes/Public/Galley/Team.hs index 0a81f55c27..3d3571dd23 100644 --- a/libs/wire-api/src/Wire/API/Routes/Public/Galley/Team.hs +++ b/libs/wire-api/src/Wire/API/Routes/Public/Galley/Team.hs @@ -26,6 +26,7 @@ import Wire.API.Error.Galley import Wire.API.Routes.MultiVerb import Wire.API.Routes.Named import Wire.API.Routes.Public +import Wire.API.Routes.Version import Wire.API.Team import Wire.API.Team.Permission @@ -33,7 +34,7 @@ type TeamAPI = Named "create-non-binding-team" ( Summary "Create a new non binding team" - -- FUTUREWORK: deprecated in https://github.com/wireapp/wire-server/pull/2607 + :> Until 'V4 :> ZUser :> ZConn :> CanThrow 'NotConnected @@ -69,7 +70,7 @@ type TeamAPI = :<|> Named "get-teams" ( Summary "Get teams (deprecated); use `GET /teams/:tid`" - -- FUTUREWORK: deprecated in https://github.com/wireapp/wire-server/pull/2607 + :> Until 'V4 :> ZUser :> "teams" :> Get '[JSON] TeamList diff --git a/libs/wire-api/src/Wire/API/Routes/Public/Galley/TeamMember.hs b/libs/wire-api/src/Wire/API/Routes/Public/Galley/TeamMember.hs index 7f9e99dcaa..205d51c2a8 100644 --- a/libs/wire-api/src/Wire/API/Routes/Public/Galley/TeamMember.hs +++ b/libs/wire-api/src/Wire/API/Routes/Public/Galley/TeamMember.hs @@ -31,6 +31,7 @@ import Wire.API.Routes.LowLevelStream import Wire.API.Routes.MultiVerb import Wire.API.Routes.Named import Wire.API.Routes.Public +import Wire.API.Routes.Version import Wire.API.Team.Member import qualified Wire.API.User as User @@ -96,7 +97,7 @@ type TeamMemberAPI = :<|> Named "add-team-member" ( Summary "Add a new team member" - -- FUTUREWORK: deprecated in https://github.com/wireapp/wire-server/pull/2607 + :> Until 'V4 :> CanThrow 'InvalidPermissions :> CanThrow 'NoAddToBinding :> CanThrow 'NotATeamMember @@ -142,7 +143,7 @@ type TeamMemberAPI = :<|> Named "delete-non-binding-team-member" ( Summary "Remove an existing team member" - -- FUTUREWORK: deprecated in https://github.com/wireapp/wire-server/pull/2607 + :> Until 'V4 :> CanThrow AuthenticationError :> CanThrow 'AccessDenied :> CanThrow 'TeamMemberNotFound diff --git a/libs/wire-api/src/Wire/API/Team.hs b/libs/wire-api/src/Wire/API/Team.hs index af7c594d8a..558ad85fed 100644 --- a/libs/wire-api/src/Wire/API/Team.hs +++ b/libs/wire-api/src/Wire/API/Team.hs @@ -107,15 +107,18 @@ newTeam tid uid nme ico tb = Team tid uid nme ico Nothing tb DefaultIcon instance ToSchema Team where schema = - object "Team" $ + objectWithDocModifier "Team" desc $ Team <$> _teamId .= field "id" schema <*> _teamCreator .= field "creator" schema <*> _teamName .= field "name" schema <*> _teamIcon .= field "icon" schema <*> _teamIconKey .= maybe_ (optField "icon_key" schema) - <*> _teamBinding .= (fromMaybe Binding <$> optField "binding" schema) + <*> _teamBinding .= (fromMaybe Binding <$> optFieldWithDocModifier "binding" bindingDesc schema) <*> _teamSplashScreen .= (fromMaybe DefaultIcon <$> optField "splash_screen" schema) + where + desc = description ?~ "`binding` is deprecated, and should be ignored. The non-binding teams API is not used (and will not be supported from API version V4 onwards), and `binding` will always be `true`." + bindingDesc = description ?~ "Deprecated, please ignore." -- | How a team "binds" its members (users) -- diff --git a/services/brig/test/integration/API/Team.hs b/services/brig/test/integration/API/Team.hs index 4bfcc42d94..9558239bdf 100644 --- a/services/brig/test/integration/API/Team.hs +++ b/services/brig/test/integration/API/Team.hs @@ -531,10 +531,8 @@ testCreateTeam brig galley userJournalWatcher = do email <- randomEmail usr <- responseJsonError =<< register email newTeam brig let uid = userId usr - -- Verify that the user is part of exactly one (binding) team - teams <- view teamListTeams <$> getTeams uid galley - liftIO $ assertBool "User not part of exactly one team" (length teams == 1) - let team = fromMaybe (error "No team??") $ listToMaybe teams + let tid = fromMaybe (error "No team??") $ userTeam usr + team <- Team.tdTeam <$> getTeam galley tid mem <- getTeamMember uid (team ^. teamId) galley liftIO $ assertBool "Member not part of the team" (uid == mem ^. Member.userId) -- Verify that the user cannot send invitations before activating their account @@ -565,9 +563,8 @@ testCreateTeamPreverified brig galley userJournalWatcher = do usr <- responseJsonError =<< register' email newTeam c brig getTeams uid galley - liftIO $ assertBool "User not part of exactly one team" (length teams == 1) - let team = fromMaybe (error "No team??") $ listToMaybe teams + let tid = fromMaybe (error "No team??") $ userTeam usr + team <- Team.tdTeam <$> getTeam galley tid mem <- getTeamMember uid (team ^. teamId) galley liftIO $ assertBool "Member not part of the team" (uid == mem ^. Member.userId) team2 <- getTeam galley (team ^. teamId) diff --git a/services/brig/test/integration/API/Team/Util.hs b/services/brig/test/integration/API/Team/Util.hs index b809b89c48..ff2f9c7ab4 100644 --- a/services/brig/test/integration/API/Team/Util.hs +++ b/services/brig/test/integration/API/Team/Util.hs @@ -274,20 +274,6 @@ deleteTeam g tid u = do !!! const 202 === statusCode -getTeams :: - (MonadIO m, MonadCatch m, MonadHttp m, HasCallStack) => - UserId -> - Galley -> - m TeamList -getTeams u galley = - responseJsonError - =<< get - ( galley - . paths ["teams"] - . zAuthAccess u "conn" - . expect2xx - ) - newTeam :: BindingNewTeam newTeam = BindingNewTeam $ newNewTeam (unsafeRange "teamName") DefaultIcon @@ -414,7 +400,7 @@ unsuspendTeam brig t = . paths ["i", "teams", toByteString' t, "unsuspend"] . contentJson -getTeam :: HasCallStack => Galley -> TeamId -> Http Team.TeamData +getTeam :: (HasCallStack, MonadIO m, MonadHttp m, HasCallStack, MonadCatch m) => Galley -> TeamId -> m Team.TeamData getTeam galley t = responseJsonError =<< get (galley . paths ["i", "teams", toByteString' t]) diff --git a/services/brig/test/integration/API/UserPendingActivation.hs b/services/brig/test/integration/API/UserPendingActivation.hs index b4a9a82a4b..87c822f35b 100644 --- a/services/brig/test/integration/API/UserPendingActivation.hs +++ b/services/brig/test/integration/API/UserPendingActivation.hs @@ -22,7 +22,7 @@ module API.UserPendingActivation where -import API.Team.Util (getTeams) +import API.Team.Util (getTeam) import Bilge hiding (query) import Bilge.Assert (( Brig -> Galley -> m (UserId, TeamId) +createUserWithTeamDisableSSO :: (HasCallStack, MonadCatch m, MonadHttp m, MonadIO m) => Brig -> Galley -> m (UserId, TeamId) createUserWithTeamDisableSSO brg gly = do e <- randomEmail n <- UUID.toString <$> liftIO UUID.nextRandom @@ -166,7 +167,7 @@ createUserWithTeamDisableSSO brg gly = do ] bdy <- selfUser . responseJsonUnsafe <$> post (brg . path "/i/users" . contentJson . body p) let (uid, Just tid) = (userId bdy, userTeam bdy) - (team : _) <- (^. teamListTeams) <$> getTeams uid gly + team <- Team.tdTeam <$> getTeam gly tid () <- Control.Exception.assert {- "Team ID in registration and team table do not match" -} (tid == team ^. teamId) $ pure () diff --git a/services/galley/test/integration/API/Teams.hs b/services/galley/test/integration/API/Teams.hs index 1635f3ae77..3e03c34ca0 100644 --- a/services/galley/test/integration/API/Teams.hs +++ b/services/galley/test/integration/API/Teams.hs @@ -86,6 +86,7 @@ import Wire.API.Conversation.Role import Wire.API.Event.Team import Wire.API.Internal.Notification hiding (target) import Wire.API.Routes.Internal.Galley.TeamsIntra as TeamsIntra +import Wire.API.Routes.Version import Wire.API.Team import Wire.API.Team.Export (TeamExportUser (..)) import qualified Wire.API.Team.Feature as Public @@ -614,9 +615,12 @@ testRemoveBindingTeamMember ownerHasPassword = do Util.connectUsers owner (List1.singleton mext) cid1 <- Util.createTeamConv owner tid [mem1 ^. userId, mext] (Just "blaa") Nothing Nothing when ownerHasPassword $ do + -- request to remove a team member is handled by the by the endpoint do remove non-binding team member + -- which is not supported from V4 onwards, therefore we need to use API version V3 + gv3 <- fmap (addPrefixAtVersion V3 .) (view tsUnversionedGalley) -- Deleting from a binding team with empty body is invalid delete - ( g + ( gv3 . paths ["teams", toByteString' tid, "members", toByteString' (mem1 ^. userId)] . zUser owner . zConn "conn" diff --git a/services/galley/test/integration/API/Util.hs b/services/galley/test/integration/API/Util.hs index 897da49666..1a0fcebce7 100644 --- a/services/galley/test/integration/API/Util.hs +++ b/services/galley/test/integration/API/Util.hs @@ -222,7 +222,8 @@ createBindingTeamWithQualifiedMembers num = do getTeams :: UserId -> [(ByteString, Maybe ByteString)] -> TestM TeamList getTeams u queryItems = do - g <- viewGalley + -- This endpoint is removed from version v4 onwards + g <- fmap (addPrefixAtVersion V3 .) (view tsUnversionedGalley) r <- get ( g