@@ -85,6 +85,8 @@ import Data.Qualified
85
85
import Data.Range
86
86
import Data.Schema ()
87
87
import Data.Text.Encoding qualified as Text
88
+ import Data.Vector (Vector )
89
+ import Data.Vector qualified as Vector
88
90
import Data.ZAuth.CryptoSign (CryptoSign )
89
91
import Data.ZAuth.Token qualified as ZAuth
90
92
import FileEmbedLzma
@@ -103,6 +105,8 @@ import Servant.OpenApi.Internal.Orphans ()
103
105
import Servant.Swagger.UI
104
106
import System.Logger.Class qualified as Log
105
107
import Util.Logging (logFunction , logHandle , logTeam , logUser )
108
+ import VectorBuilder.Builder qualified as VB
109
+ import VectorBuilder.Vector qualified as VB
106
110
import Wire.API.App
107
111
import Wire.API.Connection qualified as Public
108
112
import Wire.API.EnterpriseLogin
@@ -123,6 +127,7 @@ import Wire.API.Routes.Internal.Cargohold qualified as CargoholdInternalAPI
123
127
import Wire.API.Routes.Internal.Galley qualified as GalleyInternalAPI
124
128
import Wire.API.Routes.Internal.Gundeck qualified as GundeckInternalAPI
125
129
import Wire.API.Routes.Internal.Spar qualified as SparInternalAPI
130
+ import Wire.API.Routes.MultiTablePaging (GetMultiTablePageRequest (GetMultiTablePageRequest ))
126
131
import Wire.API.Routes.MultiTablePaging qualified as Public
127
132
import Wire.API.Routes.Named (Named (Named ))
128
133
import Wire.API.Routes.Public.Brig
@@ -173,7 +178,7 @@ import Wire.EnterpriseLoginSubsystem qualified as EnterpriseLogin
173
178
import Wire.Error
174
179
import Wire.Events (Events )
175
180
import Wire.FederationConfigStore (FederationConfigStore )
176
- import Wire.GalleyAPIAccess (GalleyAPIAccess )
181
+ import Wire.GalleyAPIAccess (GalleyAPIAccess , getUserGroupConversations )
177
182
import Wire.GalleyAPIAccess qualified as GalleyAPIAccess
178
183
import Wire.HashPassword (HashPassword )
179
184
import Wire.IndexedUserStore (IndexedUserStore )
@@ -1676,7 +1681,18 @@ createUserGroup :: (_) => Local UserId -> NewUserGroup -> Handler r UserGroup
1676
1681
createUserGroup lusr newUserGroup = lift . liftSem $ UserGroup. createGroup (tUnqualified lusr) newUserGroup
1677
1682
1678
1683
getUserGroup :: (_ ) => Local UserId -> UserGroupId -> Bool -> Handler r (Maybe UserGroup )
1679
- getUserGroup lusr ugid _ = lift . liftSem $ UserGroup. getGroup (tUnqualified lusr) ugid
1684
+ getUserGroup lusr ugid includeChannels =
1685
+ lift . liftSem $ do
1686
+ mUserGroup <- UserGroup. getGroup (tUnqualified lusr) ugid
1687
+ if includeChannels
1688
+ then forM mUserGroup $ \ userGroup -> do
1689
+ fetchedChannels <- fetchChannels lusr userGroup. id_
1690
+ pure
1691
+ userGroup
1692
+ { channels = Identity $ Just fetchedChannels,
1693
+ channelsCount = Just $ Vector. length fetchedChannels
1694
+ }
1695
+ else pure mUserGroup
1680
1696
1681
1697
getUserGroups ::
1682
1698
(_ ) =>
@@ -1689,9 +1705,29 @@ getUserGroups ::
1689
1705
Maybe UTCTimeMillis ->
1690
1706
Maybe UserGroupId ->
1691
1707
Bool ->
1708
+ Bool ->
1692
1709
Handler r UserGroupPage
1693
- getUserGroups lusr q sortByKeys sortOrder pSize mLastName mLastCreatedAt mLastId includeMemberCount =
1694
- lift . liftSem $ UserGroup. getGroups (tUnqualified lusr) q sortByKeys sortOrder pSize mLastName mLastCreatedAt mLastId includeMemberCount
1710
+ getUserGroups lusr q sortByKeys sortOrder pSize mLastName mLastCreatedAt mLastId includeChannels includeMemberCount =
1711
+ lift . liftSem $ do
1712
+ userGroups <- UserGroup. getGroups (tUnqualified lusr) q sortByKeys sortOrder pSize mLastName mLastCreatedAt mLastId includeMemberCount
1713
+ if includeChannels
1714
+ then fmap UserGroupPage $ forM userGroups. page $ \ userGroup -> do
1715
+ fetchedChannels <- fetchChannels lusr userGroup. id_
1716
+ pure
1717
+ userGroup
1718
+ { channelsCount = Just $ Vector. length fetchedChannels
1719
+ }
1720
+ else pure userGroups
1721
+
1722
+ fetchChannels :: (_ ) => Local UserId -> UserGroupId -> Sem r (Vector (Qualified ConvId ))
1723
+ fetchChannels luser ugid = do
1724
+ let mkRequest = getUserGroupConversations luser ugid . GetMultiTablePageRequest (toRange $ Proxy @ 1000 )
1725
+ go acc page = do
1726
+ if page. mtpHasMore
1727
+ then go (page. mtpResults : acc) =<< mkRequest (Just page. mtpPagingState)
1728
+ else pure $ VB. build $ foldMap VB. foldable $ reverse (page. mtpResults : acc)
1729
+ page <- mkRequest Nothing
1730
+ go [] page
1695
1731
1696
1732
updateUserGroup :: (_ ) => Local UserId -> UserGroupId -> UserGroupUpdate -> (Handler r ) ()
1697
1733
updateUserGroup lusr gid gupd = lift . liftSem $ UserGroup. updateGroup (tUnqualified lusr) gid gupd
0 commit comments