Skip to content

Commit b4af1e1

Browse files
committed
WPB-19712: Allow team admin to update the channels to user-group association
1 parent 909912b commit b4af1e1

File tree

13 files changed

+105
-8
lines changed

13 files changed

+105
-8
lines changed

changelog.d/2-features/WPB-19713

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Implement `channels` and `channelsCount` in `user-groups` endpoints.

integration/test/API/Brig.hs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1061,6 +1061,11 @@ getUserGroup user gid = do
10611061
req <- baseRequest user Brig Versioned $ joinHttpPath ["user-groups", gid]
10621062
submit "GET" req
10631063

1064+
getUserGroupWithChannels :: (MakesValue user) => user -> String -> App Response
1065+
getUserGroupWithChannels user gid = do
1066+
req <- baseRequest user Brig Versioned $ joinHttpPath ["user-groups", gid]
1067+
submit "GET" $ req & addQueryParams [("include_channels", "true")]
1068+
10641069
updateUserGroupChannels :: (MakesValue user) => user -> String -> [String] -> App Response
10651070
updateUserGroupChannels user gid convIds = do
10661071
req <- baseRequest user Brig Versioned $ joinHttpPath ["user-groups", gid, "channels"]

integration/test/Test/UserGroup.hs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -390,8 +390,9 @@ testUserGroupUpdateChannels = do
390390
updateUserGroupChannels alice gid [convId.id_] >>= assertSuccess
391391

392392
-- bobId <- asString $ bob %. "id"
393-
bindResponse (getUserGroup alice gid) $ \resp -> do
393+
bindResponse (getUserGroupWithChannels alice gid) $ \resp -> do
394394
resp.status `shouldMatchInt` 200
395+
resp.json %. "channels" `shouldMatch` [object ["id" .= convId.id_, "domain" .= convId.domain]]
395396

