Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG-draft.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
57 changes: 57 additions & 0 deletions libs/wire-api/src/Wire/API/Routes/Public/Galley.hs
Original file line number Diff line number Diff line change
Expand Up @@ -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 ::
Expand Down
30 changes: 4 additions & 26 deletions services/galley/src/Galley/API/Public.hs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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) $
Expand Down
29 changes: 13 additions & 16 deletions services/galley/src/Galley/API/Query.hs
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@ module Galley.API.Query
listConversations,
listConversationsV2,
iterateConversations,
getSelfH,
getLocalSelf,
getSelf,
internalGetMemberH,
getConversationMetaH,
getConversationByReusableCode,
Expand Down Expand Up @@ -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
Expand Down
20 changes: 11 additions & 9 deletions services/galley/src/Galley/API/Update.hs
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,8 @@ module Galley.API.Update
-- * Managing Members
addMembersH,
addMembers,
updateSelfMemberH,
updateLocalSelfMember,
updateSelfMember,
updateOtherMemberH,
removeMember,
removeMemberQualified,
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down