Skip to content

Commit 82cf625

Browse files
authored
Servantify conversation self member endpoints (#1740)
* Servantify conversation GET self endpoint * Servantify updateSelfMember * Add qualified updateSelfMember endpoint
1 parent c0f1880 commit 82cf625

File tree

5 files changed

+87
-51
lines changed

5 files changed

+87
-51
lines changed

CHANGELOG-draft.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ THIS FILE ACCUMULATES THE RELEASE NOTES FOR THE UPCOMING RELEASE.
99
* Remove the long-deprecated `message` field in `POST /connections` (#1726)
1010
* Add `PUT /conversations/:domain/:cnv/name` (#1737)
1111
* Deprecate `PUT /conversations/:cnv/name` (#1737)
12+
* Add `GET & PUT /conversations/:domain/:cnv/self` (#1740)
13+
* Deprecate `GET & PUT /conversations/:cnv/self` (#1740)
1214

1315
## Features
1416

libs/wire-api/src/Wire/API/Routes/Public/Galley.hs

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,63 @@ data Api routes = Api
333333
Respond 200 "Conversation updated" Event
334334
]
335335
(Maybe Event),
336+
getConversationSelfUnqualified ::
337+
routes
338+
:- Summary "Get self membership properties (deprecated)"
339+
:> Description "Use `/conversations/:domain/:conv/self` instead."
340+
:> ZUser
341+
:> "conversations"
342+
:> Capture' '[Description "Conversation ID"] "cnv" ConvId
343+
:> "self"
344+
:> Get '[JSON] (Maybe Member),
345+
getConversationSelf ::
346+
routes
347+
:- Summary "Get self membership properties"
348+
:> ZUser
349+
:> "conversations"
350+
:> QualifiedCapture' '[Description "Conversation ID"] "cnv" ConvId
351+
:> "self"
352+
:> MultiVerb
353+
'GET
354+
'[JSON]
355+
[ ConvNotFound,
356+
Respond 200 "Membership information" Member
357+
]
358+
(Maybe Member),
359+
updateConversationSelfUnqualified ::
360+
routes
361+
:- Summary "Update self membership properties (deprecated)"
362+
:> Description "Use `/conversations/:domain/:conv/self` instead."
363+
:> CanThrow ConvNotFound
364+
:> CanThrow ConvAccessDenied
365+
:> ZUser
366+
:> ZConn
367+
:> "conversations"
368+
:> Capture' '[Description "Conversation ID"] "cnv" ConvId
369+
:> "self"
370+
:> ReqBody '[JSON] MemberUpdate
371+
:> MultiVerb
372+
'PUT
373+
'[JSON]
374+
'[RespondEmpty 200 "Update successful"]
375+
(),
376+
updateConversationSelf ::
377+
routes
378+
:- Summary "Update self membership properties"
379+
:> Description "**Note**: at least one field has to be provided."
380+
:> CanThrow ConvNotFound
381+
:> CanThrow ConvAccessDenied
382+
:> ZUser
383+
:> ZConn
384+
:> "conversations"
385+
:> QualifiedCapture' '[Description "Conversation ID"] "cnv" ConvId
386+
:> "self"
387+
:> ReqBody '[JSON] MemberUpdate
388+
:> MultiVerb
389+
'PUT
390+
'[JSON]
391+
'[RespondEmpty 200 "Update successful"]
392+
(),
336393
-- Team Conversations
337394

338395
getTeamConversationRoles ::

services/galley/src/Galley/API/Public.hs

Lines changed: 4 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,10 @@ servantSitemap =
9595
GalleyAPI.updateConversationNameDeprecated = Update.updateLocalConversationName,
9696
GalleyAPI.updateConversationNameUnqualified = Update.updateLocalConversationName,
9797
GalleyAPI.updateConversationName = Update.updateConversationName,
98+
GalleyAPI.getConversationSelfUnqualified = Query.getLocalSelf,
99+
GalleyAPI.getConversationSelf = Query.getSelf,
100+
GalleyAPI.updateConversationSelfUnqualified = Update.updateLocalSelfMember,
101+
GalleyAPI.updateConversationSelf = Update.updateSelfMember,
98102
GalleyAPI.getTeamConversationRoles = Teams.getTeamConversationRoles,
99103
GalleyAPI.getTeamConversations = Teams.getTeamConversations,
100104
GalleyAPI.getTeamConversation = Teams.getTeamConversation,
@@ -718,32 +722,6 @@ sitemap = do
718722
errorResponse (Error.errorDescriptionToWai Error.notConnected)
719723
errorResponse (Error.errorDescriptionToWai Error.convAccessDenied)
720724

721-
get "/conversations/:cnv/self" (continue Query.getSelfH) $
722-
zauthUserId
723-
.&. capture "cnv"
724-
document "GET" "getSelf" $ do
725-
summary "Get self membership properties"
726-
parameter Path "cnv" bytes' $
727-
description "Conversation ID"
728-
returns (ref Public.modelMember)
729-
errorResponse (Error.errorDescriptionToWai Error.convNotFound)
730-
731-
-- This endpoint can lead to the following events being sent:
732-
-- - MemberStateUpdate event to self
733-
put "/conversations/:cnv/self" (continue Update.updateSelfMemberH) $
734-
zauthUserId
735-
.&. zauthConnId
736-
.&. capture "cnv"
737-
.&. jsonRequest @Public.MemberUpdate
738-
document "PUT" "updateSelf" $ do
739-
summary "Update self membership properties"
740-
notes "Even though all fields are optional, at least one needs to be given."
741-
parameter Path "cnv" bytes' $
742-
description "Conversation ID"
743-
body (ref Public.modelMemberUpdate) $
744-
description "JSON body"
745-
errorResponse (Error.errorDescriptionToWai Error.convNotFound)
746-
747725
-- This endpoint can lead to the following events being sent:
748726
-- - MemberStateUpdate event to members
749727
put "/conversations/:cnv/members/:usr" (continue Update.updateOtherMemberH) $

services/galley/src/Galley/API/Query.hs

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ module Galley.API.Query
2727
listConversations,
2828
listConversationsV2,
2929
iterateConversations,
30-
getSelfH,
30+
getLocalSelf,
31+
getSelf,
3132
internalGetMemberH,
3233
getConversationMetaH,
3334
getConversationByReusableCode,
@@ -344,27 +345,23 @@ iterateConversations uid pageSize handleConvs = go Nothing
344345
_ -> pure []
345346
pure $ resultHead : resultTail
346347

347-
getSelfH :: UserId ::: ConvId -> Galley Response
348-
getSelfH (zusr ::: cnv) = do
349-
json <$> getSelf zusr cnv
350-
351-
getSelf :: UserId -> ConvId -> Galley (Maybe Public.Member)
352-
getSelf zusr cnv =
353-
internalGetMember cnv zusr
348+
getSelf :: UserId -> Qualified ConvId -> Galley (Maybe Public.Member)
349+
getSelf zusr qcnv = do
350+
localDomain <- viewFederationDomain
351+
if localDomain == qDomain qcnv
352+
then getLocalSelf zusr (qUnqualified qcnv)
353+
else throwM federationNotImplemented
354354

355355
internalGetMemberH :: ConvId ::: UserId -> Galley Response
356356
internalGetMemberH (cnv ::: usr) = do
357-
json <$> internalGetMember cnv usr
357+
json <$> getLocalSelf usr cnv
358358

359-
internalGetMember :: ConvId -> UserId -> Galley (Maybe Public.Member)
360-
internalGetMember cnv usr = do
359+
getLocalSelf :: UserId -> ConvId -> Galley (Maybe Public.Member)
360+
getLocalSelf usr cnv = do
361361
alive <- Data.isConvAlive cnv
362362
if alive
363-
then do
364-
fmap Mapping.toMember <$> Data.member cnv usr
365-
else do
366-
Data.deleteConversation cnv
367-
pure Nothing
363+
then Mapping.toMember <$$> Data.member cnv usr
364+
else Nothing <$ Data.deleteConversation cnv
368365

369366
getConversationMetaH :: ConvId -> Galley Response
370367
getConversationMetaH cnv = do

services/galley/src/Galley/API/Update.hs

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ module Galley.API.Update
3636
-- * Managing Members
3737
addMembersH,
3838
addMembers,
39-
updateSelfMemberH,
39+
updateLocalSelfMember,
40+
updateSelfMember,
4041
updateOtherMemberH,
4142
removeMember,
4243
removeMemberQualified,
@@ -122,7 +123,7 @@ import Wire.API.ErrorDescription
122123
import qualified Wire.API.ErrorDescription as Public
123124
import qualified Wire.API.Event.Conversation as Public
124125
import qualified Wire.API.Federation.API.Galley as FederatedGalley
125-
import Wire.API.Federation.Error
126+
import Wire.API.Federation.Error (federationNotImplemented)
126127
import qualified Wire.API.Message as Public
127128
import Wire.API.Routes.Public.Galley (UpdateResult (..))
128129
import Wire.API.Routes.Public.Galley.Responses
@@ -549,14 +550,15 @@ addMembers zusr zcon convId invite = do
549550
checkLHPolicyConflictsRemote :: FutureWork 'LegalholdPlusFederationNotImplemented [Remote UserId] -> Galley ()
550551
checkLHPolicyConflictsRemote _remotes = pure ()
551552

552-
updateSelfMemberH :: UserId ::: ConnId ::: ConvId ::: JsonRequest Public.MemberUpdate -> Galley Response
553-
updateSelfMemberH (zusr ::: zcon ::: cid ::: req) = do
554-
update <- fromJsonBody req
555-
updateSelfMember zusr zcon cid update
556-
return empty
553+
updateSelfMember :: UserId -> ConnId -> Qualified ConvId -> Public.MemberUpdate -> Galley ()
554+
updateSelfMember zusr zcon qcnv update = do
555+
localDomain <- viewFederationDomain
556+
if qDomain qcnv == localDomain
557+
then updateLocalSelfMember zusr zcon (qUnqualified qcnv) update
558+
else throwM federationNotImplemented
557559

558-
updateSelfMember :: UserId -> ConnId -> ConvId -> Public.MemberUpdate -> Galley ()
559-
updateSelfMember zusr zcon cid update = do
560+
updateLocalSelfMember :: UserId -> ConnId -> ConvId -> Public.MemberUpdate -> Galley ()
561+
updateLocalSelfMember zusr zcon cid update = do
560562
conv <- getConversationAndCheckMembership zusr cid
561563
m <- getSelfMemberFromLocalsLegacy zusr (Data.convLocalMembers conv)
562564
-- Ensure no self role upgrades

0 commit comments

Comments
 (0)