396397
-- FUTUREWORK: check the actual associated channels
397398
-- resp.json %. "members" `shouldMatch` [bobId]

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,7 @@ type UserGroupAPI =
314314
)
315315
:<|> Named
316316
"get-user-group"
317-
( Summary "[STUB] (channels in response not implemented)"
317+
( Summary "Fetch a group accessible from the logged-in user"
318318
:> From 'V10
319319
:> ZLocalUser
320320
:> CanThrow 'UserGroupNotFound
@@ -331,7 +331,7 @@ type UserGroupAPI =
331331
)
332332
:<|> Named
333333
"get-user-groups"
334-
( Summary "[STUB] (channelsCount not implemented)"
334+
( Summary "Fetch groups accessible from the logged-in user"
335335
:> From 'V10
336336
:> ZLocalUser
337337
:> "user-groups"
@@ -342,6 +342,7 @@ type UserGroupAPI =
342342
:> QueryParam' '[Optional, Strict, LastSeenNameDesc] "last_seen_name" UserGroupName
343343
:> QueryParam' '[Optional, Strict, LastSeenCreatedAtDesc] "last_seen_created_at" UTCTimeMillis
344344
:> QueryParam' '[Optional, Strict, LastSeenIdDesc] "last_seen_id" UserGroupId
345+
:> QueryFlag "include_channels"
345346
:> QueryFlag "include_member_count"
346347
:> Get '[JSON] UserGroupPage
347348
)

libs/wire-subsystems/src/Wire/UserGroupStore.hs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,5 +38,6 @@ data UserGroupStore m a where
3838
UpdateUsers :: UserGroupId -> Vector UserId -> UserGroupStore m ()
3939
RemoveUser :: UserGroupId -> UserId -> UserGroupStore m ()
4040
UpdateUserGroupChannels :: UserGroupId -> Vector ConvId -> UserGroupStore m ()
41+
ListUserGroupChannels :: UserGroupId -> UserGroupStore m (Vector ConvId)
4142

4243
makeSem ''UserGroupStore

libs/wire-subsystems/src/Wire/UserGroupStore/Postgres.hs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ interpretUserGroupStoreToPostgres =
5454
UpdateUsers gid uids -> updateUsers gid uids
5555
RemoveUser gid uid -> removeUser gid uid
5656
UpdateUserGroupChannels gid convIds -> updateUserGroupChannels gid convIds
57+
ListUserGroupChannels gid -> listUserGroupChannels gid
5758

5859
updateUsers :: (UserGroupStorePostgresEffectConstraints r) => UserGroupId -> Vector UserId -> Sem r ()
5960
updateUsers gid uids = do
@@ -441,6 +442,28 @@ updateUserGroupChannels gid convIds = do
441442
on conflict (user_group_id, conv_id) do nothing
442443
|]
443444

445+
listUserGroupChannels ::
446+
forall r.
447+
(UserGroupStorePostgresEffectConstraints r) =>
448+
UserGroupId ->
449+
Sem r (Vector ConvId)
450+
listUserGroupChannels gid = do
451+
pool <- input
452+
eitherErrorOrUnit <- liftIO $ use pool session
453+
either throw pure eitherErrorOrUnit
454+
where
455+
session :: Session (Vector ConvId)
456+
session = statement gid selectStatement
457+
458+
selectStatement :: Statement UserGroupId (Vector ConvId)
459+
selectStatement =
460+
dimap
461+
toUUID
462+
(fmap Id)
463+
[vectorStatement|
464+
select (conv_id :: uuid) from user_group_channel where user_group_id = ($1 :: uuid)
465+
|]
466+
444467
crudUser ::
445468
forall r.
446469
(UserGroupStorePostgresEffectConstraints r) =>

libs/wire-subsystems/src/Wire/UserGroupSubsystem.hs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,5 +33,6 @@ data UserGroupSubsystem m a where
3333
UpdateUsers :: UserId -> UserGroupId -> Vector UserId -> UserGroupSubsystem m ()
3434
RemoveUser :: UserId -> UserGroupId -> UserId -> UserGroupSubsystem m ()
3535
UpdateChannels :: UserId -> UserGroupId -> Vector ConvId -> UserGroupSubsystem m ()
36+
ListChannels :: UserId -> UserGroupId -> UserGroupSubsystem m (Vector ConvId)
3637

3738
makeSem ''UserGroupSubsystem

libs/wire-subsystems/src/Wire/UserGroupSubsystem/Interpreter.hs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ interpretUserGroupSubsystem = interpret $ \case
5353
UpdateUsers updater groupId uids -> updateUsers updater groupId uids
5454
RemoveUser remover groupId removeeId -> removeUser remover groupId removeeId
5555
UpdateChannels performer groupId channelIds -> updateChannels performer groupId channelIds
56+
ListChannels performer groupId -> listChannels performer groupId
5657

5758
data UserGroupSubsystemError
5859
= UserGroupNotATeamAdmin
@@ -350,3 +351,17 @@ updateChannels performer groupId channelIds = do
350351
teamId <- getTeamAsAdmin performer >>= note UserGroupNotATeamAdmin
351352
traverse_ (getTeamConv performer teamId >=> note UserGroupChannelNotFound) channelIds
352353
Store.updateUserGroupChannels groupId channelIds
354+
355+
listChannels ::
356+
( Member UserSubsystem r,
357+
Member Store.UserGroupStore r,
358+
Member (Error UserGroupSubsystemError) r,
359+
Member TeamSubsystem r
360+
) =>
361+
UserId ->
362+
UserGroupId ->
363+
Sem r (Vector ConvId)
364+
listChannels performer groupId = do
365+
void $ getUserGroup performer groupId >>= note UserGroupNotFound
366+
void $ getUserTeam performer >>= note UserGroupNotATeamAdmin
367+
Store.listUserGroupChannels groupId

libs/wire-subsystems/test/unit/Wire/MockInterpreters/UserGroupStore.hs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import Data.Domain (Domain (Domain))
1111
import Data.Id
1212
import Data.Json.Util
1313
import Data.Map qualified as Map
14-
import Data.Qualified (Qualified (Qualified))
14+
import Data.Qualified
1515
import Data.Text qualified as T
1616
import Data.Time.Clock
1717
import Data.Vector (Vector, fromList)
@@ -65,6 +65,7 @@ userGroupStoreTestInterpreter =
6565
UpdateUsers gid uids -> updateUsersImpl gid uids
6666
RemoveUser gid uid -> removeUserImpl gid uid
6767
UpdateUserGroupChannels gid convIds -> updateUserGroupChannelsImpl gid convIds
68+
ListUserGroupChannels gid -> listUserGroupChannelsImpl gid
6869

6970
updateUsersImpl :: (UserGroupStoreInMemEffectConstraints r) => UserGroupId -> Vector UserId -> Sem r ()
7071
updateUsersImpl gid uids = do
@@ -201,6 +202,14 @@ updateUserGroupChannelsImpl gid convIds = do
201202

202203
modifyUserGroupsGidOnly gid (Map.alter f)
203204

205+
listUserGroupChannelsImpl ::
206+
(UserGroupStoreInMemEffectConstraints r) =>
207+
UserGroupId ->
208+
Sem r (Vector ConvId)
209+
listUserGroupChannelsImpl gid =
210+
foldMap (fmap qUnqualified) . (runIdentity . (.channels) . snd <=< find ((== gid) . snd . fst) . Map.toList)
211+
<$> get @(Map (TeamId, UserGroupId) UserGroup)
212+
204213
----------------------------------------------------------------------
205214

206215
modifyUserGroupsGidOnly ::

postgres-schema.sql

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,17 @@ CREATE TABLE public.user_group_channel (
104104
);
105105

106106

107+
108+
--
109+
-- Name: user_group_channel; Type: TABLE; Schema: public; Owner: wire-server
110+
--
111+
112+
CREATE TABLE public.user_group_channel (
113+
user_group_id uuid NOT NULL,
114+
conv_id uuid NOT NULL
115+
);
116+
117+
107118
ALTER TABLE public.user_group_channel OWNER TO "wire-server";
108119

109120
--

0 commit comments

Comments
 (0)