diff --git a/CHANGELOG-draft.md b/CHANGELOG-draft.md index e8acfea30e..9d0933204a 100644 --- a/CHANGELOG-draft.md +++ b/CHANGELOG-draft.md @@ -8,6 +8,8 @@ THIS FILE ACCUMULATES THE RELEASE NOTES FOR THE UPCOMING RELEASE. * Add `PUT /conversations/:domain/:cnv/name` (#1737) * Deprecate `PUT /conversations/:cnv/name` (#1737) +* Add `GET & PUT /conversations/:domain/:cnv/self` (#1740) +* Deprecate `GET & PUT /conversations/:cnv/self` (#1740) ## Features diff --git a/libs/wire-api/src/Wire/API/Routes/Public/Galley.hs b/libs/wire-api/src/Wire/API/Routes/Public/Galley.hs index 24a1087641..ad9c3e401a 100644 --- a/libs/wire-api/src/Wire/API/Routes/Public/Galley.hs +++ b/libs/wire-api/src/Wire/API/Routes/Public/Galley.hs @@ -347,6 +347,63 @@ data Api routes = Api Respond 200 "Conversation updated" Event ] (Maybe Event), + getConversationSelfUnqualified :: + routes + :- Summary "Get self membership properties (deprecated)" + :> Description "Use `/conversations/:domain/:conv/self` instead." + :> ZUser + :> "conversations" + :> Capture' '[Description "Conversation ID"] "cnv" ConvId + :> "self" + :> Get '[JSON] (Maybe Member), + getConversationSelf :: + routes + :- Summary "Get self membership properties" + :> ZUser + :> "conversations" + :> QualifiedCapture' '[Description "Conversation ID"] "cnv" ConvId + :> "self" + :> MultiVerb + 'GET + '[JSON] + [ ConvNotFound, + Respond 200 "Membership information" Member + ] + (Maybe Member), + updateConversationSelfUnqualified :: + routes + :- Summary "Update self membership properties (deprecated)" + :> Description "Use `/conversations/:domain/:conv/self` instead." + :> CanThrow ConvNotFound + :> CanThrow ConvAccessDenied + :> ZUser + :> ZConn + :> "conversations" + :> Capture' '[Description "Conversation ID"] "cnv" ConvId + :> "self" + :> ReqBody '[JSON] MemberUpdate + :> MultiVerb + 'PUT + '[JSON] + '[RespondEmpty 200 "Update successful"] + (), + updateConversationSelf :: + routes + :- Summary "Update self membership properties" + :> Description "**Note**: at least one field has to be provided." + :> CanThrow ConvNotFound + :> CanThrow ConvAccessDenied + :> ZUser + :> ZConn + :> "conversations" + :> QualifiedCapture' '[Description "Conversation ID"] "cnv" ConvId + :> "self" + :> ReqBody '[JSON] MemberUpdate + :> MultiVerb + 'PUT + '[JSON] + '[RespondEmpty 200 "Update successful"] + (), -- Team Conversations getTeamConversationRoles :: diff --git a/services/galley/src/Galley/API/Public.hs b/services/galley/src/Galley/API/Public.hs index ff8b8e6fb4..8d2b29625c 100644 --- a/services/galley/src/Galley/API/Public.hs +++ b/services/galley/src/Galley/API/Public.hs @@ -95,6 +95,10 @@ servantSitemap = GalleyAPI.updateConversationNameDeprecated = Update.updateLocalConversationName, GalleyAPI.updateConversationNameUnqualified = Update.updateLocalConversationName, GalleyAPI.updateConversationName = Update.updateConversationName, + GalleyAPI.getConversationSelfUnqualified = Query.getLocalSelf, + GalleyAPI.getConversationSelf = Query.getSelf, + GalleyAPI.updateConversationSelfUnqualified = Update.updateLocalSelfMember, + GalleyAPI.updateConversationSelf = Update.updateSelfMember, GalleyAPI.getTeamConversationRoles = Teams.getTeamConversationRoles, GalleyAPI.getTeamConversations = Teams.getTeamConversations, GalleyAPI.getTeamConversation = Teams.getTeamConversation, @@ -718,32 +722,6 @@ sitemap = do errorResponse (Error.errorDescriptionToWai Error.notConnected) errorResponse (Error.errorDescriptionToWai Error.convAccessDenied) - get "/conversations/:cnv/self" (continue Query.getSelfH) $ - zauthUserId - .&. capture "cnv" - document "GET" "getSelf" $ do - summary "Get self membership properties" - parameter Path "cnv" bytes' $ - description "Conversation ID" - returns (ref Public.modelMember) - errorResponse (Error.errorDescriptionToWai Error.convNotFound) - - -- This endpoint can lead to the following events being sent: - -- - MemberStateUpdate event to self - put "/conversations/:cnv/self" (continue Update.updateSelfMemberH) $ - zauthUserId - .&. zauthConnId - .&. capture "cnv" - .&. jsonRequest @Public.MemberUpdate - document "PUT" "updateSelf" $ do - summary "Update self membership properties" - notes "Even though all fields are optional, at least one needs to be given." - parameter Path "cnv" bytes' $ - description "Conversation ID" - body (ref Public.modelMemberUpdate) $ - description "JSON body" - errorResponse (Error.errorDescriptionToWai Error.convNotFound) - -- This endpoint can lead to the following events being sent: -- - MemberStateUpdate event to members put "/conversations/:cnv/members/:usr" (continue Update.updateOtherMemberH) $ diff --git a/services/galley/src/Galley/API/Query.hs b/services/galley/src/Galley/API/Query.hs index 525b5d991b..c32438ad14 100644 --- a/services/galley/src/Galley/API/Query.hs +++ b/services/galley/src/Galley/API/Query.hs @@ -27,7 +27,8 @@ module Galley.API.Query listConversations, listConversationsV2, iterateConversations, - getSelfH, + getLocalSelf, + getSelf, internalGetMemberH, getConversationMetaH, getConversationByReusableCode, @@ -344,27 +345,23 @@ iterateConversations uid pageSize handleConvs = go Nothing _ -> pure [] pure $ resultHead : resultTail -getSelfH :: UserId ::: ConvId -> Galley Response -getSelfH (zusr ::: cnv) = do - json <$> getSelf zusr cnv - -getSelf :: UserId -> ConvId -> Galley (Maybe Public.Member) -getSelf zusr cnv = - internalGetMember cnv zusr +getSelf :: UserId -> Qualified ConvId -> Galley (Maybe Public.Member) +getSelf zusr qcnv = do + localDomain <- viewFederationDomain + if localDomain == qDomain qcnv + then getLocalSelf zusr (qUnqualified qcnv) + else throwM federationNotImplemented internalGetMemberH :: ConvId ::: UserId -> Galley Response internalGetMemberH (cnv ::: usr) = do - json <$> internalGetMember cnv usr + json <$> getLocalSelf usr cnv -internalGetMember :: ConvId -> UserId -> Galley (Maybe Public.Member) -internalGetMember cnv usr = do +getLocalSelf :: UserId -> ConvId -> Galley (Maybe Public.Member) +getLocalSelf usr cnv = do alive <- Data.isConvAlive cnv if alive - then do - fmap Mapping.toMember <$> Data.member cnv usr - else do - Data.deleteConversation cnv - pure Nothing + then Mapping.toMember <$$> Data.member cnv usr + else Nothing <$ Data.deleteConversation cnv getConversationMetaH :: ConvId -> Galley Response getConversationMetaH cnv = do diff --git a/services/galley/src/Galley/API/Update.hs b/services/galley/src/Galley/API/Update.hs index 2063333c1e..f7d2a0c1e5 100644 --- a/services/galley/src/Galley/API/Update.hs +++ b/services/galley/src/Galley/API/Update.hs @@ -36,7 +36,8 @@ module Galley.API.Update -- * Managing Members addMembersH, addMembers, - updateSelfMemberH, + updateLocalSelfMember, + updateSelfMember, updateOtherMemberH, removeMember, removeMemberQualified, @@ -126,7 +127,7 @@ import qualified Wire.API.ErrorDescription as Public import qualified Wire.API.Event.Conversation as Public import Wire.API.Federation.API.Galley (RemoteMessage (..)) import qualified Wire.API.Federation.API.Galley as FederatedGalley -import Wire.API.Federation.Error +import Wire.API.Federation.Error (federationNotImplemented) import qualified Wire.API.Message as Public import Wire.API.Routes.Public.Galley (UpdateResult (..)) import Wire.API.Routes.Public.Galley.Responses @@ -554,14 +555,15 @@ addMembers zusr zcon convId invite = do checkLHPolicyConflictsRemote :: FutureWork 'LegalholdPlusFederationNotImplemented [Remote UserId] -> Galley () checkLHPolicyConflictsRemote _remotes = pure () -updateSelfMemberH :: UserId ::: ConnId ::: ConvId ::: JsonRequest Public.MemberUpdate -> Galley Response -updateSelfMemberH (zusr ::: zcon ::: cid ::: req) = do - update <- fromJsonBody req - updateSelfMember zusr zcon cid update - return empty +updateSelfMember :: UserId -> ConnId -> Qualified ConvId -> Public.MemberUpdate -> Galley () +updateSelfMember zusr zcon qcnv update = do + localDomain <- viewFederationDomain + if qDomain qcnv == localDomain + then updateLocalSelfMember zusr zcon (qUnqualified qcnv) update + else throwM federationNotImplemented -updateSelfMember :: UserId -> ConnId -> ConvId -> Public.MemberUpdate -> Galley () -updateSelfMember zusr zcon cid update = do +updateLocalSelfMember :: UserId -> ConnId -> ConvId -> Public.MemberUpdate -> Galley () +updateLocalSelfMember zusr zcon cid update = do conv <- getConversationAndCheckMembership zusr cid m <- getSelfMemberFromLocalsLegacy zusr (Data.convLocalMembers conv) -- Ensure no self role upgrades