diff --git a/changelog.d/5-internal/galley-types-remove-reexports b/changelog.d/5-internal/galley-types-remove-reexports new file mode 100644 index 0000000000..df2c221189 --- /dev/null +++ b/changelog.d/5-internal/galley-types-remove-reexports @@ -0,0 +1 @@ +galley-types: remove all re-exports diff --git a/libs/galley-types/galley-types.cabal b/libs/galley-types/galley-types.cabal index 04d13306a9..30d874c92e 100644 --- a/libs/galley-types/galley-types.cabal +++ b/libs/galley-types/galley-types.cabal @@ -4,7 +4,7 @@ cabal-version: 1.12 -- -- see: https://github.com/sol/hpack -- --- hash: 9468b34d92756358ec15e112490166749eeb8aa4c15ec1db90adf33e41c11e7d +-- hash: 26d987cec9407756eea729c29352c63730c0bb4e5b469b0aeb02ed79e8bd99b3 name: galley-types version: 0.81.0 @@ -28,7 +28,6 @@ library Galley.Types.Conversations.Roles Galley.Types.Teams Galley.Types.Teams.Intra - Galley.Types.Teams.SearchVisibility other-modules: Paths_galley_types hs-source-dirs: diff --git a/libs/galley-types/src/Galley/Types.hs b/libs/galley-types/src/Galley/Types.hs index 1e3186d6d7..acb89729fe 100644 --- a/libs/galley-types/src/Galley/Types.hs +++ b/libs/galley-types/src/Galley/Types.hs @@ -20,82 +20,14 @@ module Galley.Types ( foldrOtrRecipients, Accept (..), - - -- * re-exports - ConversationMetadata (..), - Conversation (..), - cnvType, - cnvCreator, - cnvAccess, - cnvAccessRoles, - cnvName, - cnvTeam, - cnvMessageTimer, - cnvReceiptMode, - RemoteMember (..), - LocalMember (..), - ConvMembers (..), - OtherMember (..), - Connect (..), - NewOtrMessage (..), - ClientMismatch (..), - OtrRecipients (..), - OtrFilterMissing (..), - ConvTeamInfo (..), - ConversationCode (..), - mkConversationCode, - Event (..), - EventType (..), - EventData (..), - UserIdList (..), - QualifiedUserIdList (..), - SimpleMember (..), - SimpleMembers (..), - MemberUpdateData (..), - TypingData (..), - OtrMessage (..), - Access (..), - AccessRoleV2 (..), - AccessRoleLegacy (..), - ConversationList (..), - ConversationRename (..), - ConversationAccessData (..), - ConversationReceiptModeUpdate (..), - ConversationMessageTimerUpdate (..), - ConvType (..), - CustomBackend (..), - Invite (..), - NewConv (..), - MemberUpdate (..), - OtherMemberUpdate (..), - MutedStatus (..), - ReceiptMode (..), - Protocol (..), - ProtocolTag (..), - GroupId (..), - TypingStatus (..), - UserClientMap (..), - UserClients (..), - filterClients, - newInvite, - memberUpdate, ) where import Data.Aeson import Data.Id (ClientId, UserId) import qualified Data.Map.Strict as Map -import Galley.Types.Conversations.Members (LocalMember (..), RemoteMember (..)) import Imports -import Wire.API.Conversation hiding (Member (..)) -import Wire.API.Conversation.Code -import Wire.API.Conversation.Protocol -import Wire.API.Conversation.Typing -import Wire.API.CustomBackend -import Wire.API.Event.Conversation import Wire.API.Message -import Wire.API.User (UserIdList (..)) -import Wire.API.User.Client -------------------------------------------------------------------------------- -- Accept diff --git a/libs/galley-types/src/Galley/Types/Bot.hs b/libs/galley-types/src/Galley/Types/Bot.hs index f773cbcfd3..220f1b62df 100644 --- a/libs/galley-types/src/Galley/Types/Bot.hs +++ b/libs/galley-types/src/Galley/Types/Bot.hs @@ -29,23 +29,14 @@ module Galley.Types.Bot removeBot, rmBotConv, rmBotId, - - -- * re-exports - module Service, - BotConvView, - botConvView, - botConvId, - botConvName, - botConvMembers, ) where import Control.Lens (makeLenses) import Data.Aeson import Data.Id -import Galley.Types.Bot.Service as Service import Imports -import Wire.API.Provider.Bot (BotConvView, botConvId, botConvMembers, botConvName, botConvView) +import Wire.API.Provider.Service (ServiceRef) -- AddBot ---------------------------------------------------------------------- diff --git a/libs/galley-types/src/Galley/Types/Bot/Service.hs b/libs/galley-types/src/Galley/Types/Bot/Service.hs index 752cc212f7..2f557a1a25 100644 --- a/libs/galley-types/src/Galley/Types/Bot/Service.hs +++ b/libs/galley-types/src/Galley/Types/Bot/Service.hs @@ -26,13 +26,6 @@ module Galley.Types.Bot.Service serviceToken, serviceFingerprints, serviceEnabled, - - -- * re-exports - ServiceToken (..), - ServiceRef (..), - newServiceRef, - serviceRefId, - serviceRefProvider, ) where diff --git a/libs/galley-types/src/Galley/Types/Conversations/Roles.hs b/libs/galley-types/src/Galley/Types/Conversations/Roles.hs index 48788a8116..7c3f9bbe8e 100644 --- a/libs/galley-types/src/Galley/Types/Conversations/Roles.hs +++ b/libs/galley-types/src/Galley/Types/Conversations/Roles.hs @@ -22,19 +22,6 @@ module Galley.Types.Conversations.Roles ( isActionAllowed, roleNameToActions, - - -- * re-exports - ConversationRole, - convRoleWireAdmin, - convRoleWireMember, - wireConvRoles, - RoleName, - roleNameWireAdmin, - roleNameWireMember, - wireConvRoleNames, - Action (..), - Actions (..), - ConversationRolesList (..), ) where diff --git a/libs/galley-types/src/Galley/Types/Teams.hs b/libs/galley-types/src/Galley/Types/Teams.hs index 22aceff3e0..95b2262fe1 100644 --- a/libs/galley-types/src/Galley/Types/Teams.hs +++ b/libs/galley-types/src/Galley/Types/Teams.hs @@ -55,90 +55,6 @@ module Galley.Types.Teams permissionsRole, HiddenPerm (..), IsPerm (..), - - -- * re-exports - Team, - TeamBinding (..), - newTeam, - teamId, - teamCreator, - teamName, - teamIcon, - teamIconKey, - teamBinding, - teamSplashScreen, - TeamList, - newTeamList, - teamListTeams, - teamListHasMore, - TeamMember, - userId, - nUserId, - permissions, - nPermissions, - invitation, - nInvitation, - legalHoldStatus, - TeamMemberList, - TeamMemberListOptPerms, - ListType (..), - newTeamMemberList, - teamMembers, - teamMemberListType, - TeamConversation, - newTeamConversation, - conversationId, - TeamConversationList, - newTeamConversationList, - teamConversations, - Permissions, - newPermissions, - fullPermissions, - noPermissions, - serviceWhitelistPermissions, - self, - copy, - Perm (..), - SPerm (..), - permToInt, - permsToInt, - intToPerm, - intToPerms, - Role (..), - defaultRole, - BindingNewTeam (..), - NonBindingNewTeam (..), - NewTeam, - newNewTeam, - newTeamName, - newTeamIcon, - newTeamIconKey, - newTeamMembers, - NewTeamMember, - Event, - newEvent, - eventType, - eventTime, - eventTeam, - eventData, - EventType (..), - EventData (..), - TeamUpdateData, - newTeamUpdateData, - newTeamDeleteDataWithCode, - nameUpdate, - iconUpdate, - iconKeyUpdate, - splashScreenUpdate, - TeamMemberDeleteData, - tmdAuthPassword, - newTeamMemberDeleteData, - TeamDeleteData, - tdAuthPassword, - tdVerificationCode, - newTeamDeleteData, - HardTruncationLimit, - hardTruncationLimit, ) where @@ -153,9 +69,6 @@ import Data.String.Conversions (cs) import Imports import Test.QuickCheck (Arbitrary) import Wire.API.Error.Galley -import Wire.API.Event.Team -import Wire.API.Team -import Wire.API.Team.Conversation import Wire.API.Team.Feature import Wire.API.Team.Member import Wire.API.Team.Permission diff --git a/libs/galley-types/src/Galley/Types/Teams/Intra.hs b/libs/galley-types/src/Galley/Types/Teams/Intra.hs index a43a538c2b..44b1607978 100644 --- a/libs/galley-types/src/Galley/Types/Teams/Intra.hs +++ b/libs/galley-types/src/Galley/Types/Teams/Intra.hs @@ -32,11 +32,11 @@ import Data.Aeson.TH import qualified Data.Currency as Currency import Data.Json.Util import Data.Time (UTCTime) -import Galley.Types.Teams (Team) import Imports import Test.QuickCheck.Arbitrary (Arbitrary) import Wire.API.Arbitrary (GenericUniform (..)) import Wire.API.Message (UserClients) +import Wire.API.Team (Team) import Wire.API.Team.LegalHold (LegalholdProtectee) data TeamStatus diff --git a/libs/galley-types/src/Galley/Types/Teams/SearchVisibility.hs b/libs/galley-types/src/Galley/Types/Teams/SearchVisibility.hs deleted file mode 100644 index b6292bdf02..0000000000 --- a/libs/galley-types/src/Galley/Types/Teams/SearchVisibility.hs +++ /dev/null @@ -1,25 +0,0 @@ --- This file is part of the Wire Server implementation. --- --- Copyright (C) 2022 Wire Swiss GmbH --- --- This program is free software: you can redistribute it and/or modify it under --- the terms of the GNU Affero General Public License as published by the Free --- Software Foundation, either version 3 of the License, or (at your option) any --- later version. --- --- This program is distributed in the hope that it will be useful, but WITHOUT --- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS --- FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more --- details. --- --- You should have received a copy of the GNU Affero General Public License along --- with this program. If not, see . - -module Galley.Types.Teams.SearchVisibility - ( -- re-exports - TeamSearchVisibility (..), - TeamSearchVisibilityView (..), - ) -where - -import Wire.API.Team.SearchVisibility diff --git a/libs/galley-types/test/unit/Test/Galley/Types.hs b/libs/galley-types/test/unit/Test/Galley/Types.hs index 6cd120d350..1296c8779c 100644 --- a/libs/galley-types/test/unit/Test/Galley/Types.hs +++ b/libs/galley-types/test/unit/Test/Galley/Types.hs @@ -32,6 +32,8 @@ import Test.Tasty import Test.Tasty.HUnit import Test.Tasty.QuickCheck import Wire.API.Team.Feature as Public +import Wire.API.Team.Permission +import Wire.API.Team.Role tests :: TestTree tests = diff --git a/services/brig/src/Brig/API/Connection.hs b/services/brig/src/Brig/API/Connection.hs index da4a3dd5fc..3ab6c1b501 100644 --- a/services/brig/src/Brig/API/Connection.hs +++ b/services/brig/src/Brig/API/Connection.hs @@ -50,11 +50,11 @@ import Data.Proxy (Proxy (Proxy)) import Data.Qualified import Data.Range import qualified Data.UUID.V4 as UUID -import Galley.Types (ConvType (..), cnvType) import Imports import qualified System.Logger.Class as Log import System.Logger.Message import Wire.API.Connection (RelationWithHistory (..)) +import Wire.API.Conversation import Wire.API.Error import qualified Wire.API.Error.Brig as E import Wire.API.Routes.Public.Util (ResponseForExistedCreated (..)) diff --git a/services/brig/src/Brig/API/Internal.hs b/services/brig/src/Brig/API/Internal.hs index bc3d35f790..4131cf8277 100644 --- a/services/brig/src/Brig/API/Internal.hs +++ b/services/brig/src/Brig/API/Internal.hs @@ -66,7 +66,6 @@ import Data.Id as Id import qualified Data.Map.Strict as Map import Data.Qualified import qualified Data.Set as Set -import Galley.Types (UserClients (..)) import Imports hiding (head) import Network.HTTP.Types.Status import Network.Wai (Response) @@ -84,6 +83,7 @@ import Wire.API.Error import qualified Wire.API.Error.Brig as E import Wire.API.MLS.Credential import Wire.API.MLS.KeyPackage +import Wire.API.Message (UserClients (UserClients)) import Wire.API.Routes.Internal.Brig (NewKeyPackageRef) import qualified Wire.API.Routes.Internal.Brig as BrigIRoutes import Wire.API.Routes.Internal.Brig.Connection diff --git a/services/brig/src/Brig/API/User.hs b/services/brig/src/Brig/API/User.hs index 1bc356e8f8..dea0e980e9 100644 --- a/services/brig/src/Brig/API/User.hs +++ b/services/brig/src/Brig/API/User.hs @@ -163,8 +163,10 @@ import Wire.API.Error import qualified Wire.API.Error.Brig as E import Wire.API.Federation.Error import Wire.API.Routes.Internal.Brig.Connection +import Wire.API.Team hiding (newTeam) import Wire.API.Team.Feature (forgetLock) -import Wire.API.Team.Member (legalHoldStatus) +import Wire.API.Team.Member (TeamMember, legalHoldStatus) +import Wire.API.Team.Role import Wire.API.User data AllowSCIMUpdates @@ -364,7 +366,7 @@ createUser new = do ok <- lift . wrapClient $ Data.claimKey uk uid unless ok $ throwE RegisterErrorUserKeyExists - let minvmeta :: (Maybe (UserId, UTCTimeMillis), Team.Role) + let minvmeta :: (Maybe (UserId, UTCTimeMillis), Role) minvmeta = ((,inCreatedAt inv) <$> inCreatedBy inv, Team.inRole inv) added <- lift $ wrapHttp $ Intra.addTeamMember uid (Team.iiTeam ii) minvmeta unless added $ @@ -383,7 +385,7 @@ createUser new = do addUserToTeamSSO :: UserAccount -> TeamId -> UserIdentity -> ExceptT RegisterError (AppT r) CreateUserTeam addUserToTeamSSO account tid ident = do let uid = userId (accountUser account) - added <- lift $ wrapHttp $ Intra.addTeamMember uid tid (Nothing, Team.defaultRole) + added <- lift $ wrapHttp $ Intra.addTeamMember uid tid (Nothing, defaultRole) unless added $ throwE RegisterErrorTooManyTeamMembers lift $ do @@ -930,8 +932,8 @@ sendActivationCode emailOrPhone loc call = case emailOrPhone of -- user has 'userTeam' set, it must be binding. case mbTeam of Just team - | team ^. Team.teamCreator == uid -> - sendTeamActivationMail em name p loc' (team ^. Team.teamName) + | team ^. teamCreator == uid -> + sendTeamActivationMail em name p loc' (team ^. teamName) _otherwise -> sendActivationMail em name p loc' ident @@ -1350,7 +1352,7 @@ lookupLocalProfiles requestingUser others = do toMap :: [ConnectionStatus] -> Map UserId Relation toMap = Map.fromList . map (csFrom &&& csStatus) - getSelfInfo :: UserId -> m (Maybe (TeamId, Team.TeamMember)) + getSelfInfo :: UserId -> m (Maybe (TeamId, TeamMember)) getSelfInfo selfId = do -- FUTUREWORK: it is an internal error for the two lookups (for 'User' and 'TeamMember') -- to return 'Nothing'. we could throw errors here if that happens, rather than just @@ -1401,7 +1403,7 @@ getLegalHoldStatus' user = data EmailVisibility' = EmailVisibleIfOnTeam' - | EmailVisibleIfOnSameTeam' (Maybe (TeamId, Team.TeamMember)) + | EmailVisibleIfOnSameTeam' (Maybe (TeamId, TeamMember)) | EmailVisibleToSelf' -- | Gets the email if it's visible to the requester according to configured settings diff --git a/services/brig/src/Brig/Data/User.hs b/services/brig/src/Brig/Data/User.hs index be031475f5..f0416ab4ed 100644 --- a/services/brig/src/Brig/Data/User.hs +++ b/services/brig/src/Brig/Data/User.hs @@ -94,8 +94,8 @@ import Data.Qualified import Data.Range (fromRange) import Data.Time (addUTCTime) import Data.UUID.V4 -import Galley.Types.Bot import Imports +import Wire.API.Provider.Service import qualified Wire.API.Team.Feature as ApiFt import Wire.API.User.RichInfo diff --git a/services/brig/src/Brig/IO/Intra.hs b/services/brig/src/Brig/IO/Intra.hs index cf5a1d822e..cf678deb83 100644 --- a/services/brig/src/Brig/IO/Intra.hs +++ b/services/brig/src/Brig/IO/Intra.hs @@ -110,12 +110,10 @@ import Data.Qualified import Data.Range import qualified Data.Set as Set import GHC.TypeLits -import Galley.Types (Connect (..), Conversation) import Galley.Types.Conversations.Intra (UpsertOne2OneConversationRequest, UpsertOne2OneConversationResponse) import qualified Galley.Types.Teams as Team import Galley.Types.Teams.Intra (GuardLegalholdPolicyConflicts (GuardLegalholdPolicyConflicts)) import qualified Galley.Types.Teams.Intra as Team -import qualified Galley.Types.Teams.SearchVisibility as Team import Gundeck.Types.Push.V2 import qualified Gundeck.Types.Push.V2 as Push import Imports @@ -124,13 +122,20 @@ import Network.HTTP.Types.Status import qualified Network.Wai.Utilities.Error as Wai import System.Logger.Class as Log hiding (name, (.=)) import qualified System.Logger.Extended as ExLog +import Wire.API.Conversation +import Wire.API.Event.Conversation (Connect (Connect)) import Wire.API.Federation.API.Brig import Wire.API.Federation.Error import Wire.API.Message (UserClients) import Wire.API.Properties +import Wire.API.Team +import qualified Wire.API.Team.Conversation as Conv import Wire.API.Team.Feature import Wire.API.Team.LegalHold (LegalholdProtectee) import qualified Wire.API.Team.Member as Member +import qualified Wire.API.Team.Member as Team +import Wire.API.Team.Role +import Wire.API.Team.SearchVisibility ----------------------------------------------------------------------------- -- Event Handlers @@ -951,7 +956,7 @@ getTeamConv :: UserId -> TeamId -> ConvId -> - m (Maybe Team.TeamConversation) + m (Maybe Conv.TeamConversation) getTeamConv usr tid cnv = do debug $ remote "galley" @@ -1131,7 +1136,7 @@ addTeamMember :: ) => UserId -> TeamId -> - (Maybe (UserId, UTCTimeMillis), Team.Role) -> + (Maybe (UserId, UTCTimeMillis), Role) -> m Bool addTeamMember u tid (minvmeta, role) = do debug $ @@ -1161,10 +1166,10 @@ createTeam :: MonadLogger m ) => UserId -> - Team.BindingNewTeam -> + BindingNewTeam -> TeamId -> m CreateUserTeam -createTeam u t@(Team.BindingNewTeam bt) teamid = do +createTeam u t@(BindingNewTeam bt) teamid = do debug $ remote "galley" . msg (val "Creating Team") @@ -1173,7 +1178,7 @@ createTeam u t@(Team.BindingNewTeam bt) teamid = do maybe (error "invalid team id") pure $ fromByteString $ getHeader' "Location" r - pure (CreateUserTeam tid $ fromRange (bt ^. Team.newTeamName)) + pure (CreateUserTeam tid $ fromRange (bt ^. newTeamName)) where req tid = paths ["i", "teams", toByteString' tid] @@ -1360,9 +1365,9 @@ getTeamSearchVisibility :: HasRequestId m ) => TeamId -> - m Team.TeamSearchVisibility + m TeamSearchVisibility getTeamSearchVisibility tid = - coerce @Team.TeamSearchVisibilityView @Team.TeamSearchVisibility <$> do + coerce @TeamSearchVisibilityView @TeamSearchVisibility <$> do debug $ remote "galley" . msg (val "Get search visibility settings") galleyRequest GET req >>= decodeBody "galley" where diff --git a/services/brig/src/Brig/Provider/API.hs b/services/brig/src/Brig/Provider/API.hs index 367444b517..467f53ee05 100644 --- a/services/brig/src/Brig/Provider/API.hs +++ b/services/brig/src/Brig/Provider/API.hs @@ -49,7 +49,7 @@ import qualified Brig.Queue as Queue import Brig.Team.Util import Brig.Types.Client (Client (..), ClientType (..), newClient, newClientPrekeys) import Brig.Types.Intra (AccountStatus (..), UserAccount (..)) -import Brig.Types.Provider (AddBot (..), DeleteProvider (..), DeleteService (..), NewService (..), PasswordChange (..), Provider (..), ProviderLogin (..), Service (..), ServiceProfile (..), ServiceToken (..), UpdateBotPrekeys (..), UpdateProvider (..), UpdateService (..), UpdateServiceConn (..), UpdateServiceWhitelist (..)) +import Brig.Types.Provider (AddBot (..), DeleteProvider (..), PasswordChange (..), Provider (..), ProviderLogin (..), UpdateBotPrekeys (..), UpdateProvider (..)) import qualified Brig.Types.Provider.External as Ext import Brig.Types.User (HavePendingInvitations (..), ManagedBy (..), Name (..), Pict (..), User (..), defaultAccentId) import qualified Brig.ZAuth as ZAuth @@ -78,10 +78,6 @@ import qualified Data.Set as Set import qualified Data.Swagger.Build.Api as Doc import qualified Data.Text.Ascii as Ascii import qualified Data.Text.Encoding as Text -import Galley.Types -import Galley.Types.Bot (newServiceRef, serviceRefId, serviceRefProvider) -import Galley.Types.Conversations.Roles (roleNameWireAdmin) -import qualified Galley.Types.Teams as Teams import Imports import Network.HTTP.Types.Status import Network.Wai (Response) @@ -101,16 +97,20 @@ import qualified Ssl.Util as SSL import System.Logger.Class (MonadLogger) import UnliftIO.Async (pooledMapConcurrentlyN_) import qualified Web.Cookie as Cookie +import Wire.API.Conversation import qualified Wire.API.Conversation.Bot as Public +import Wire.API.Conversation.Role import Wire.API.Error import Wire.API.Error.Brig import qualified Wire.API.Event.Conversation as Public (Event) import qualified Wire.API.Provider as Public import qualified Wire.API.Provider.Bot as Public (BotUserView) +import Wire.API.Provider.Service import qualified Wire.API.Provider.Service as Public import qualified Wire.API.Provider.Service.Tag as Public import qualified Wire.API.Team.Feature as Feature import Wire.API.Team.LegalHold (LegalholdProtectee (UnprotectedBot)) +import Wire.API.Team.Permission import qualified Wire.API.User as Public (UserProfile, publicProfile) import qualified Wire.API.User.Client as Public (Client, ClientCapability (ClientSupportsLegalholdImplicitConsent), PubClient (..), UserClientPrekeyMap, UserClients, userClients) import qualified Wire.API.User.Client.Prekey as Public (PrekeyId) @@ -851,7 +851,7 @@ updateServiceWhitelist uid con tid upd = do sid = updateServiceWhitelistService upd newWhitelisted = updateServiceWhitelistStatus upd -- Preconditions - ensurePermissions uid tid (Set.toList Teams.serviceWhitelistPermissions) + ensurePermissions uid tid (Set.toList serviceWhitelistPermissions) _ <- wrapClientE (DB.lookupService pid sid) >>= maybeServiceNotFound -- Add to various tables whitelisted <- wrapClientE $ DB.getServiceWhitelistStatus tid pid sid diff --git a/services/brig/src/Brig/Provider/RPC.hs b/services/brig/src/Brig/Provider/RPC.hs index 2a26239f39..bcd371f415 100644 --- a/services/brig/src/Brig/Provider/RPC.hs +++ b/services/brig/src/Brig/Provider/RPC.hs @@ -44,8 +44,9 @@ import Data.Aeson import Data.ByteString.Conversion import Data.Id import qualified Data.List1 as List1 -import Galley.Types (Event) import qualified Galley.Types.Bot as Galley +import Galley.Types.Bot.Service (serviceEnabled) +import qualified Galley.Types.Bot.Service as Galley import Imports import qualified Network.HTTP.Client as Http import Network.HTTP.Types.Method @@ -54,6 +55,8 @@ import Ssl.Util (withVerifiedSslConnection) import System.Logger.Class (MonadLogger, field, msg, val, (~~)) import qualified System.Logger.Class as Log import URI.ByteString +import qualified Wire.API.Event.Conversation as Conv +import qualified Wire.API.Provider.Service as Galley -------------------------------------------------------------------------------- -- External RPC @@ -154,7 +157,7 @@ setServiceConn scon = do . expect2xx svc = Galley.newService ref url tok fps - & set Galley.serviceEnabled (sconEnabled scon) + & set serviceEnabled (sconEnabled scon) -- | Remove service connection information from galley. removeServiceConn :: @@ -191,7 +194,7 @@ addBotMember :: ClientId -> ProviderId -> ServiceId -> - (AppT r) Event + (AppT r) Conv.Event addBotMember zusr zcon conv bot clt pid sid = do Log.debug $ remote "galley" @@ -224,7 +227,7 @@ removeBotMember :: Maybe ConnId -> ConvId -> BotId -> - m (Maybe Event) + m (Maybe Conv.Event) removeBotMember zusr zcon conv bot = do Log.debug $ remote "galley" diff --git a/services/brig/src/Brig/Team/API.hs b/services/brig/src/Brig/Team/API.hs index 189c2e1245..aa116a134a 100644 --- a/services/brig/src/Brig/Team/API.hs +++ b/services/brig/src/Brig/Team/API.hs @@ -66,7 +66,11 @@ import qualified System.Logger.Class as Log import Util.Logging (logFunction, logTeam) import Wire.API.Error import qualified Wire.API.Error.Brig as E +import Wire.API.Team import qualified Wire.API.Team.Invitation as Public +import Wire.API.Team.Member (teamMembers, userId) +import Wire.API.Team.Permission (Perm (AddTeamMember)) +import Wire.API.Team.Role import qualified Wire.API.Team.Role as Public import qualified Wire.API.Team.Size as Public import qualified Wire.API.User as Public @@ -213,7 +217,7 @@ teamSizePublicH (_ ::: uid ::: tid) = json <$> teamSizePublic uid tid teamSizePublic :: UserId -> TeamId -> (Handler r) TeamSize teamSizePublic uid tid = do - ensurePermissions uid tid [Team.AddTeamMember] -- limit this to team admins to reduce risk of involuntary DOS attacks + ensurePermissions uid tid [AddTeamMember] -- limit this to team admins to reduce risk of involuntary DOS attacks teamSize tid teamSizeH :: JSON ::: TeamId -> (Handler r) Response @@ -255,7 +259,7 @@ data CreateInvitationInviter = CreateInvitationInviter createInvitationPublic :: UserId -> TeamId -> Public.InvitationRequest -> (Handler r) Public.Invitation createInvitationPublic uid tid body = do - let inviteeRole = fromMaybe Team.defaultRole . irRole $ body + let inviteeRole = fromMaybe defaultRole . irRole $ body inviter <- do let inviteePerms = Team.rolePermissions inviteeRole idt <- maybe (throwStd (errorToWai @'E.NoIdentity)) pure =<< lift (fetchUserIdentity uid) @@ -281,7 +285,7 @@ createInvitationViaScimH (_ ::: req) = do createInvitationViaScim :: NewUserScimInvitation -> (Handler r) UserAccount createInvitationViaScim newUser@(NewUserScimInvitation tid loc name email) = do env <- ask - let inviteeRole = Team.defaultRole + let inviteeRole = defaultRole fromEmail = env ^. emailSender invreq = InvitationRequest @@ -374,7 +378,7 @@ deleteInvitationH (_ ::: uid ::: tid ::: iid) = do deleteInvitation :: UserId -> TeamId -> InvitationId -> (Handler r) () deleteInvitation uid tid iid = do - ensurePermissions uid tid [Team.AddTeamMember] + ensurePermissions uid tid [AddTeamMember] lift $ wrapClient $ DB.deleteInvitation tid iid listInvitationsH :: JSON ::: UserId ::: TeamId ::: Maybe InvitationId ::: Range 1 500 Int32 -> (Handler r) Response @@ -383,7 +387,7 @@ listInvitationsH (_ ::: uid ::: tid ::: start ::: size) = do listInvitations :: UserId -> TeamId -> Maybe InvitationId -> Range 1 500 Int32 -> (Handler r) Public.InvitationList listInvitations uid tid start size = do - ensurePermissions uid tid [Team.AddTeamMember] + ensurePermissions uid tid [AddTeamMember] rs <- lift $ wrapClient $ DB.lookupInvitations tid start size pure $! Public.InvitationList (DB.resultList rs) (DB.resultHasMore rs) @@ -396,7 +400,7 @@ getInvitationH (_ ::: uid ::: tid ::: iid) = do getInvitation :: UserId -> TeamId -> InvitationId -> (Handler r) (Maybe Public.Invitation) getInvitation uid tid iid = do - ensurePermissions uid tid [Team.AddTeamMember] + ensurePermissions uid tid [AddTeamMember] lift $ wrapClient $ DB.lookupInvitation tid iid getInvitationByCodeH :: JSON ::: Public.InvitationCode -> (Handler r) Response @@ -453,9 +457,9 @@ unsuspendTeam tid = do changeTeamAccountStatuses :: TeamId -> AccountStatus -> (Handler r) () changeTeamAccountStatuses tid s = do team <- Team.tdTeam <$> lift (wrapHttp $ Intra.getTeam tid) - unless (team ^. Team.teamBinding == Team.Binding) $ + unless (team ^. teamBinding == Binding) $ throwStd noBindingTeam - uids <- toList1 =<< lift (fmap (view Team.userId) . view Team.teamMembers <$> wrapHttp (Intra.getTeamMembers tid)) + uids <- toList1 =<< lift (fmap (view userId) . view teamMembers <$> wrapHttp (Intra.getTeamMembers tid)) wrapHttpClientE (API.changeAccountStatus uids s) !>> accountStatusError where toList1 (x : xs) = pure $ List1.list1 x xs diff --git a/services/brig/src/Brig/Team/DB.hs b/services/brig/src/Brig/Team/DB.hs index 6a28ec19b8..4faae38828 100644 --- a/services/brig/src/Brig/Team/DB.hs +++ b/services/brig/src/Brig/Team/DB.hs @@ -52,12 +52,11 @@ import Data.Range import Data.Text.Ascii (encodeBase64Url) import Data.Time.Clock import Data.UUID.V4 -import Galley.Types.Teams (Role) -import qualified Galley.Types.Teams as Team import Imports import OpenSSL.Random (randBytes) import qualified System.Logger.Class as Log import UnliftIO.Async (pooledMapConcurrentlyN_) +import Wire.API.Team.Role mkInvitationCode :: IO InvitationCode mkInvitationCode = InvitationCode . encodeBase64Url <$> randBytes 24 @@ -243,4 +242,4 @@ toInvitation :: ) -> Invitation toInvitation (t, r, i, tm, minviter, e, inviteeName, p) = - Invitation t (fromMaybe Team.defaultRole r) i tm minviter e inviteeName p + Invitation t (fromMaybe defaultRole r) i tm minviter e inviteeName p diff --git a/services/brig/src/Brig/Team/Util.hs b/services/brig/src/Brig/Team/Util.hs index 56ff49e642..c5a442df12 100644 --- a/services/brig/src/Brig/Team/Util.hs +++ b/services/brig/src/Brig/Team/Util.hs @@ -26,6 +26,8 @@ import Data.Id import qualified Data.Set as Set import Galley.Types.Teams import Imports +import Wire.API.Team.Member +import Wire.API.Team.Permission ensurePermissions :: UserId -> TeamId -> [Perm] -> ExceptT Error (AppT r) () ensurePermissions u t perms = do diff --git a/services/brig/src/Brig/User/API/Search.hs b/services/brig/src/Brig/User/API/Search.hs index 50ab3490aa..c50cd46c11 100644 --- a/services/brig/src/Brig/User/API/Search.hs +++ b/services/brig/src/Brig/User/API/Search.hs @@ -43,7 +43,6 @@ import Data.Id import Data.Predicate import Data.Range import qualified Data.Swagger.Build.Api as Doc -import qualified Galley.Types.Teams.SearchVisibility as Team import Imports import Network.Wai (Response) import Network.Wai.Predicate hiding (setStatus) @@ -57,7 +56,7 @@ import qualified System.Logger.Class as Log import qualified Wire.API.Federation.API.Brig as FedBrig import qualified Wire.API.Federation.API.Brig as S import qualified Wire.API.Team.Permission as Public -import Wire.API.Team.SearchVisibility (TeamSearchVisibility) +import Wire.API.Team.SearchVisibility (TeamSearchVisibility (..)) import Wire.API.User.Search (FederatedUserSearchPolicy (FullSearch)) import qualified Wire.API.User.Search as Public @@ -173,8 +172,8 @@ searchLocally searcherId searchTerm maybeMaxResults = do } where handleTeamVisibility :: TeamId -> TeamSearchVisibility -> Search.TeamSearchInfo - handleTeamVisibility _ Team.SearchVisibilityStandard = Search.AllUsers - handleTeamVisibility t Team.SearchVisibilityNoNameOutsideTeam = Search.TeamOnly t + handleTeamVisibility _ SearchVisibilityStandard = Search.AllUsers + handleTeamVisibility t SearchVisibilityNoNameOutsideTeam = Search.TeamOnly t mkTeamSearchInfo :: Maybe TeamId -> (Handler r) TeamSearchInfo mkTeamSearchInfo searcherTeamId = lift $ do diff --git a/services/brig/test/integration/API/Provider.hs b/services/brig/test/integration/API/Provider.hs index 84e0041c92..7f3cd5815c 100644 --- a/services/brig/test/integration/API/Provider.hs +++ b/services/brig/test/integration/API/Provider.hs @@ -65,10 +65,6 @@ import Data.Time.Clock import Data.Timeout (TimedOut (..), Timeout, TimeoutUnit (..), (#)) import qualified Data.UUID as UUID import qualified Data.ZAuth.Token as ZAuth -import Galley.Types -import Galley.Types.Bot (ServiceRef, newServiceRef, serviceRefId, serviceRefProvider) -import Galley.Types.Conversations.Roles (roleNameWireAdmin) -import qualified Galley.Types.Teams as Team import Imports hiding (threadDelay) import Network.HTTP.Types.Status (status200, status201, status400) import Network.Wai (Application, responseLBS, strictRequestBody) @@ -86,10 +82,15 @@ import Test.Tasty.HUnit import Util import Web.Cookie (SetCookie (..), parseSetCookie) import Wire.API.Asset hiding (Asset) +import Wire.API.Conversation +import Wire.API.Conversation.Protocol +import Wire.API.Conversation.Role import Wire.API.Event.Conversation import Wire.API.Internal.Notification +import Wire.API.Provider.Service import Wire.API.Team.Feature (featureNameBS) import qualified Wire.API.Team.Feature as Public +import Wire.API.Team.Permission tests :: Domain -> Config -> Manager -> DB.ClientState -> Brig -> Cannon -> Galley -> IO TestTree tests dom conf p db b c g = do @@ -744,7 +745,7 @@ testWhitelistSearchPermissions _config _db brig galley = do const 403 === statusCode const (Just "insufficient-permissions") === fmap Error.label . responseJsonMaybe -- Check that team members with no permissions can search - member <- userId <$> Team.createTeamMember brig galley owner tid Team.noPermissions + member <- userId <$> Team.createTeamMember brig galley owner tid noPermissions listTeamServiceProfilesByPrefix brig member tid Nothing True 20 !!! const 200 === statusCode @@ -753,7 +754,7 @@ testWhitelistUpdatePermissions config db brig galley = do -- Create a team (owner, tid) <- Team.createUserWithTeam brig -- Create a team admin - let Just adminPermissions = Team.newPermissions Team.serviceWhitelistPermissions mempty + let Just adminPermissions = newPermissions serviceWhitelistPermissions mempty admin <- userId <$> Team.createTeamMember brig galley owner tid adminPermissions -- Create a service pid <- providerId <$> randomProvider db brig @@ -766,7 +767,7 @@ testWhitelistUpdatePermissions config db brig galley = do const 403 === statusCode const (Just "insufficient-permissions") === fmap Error.label . responseJsonMaybe -- Check that a member who's not a team admin also can't add it to the whitelist - _uid <- userId <$> Team.createTeamMember brig galley owner tid Team.noPermissions + _uid <- userId <$> Team.createTeamMember brig galley owner tid noPermissions updateServiceWhitelist brig _uid tid (UpdateServiceWhitelist pid sid True) !!! do const 403 === statusCode const (Just "insufficient-permissions") === fmap Error.label . responseJsonMaybe @@ -778,7 +779,7 @@ testSearchWhitelist :: Config -> DB.ClientState -> Brig -> Galley -> Http () testSearchWhitelist config db brig galley = do -- Create a team, a team owner, and a team member with no permissions (owner, tid) <- Team.createUserWithTeam brig - uid <- userId <$> Team.createTeamMember brig galley owner tid Team.noPermissions + uid <- userId <$> Team.createTeamMember brig galley owner tid noPermissions -- Create services and add them all to the whitelist pid <- providerId <$> randomProvider db brig uniq <- UUID.toText . toUUID <$> randomId @@ -2062,7 +2063,7 @@ prepareBotUsersTeam brig galley sref = do -- Prepare users (uid1, tid) <- Team.createUserWithTeam brig u1 <- selfUser <$> getSelfProfile brig uid1 - u2 <- Team.createTeamMember brig galley uid1 tid Team.fullPermissions + u2 <- Team.createTeamMember brig galley uid1 tid fullPermissions let uid2 = userId u2 h <- randomHandle putHandle brig uid1 h !!! const 200 === statusCode diff --git a/services/brig/test/integration/API/Search.hs b/services/brig/test/integration/API/Search.hs index 52d8cfe45f..d118eca6ff 100644 --- a/services/brig/test/integration/API/Search.hs +++ b/services/brig/test/integration/API/Search.hs @@ -51,7 +51,6 @@ import qualified Data.Text as Text import qualified Data.Text.Encoding as Text import qualified Database.Bloodhound as ES import Federation.Util -import qualified Galley.Types.Teams.SearchVisibility as Team import Imports import qualified Network.HTTP.Client as HTTP import Network.HTTP.ReverseProxy (waiProxyTo) @@ -70,6 +69,7 @@ import UnliftIO (Concurrently (..), async, bracket, cancel, runConcurrently) import Util import Wire.API.Federation.API.Brig (SearchResponse (SearchResponse)) import Wire.API.Team.Feature +import Wire.API.Team.SearchVisibility import Wire.API.User.Search (FederatedUserSearchPolicy (ExactHandleSearch, FullSearch)) import qualified Wire.API.User.Search as Search @@ -142,7 +142,7 @@ tests opts mgr galley brig = do prepareUsersForSearchVisibilityNoNameOutsideTeamTests = do (tidA, ownerA, (memberA : _)) <- createPopulatedBindingTeamWithNamesAndHandles brig 1 setTeamTeamSearchVisibilityAvailable galley tidA FeatureStatusEnabled - setTeamSearchVisibility galley tidA Team.SearchVisibilityNoNameOutsideTeam + setTeamSearchVisibility galley tidA SearchVisibilityNoNameOutsideTeam (tidB, ownerB, (memberB : _)) <- createPopulatedBindingTeamWithNamesAndHandles brig 1 regularUser <- randomUserWithHandle brig refreshIndex brig @@ -726,7 +726,7 @@ optsForOldIndex opts = do createIndexWithMapping :: MonadIO m => Opt.Opts -> Text -> Value -> m () createIndexWithMapping opts name val = do - let indexName = (ES.IndexName name) + let indexName = ES.IndexName name createReply <- runBH opts $ ES.createIndexWith [ES.AnalysisSetting analysisSettings] 1 indexName unless (ES.isCreated createReply || ES.isSuccess createReply) $ do liftIO $ assertFailure $ "failed to create index: " <> show name <> " with error: " <> show createReply diff --git a/services/brig/test/integration/API/Settings.hs b/services/brig/test/integration/API/Settings.hs index 5f062f1bbe..05e0280ee6 100644 --- a/services/brig/test/integration/API/Settings.hs +++ b/services/brig/test/integration/API/Settings.hs @@ -36,6 +36,8 @@ import Imports import Test.Tasty hiding (Timeout) import Test.Tasty.HUnit import Util +import Wire.API.Team.Permission +import Wire.API.Team.Role tests :: Opts -> Manager -> Brig -> Galley -> IO TestTree tests defOpts manager brig galley = pure $ do @@ -164,11 +166,11 @@ setup :: Brig -> Galley -> ViewingUserIs -> Http (UserId, User, User, User) setup brig galley viewingUserIs = do (creatorId, tid) <- createUserWithTeam brig (otherTeamCreatorId, otherTid) <- createUserWithTeam brig - userA <- createTeamMember brig galley creatorId tid Team.fullPermissions - userB <- createTeamMember brig galley otherTeamCreatorId otherTid Team.fullPermissions + userA <- createTeamMember brig galley creatorId tid fullPermissions + userB <- createTeamMember brig galley otherTeamCreatorId otherTid fullPermissions nonTeamUser <- createUser "joe" brig viewerId <- case viewingUserIs of Creator -> pure creatorId - Member -> userId <$> createTeamMember brig galley creatorId tid (Team.rolePermissions Team.RoleOwner) - Guest -> userId <$> createTeamMember brig galley creatorId tid (Team.rolePermissions Team.RoleExternalPartner) + Member -> userId <$> createTeamMember brig galley creatorId tid (Team.rolePermissions RoleOwner) + Guest -> userId <$> createTeamMember brig galley creatorId tid (Team.rolePermissions RoleExternalPartner) pure (viewerId, userA, userB, nonTeamUser) diff --git a/services/brig/test/integration/API/Team.hs b/services/brig/test/integration/API/Team.hs index dfc02eeb6d..40af73e495 100644 --- a/services/brig/test/integration/API/Team.hs +++ b/services/brig/test/integration/API/Team.hs @@ -58,6 +58,11 @@ import Util import Util.AWS as Util import Web.Cookie (parseSetCookie, setCookieName) import Wire.API.Asset +import Wire.API.Team hiding (newTeam) +import Wire.API.Team.Member hiding (invitation, userId) +import qualified Wire.API.Team.Member as Member +import Wire.API.Team.Permission +import Wire.API.Team.Role import Wire.API.User.Identity (mkSimpleSampleUref) newtype TeamSizeLimit = TeamSizeLimit Word32 @@ -245,13 +250,13 @@ testInvitationRoles brig galley = do -- owner creates a member alice. alice :: UserId <- do aliceEmail <- randomEmail - let invite = stdInvitationRequest' Nothing (Just Team.RoleAdmin) aliceEmail + let invite = stdInvitationRequest' Nothing (Just RoleAdmin) aliceEmail inv :: Invitation <- responseJsonError =<< postInvitation brig tid owner invite registerInvite brig tid inv aliceEmail -- alice creates a external partner bob. success! bob only has externalPartner perms. do bobEmail <- randomEmail - let invite = stdInvitationRequest' Nothing (Just Team.RoleExternalPartner) bobEmail + let invite = stdInvitationRequest' Nothing (Just RoleExternalPartner) bobEmail inv :: Invitation <- responseJsonError =<< ( postInvitation brig tid alice invite app invitationHandshake -- Verify that the user is part of the team mem <- getTeamMember invitee tid galley - liftIO $ assertEqual "Member not part of the team" invitee (mem ^. Team.userId) - liftIO $ assertEqual "Member has no/wrong invitation metadata" invmeta (mem ^. Team.invitation) + liftIO $ assertEqual "Member not part of the team" invitee (mem ^. Member.userId) + liftIO $ assertEqual "Member has no/wrong invitation metadata" invmeta (mem ^. Member.invitation) conns <- listConnections invitee brig liftIO $ assertBool "User should have no connections" (null (clConnections conns) && not (clHasMore conns)) pure (responseJsonMaybe rsp2, invitation) @@ -383,18 +388,18 @@ testCreateTeam brig galley aws = do usr <- responseJsonError =<< register email newTeam brig let uid = userId usr -- Verify that the user is part of exactly one (binding) team - teams <- view Team.teamListTeams <$> getTeams uid galley + teams <- view teamListTeams <$> getTeams uid galley liftIO $ assertBool "User not part of exactly one team" (length teams == 1) let team = fromMaybe (error "No team??") $ listToMaybe teams - liftIO $ assertBool "Team not binding" (team ^. Team.teamBinding == Team.Binding) - mem <- getTeamMember uid (team ^. Team.teamId) galley - liftIO $ assertBool "Member not part of the team" (uid == mem ^. Team.userId) + liftIO $ assertBool "Team not binding" (team ^. teamBinding == Binding) + mem <- getTeamMember uid (team ^. teamId) galley + liftIO $ assertBool "Member not part of the team" (uid == mem ^. Member.userId) -- Verify that the user cannot send invitations before activating their account inviteeEmail <- randomEmail let invite = stdInvitationRequest inviteeEmail - postInvitation brig (team ^. Team.teamId) uid invite !!! const 403 === statusCode + postInvitation brig (team ^. teamId) uid invite !!! const 403 === statusCode -- Verify that the team is still in status "pending" - team2 <- getTeam galley (team ^. Team.teamId) + team2 <- getTeam galley (team ^. teamId) liftIO $ assertEqual "status" Team.PendingActive (Team.tdStatus team2) -- Activate account act <- getActivationCode brig (Left email) @@ -403,7 +408,7 @@ testCreateTeam brig galley aws = do Just kc -> activate brig kc !!! const 200 === statusCode liftIO $ Util.assertUserJournalQueue "user activate" aws (userActivateJournaled usr) -- Verify that Team has status Active now - team3 <- getTeam galley (team ^. Team.teamId) + team3 <- getTeam galley (team ^. teamId) liftIO $ assertEqual "status" Team.Active (Team.tdStatus team3) testCreateTeamPreverified :: Brig -> Galley -> AWS.Env -> Http () @@ -417,18 +422,18 @@ testCreateTeamPreverified brig galley aws = do usr <- responseJsonError =<< register' email newTeam c brig getTeams uid galley + teams <- view teamListTeams <$> getTeams uid galley liftIO $ assertBool "User not part of exactly one team" (length teams == 1) let team = fromMaybe (error "No team??") $ listToMaybe teams - liftIO $ assertBool "Team not binding" (team ^. Team.teamBinding == Team.Binding) - mem <- getTeamMember uid (team ^. Team.teamId) galley - liftIO $ assertBool "Member not part of the team" (uid == mem ^. Team.userId) - team2 <- getTeam galley (team ^. Team.teamId) + liftIO $ assertBool "Team not binding" (team ^. teamBinding == Binding) + mem <- getTeamMember uid (team ^. teamId) galley + liftIO $ assertBool "Member not part of the team" (uid == mem ^. Member.userId) + team2 <- getTeam galley (team ^. teamId) liftIO $ assertEqual "Team should already be active" Team.Active (Team.tdStatus team2) -- Verify that the user can already send invitations before activating their account inviteeEmail <- randomEmail let invite = stdInvitationRequest inviteeEmail - postInvitation brig (team ^. Team.teamId) uid invite !!! const 201 === statusCode + postInvitation brig (team ^. teamId) uid invite !!! const 201 === statusCode testInvitationNoPermission :: Brig -> Http () testInvitationNoPermission brig = do @@ -532,7 +537,7 @@ testInvitationMutuallyExclusive brig = do req :: Email -> Maybe InvitationCode -> - Maybe Team.BindingNewTeam -> + Maybe BindingNewTeam -> Maybe InvitationCode -> HttpT IO (Response (Maybe LByteString)) req e c t i = @@ -555,7 +560,7 @@ testInvitationTooManyMembers :: Brig -> Galley -> TeamSizeLimit -> Http () testInvitationTooManyMembers brig galley (TeamSizeLimit limit) = do (creator, tid) <- createUserWithTeam brig pooledForConcurrentlyN_ 16 [1 .. limit -1] $ \_ -> do - void $ createTeamMember brig galley creator tid Team.fullPermissions + void $ createTeamMember brig galley creator tid fullPermissions SearchUtil.refreshIndex brig let invite email = stdInvitationRequest email email <- randomEmail @@ -696,20 +701,20 @@ testDeleteTeamUser brig galley = do const (Just "no-self-delete-for-team-owner") === fmap Error.label . responseJsonMaybe -- We need to invite another user to a full permission member invitee <- userId <$> inviteAndRegisterUser creator tid brig - updatePermissions creator tid (invitee, Team.fullPermissions) galley + updatePermissions creator tid (invitee, fullPermissions) galley -- Still cannot delete, must be demoted first deleteUser creator (Just defPassword) brig !!! do const 403 === statusCode const (Just "no-self-delete-for-team-owner") === fmap Error.label . responseJsonMaybe -- Demote creator - updatePermissions invitee tid (creator, Team.rolePermissions Team.RoleAdmin) galley + updatePermissions invitee tid (creator, Team.rolePermissions RoleAdmin) galley -- Now the creator can delete the account deleteUser creator (Just defPassword) brig !!! const 200 === statusCode -- The new full permission member cannot deleteUser invitee (Just defPassword) brig !!! const 403 === statusCode -- We can still invite new users who can delete their account only if they are not an owner inviteeFull <- userId <$> inviteAndRegisterUser invitee tid brig - updatePermissions invitee tid (inviteeFull, Team.fullPermissions) galley + updatePermissions invitee tid (inviteeFull, fullPermissions) galley deleteUser inviteeFull (Just defPassword) brig !!! do const 403 === statusCode const (Just "no-self-delete-for-team-owner") === fmap Error.label . responseJsonMaybe @@ -736,7 +741,7 @@ testSSOIsTeamOwner brig galley = do check expect2xx creator check expect4xx stranger check expect4xx invitee - updatePermissions creator tid (invitee, Team.fullPermissions) galley + updatePermissions creator tid (invitee, fullPermissions) galley check expect2xx invitee testConnectionSameTeam :: Brig -> Http () @@ -803,17 +808,17 @@ testDeleteUserSSO brig galley = do deleteUser user1 (Just defPassword) brig !!! const 200 === statusCode -- create sso user with email Just (userId -> creator') <- mkuser True - updatePermissions creator tid (creator', Team.fullPermissions) galley + updatePermissions creator tid (creator', fullPermissions) galley -- demote and delete creator, but cannot do it for second owner yet (as someone needs to demote them) - updatePermissions creator' tid (creator, Team.rolePermissions Team.RoleMember) galley + updatePermissions creator' tid (creator, Team.rolePermissions RoleMember) galley deleteUser creator (Just defPassword) brig !!! const 200 === statusCode -- create sso user without email, make an owner Just (userId -> user3) <- mkuser False - updatePermissions creator' tid (user3, Team.fullPermissions) galley + updatePermissions creator' tid (user3, fullPermissions) galley -- can't delete herself, even without email deleteUser user3 (Just defPassword) brig !!! const 403 === statusCode -- delete second owner now, we don't enforce existence of emails in the backend - updatePermissions user3 tid (creator', Team.rolePermissions Team.RoleMember) galley + updatePermissions user3 tid (creator', Team.rolePermissions RoleMember) galley deleteUser creator' (Just defPassword) brig !!! const 200 === statusCode -- TODO: diff --git a/services/brig/test/integration/API/Team/Util.hs b/services/brig/test/integration/API/Team/Util.hs index 21c38d22e9..8fc768faa5 100644 --- a/services/brig/test/integration/API/Team/Util.hs +++ b/services/brig/test/integration/API/Team/Util.hs @@ -36,20 +36,22 @@ import Data.Misc (Milliseconds) import Data.Range import qualified Data.Set as Set import qualified Data.Text.Encoding as T -import Galley.Types -import Galley.Types.Conversations.Roles (roleNameWireAdmin) -import qualified Galley.Types.Teams as Team import qualified Galley.Types.Teams.Intra as Team -import qualified Galley.Types.Teams.SearchVisibility as Team import Imports import qualified Network.Wai.Utilities.Error as Error import Test.Tasty.HUnit import Util import Web.Cookie (parseSetCookie, setCookieName) -import Wire.API.Team (Icon (..)) +import Wire.API.Conversation +import Wire.API.Conversation.Protocol +import Wire.API.Conversation.Role +import Wire.API.Team hiding (newTeam) import Wire.API.Team.Feature (FeatureStatus (..)) import qualified Wire.API.Team.Feature as Public import qualified Wire.API.Team.Member as Member +import Wire.API.Team.Permission +import Wire.API.Team.Role +import Wire.API.Team.SearchVisibility import qualified Wire.API.User as Public -- | FUTUREWORK: Remove 'createPopulatedBindingTeam', 'createPopulatedBindingTeamWithNames', @@ -160,7 +162,7 @@ createTeamMember :: -- | Team where the new user will be created TeamId -> -- | Permissions that the new user will have - Team.Permissions -> + Permissions -> Http User createTeamMember brig galley owner tid perm = do user <- inviteAndRegisterUser owner tid brig @@ -194,7 +196,7 @@ inviteAndRegisterUser u tid brig = do liftIO $ assertEqual "Team ID in self profile and team table do not match" selfTeam (Just tid) pure invitee -updatePermissions :: HasCallStack => UserId -> TeamId -> (UserId, Team.Permissions) -> Galley -> Http () +updatePermissions :: HasCallStack => UserId -> TeamId -> (UserId, Permissions) -> Galley -> Http () updatePermissions from tid (to, perm) galley = put ( galley @@ -246,7 +248,7 @@ deleteTeam g tid u = do . paths ["teams", toByteString' tid] . zUser u . zConn "conn" - . json (Team.newTeamDeleteData $ Just Util.defPassword) + . json (newTeamDeleteData $ Just Util.defPassword) ) !!! const 202 === statusCode @@ -255,7 +257,7 @@ getTeams :: (MonadIO m, MonadCatch m, MonadHttp m, HasCallStack) => UserId -> Galley -> - m Team.TeamList + m TeamList getTeams u galley = responseJsonError =<< get @@ -265,8 +267,8 @@ getTeams u galley = . expect2xx ) -newTeam :: Team.BindingNewTeam -newTeam = Team.BindingNewTeam $ Team.newNewTeam (unsafeRange "teamName") DefaultIcon +newTeam :: BindingNewTeam +newTeam = BindingNewTeam $ newNewTeam (unsafeRange "teamName") DefaultIcon putLegalHoldEnabled :: HasCallStack => TeamId -> FeatureStatus -> Galley -> Http () putLegalHoldEnabled tid enabled g = do @@ -310,7 +312,7 @@ extAccept email name phone phoneCode code = "team_code" .= code ] -register :: Email -> Team.BindingNewTeam -> Brig -> Http (Response (Maybe LByteString)) +register :: Email -> BindingNewTeam -> Brig -> Http (Response (Maybe LByteString)) register e t brig = post ( brig . path "/register" . contentJson @@ -325,7 +327,7 @@ register e t brig = ) ) -register' :: Email -> Team.BindingNewTeam -> ActivationCode -> Brig -> Http (Response (Maybe LByteString)) +register' :: Email -> BindingNewTeam -> ActivationCode -> Brig -> Http (Response (Maybe LByteString)) register' e t c brig = post ( brig . path "/register" . contentJson @@ -431,7 +433,7 @@ isActivatedUser uid brig = do stdInvitationRequest :: Email -> InvitationRequest stdInvitationRequest = stdInvitationRequest' Nothing Nothing -stdInvitationRequest' :: Maybe Locale -> Maybe Team.Role -> Email -> InvitationRequest +stdInvitationRequest' :: Maybe Locale -> Maybe Role -> Email -> InvitationRequest stdInvitationRequest' loc role email = InvitationRequest loc role Nothing email Nothing @@ -446,13 +448,13 @@ setTeamTeamSearchVisibilityAvailable galley tid status = !!! do const 200 === statusCode -setTeamSearchVisibility :: HasCallStack => Galley -> TeamId -> Team.TeamSearchVisibility -> Http () +setTeamSearchVisibility :: HasCallStack => Galley -> TeamId -> TeamSearchVisibility -> Http () setTeamSearchVisibility galley tid typ = put ( galley . paths ["i/teams", toByteString' tid, "search-visibility"] . contentJson - . body (RequestBodyLBS . encode $ Team.TeamSearchVisibilityView typ) + . body (RequestBodyLBS . encode $ TeamSearchVisibilityView typ) ) !!! do const 204 === statusCode diff --git a/services/brig/test/integration/API/User/Account.hs b/services/brig/test/integration/API/User/Account.hs index 2b76f3f353..51704bd421 100644 --- a/services/brig/test/integration/API/User/Account.hs +++ b/services/brig/test/integration/API/User/Account.hs @@ -65,7 +65,6 @@ import qualified Data.UUID.V4 as UUID import Data.Vector (Vector) import qualified Data.Vector as Vec import Federator.MockServer (FederatedRequest (..), MockException (..)) -import Galley.Types.Teams (noPermissions) import Imports hiding (head) import qualified Imports import qualified Network.HTTP.Types as HTTP @@ -88,6 +87,7 @@ import qualified Wire.API.Federation.API.Brig as FedBrig import Wire.API.Federation.API.Common (EmptyResponse (EmptyResponse)) import Wire.API.Internal.Notification import Wire.API.Team.Invitation (Invitation (inInvitation)) +import Wire.API.Team.Permission hiding (self) import Wire.API.User (ListUsersQuery (..)) import Wire.API.User.Identity (mkSampleUref, mkSimpleSampleUref) diff --git a/services/brig/test/integration/API/User/Connection.hs b/services/brig/test/integration/API/User/Connection.hs index 555f9e576f..fa476f0919 100644 --- a/services/brig/test/integration/API/User/Connection.hs +++ b/services/brig/test/integration/API/User/Connection.hs @@ -37,13 +37,13 @@ import Data.Json.Util (UTCTimeMillis, toUTCTimeMillis) import Data.Qualified import Data.Time.Clock (getCurrentTime) import qualified Data.UUID.V4 as UUID -import Galley.Types import Imports import qualified Network.Wai.Utilities.Error as Error import Test.Tasty hiding (Timeout) import Test.Tasty.HUnit import Util import Wire.API.Connection +import Wire.API.Conversation import Wire.API.Federation.API.Brig import Wire.API.Federation.API.Galley (GetConversationsRequest (..), GetConversationsResponse (gcresConvs), RemoteConvMembers (rcmOthers), RemoteConversation (rcnvMembers)) import Wire.API.Federation.Component diff --git a/services/brig/test/integration/API/User/Handles.hs b/services/brig/test/integration/API/User/Handles.hs index c596b1491c..2be2280e58 100644 --- a/services/brig/test/integration/API/User/Handles.hs +++ b/services/brig/test/integration/API/User/Handles.hs @@ -37,7 +37,6 @@ import Data.Id hiding (client) import qualified Data.List1 as List1 import Data.Qualified (Qualified (..)) import qualified Data.UUID as UUID -import qualified Galley.Types.Teams.SearchVisibility as Team import Imports import qualified Network.Wai.Utilities.Error as Error import qualified Network.Wai.Utilities.Error as Wai @@ -49,6 +48,7 @@ import UnliftIO (mapConcurrently) import Util import Wire.API.Internal.Notification hiding (target) import Wire.API.Team.Feature (FeatureStatus (..)) +import Wire.API.Team.SearchVisibility tests :: ConnectionLimit -> Opt.Timeout -> Opt.Opts -> Manager -> Brig -> Cannon -> Galley -> TestTree tests _cl _at conf p b c g = @@ -220,7 +220,7 @@ testHandleQuerySearchVisibilityNoNameOutsideTeam _opts brig galley = do (_, owner2, [member2]) <- createPopulatedBindingTeamWithNamesAndHandles brig 1 extern <- randomUserWithHandle brig setTeamTeamSearchVisibilityAvailable galley tid1 FeatureStatusEnabled - setTeamSearchVisibility galley tid1 Team.SearchVisibilityNoNameOutsideTeam + setTeamSearchVisibility galley tid1 SearchVisibilityNoNameOutsideTeam -- this is the same as in 'testHandleQuerySearchVisibilityStandard' above, because we search -- for handles, not names. assertCanFind brig owner1 owner2 diff --git a/services/brig/test/integration/API/User/RichInfo.hs b/services/brig/test/integration/API/User/RichInfo.hs index 66c8b9b247..11f9f05748 100644 --- a/services/brig/test/integration/API/User/RichInfo.hs +++ b/services/brig/test/integration/API/User/RichInfo.hs @@ -31,11 +31,11 @@ import Brig.Types import qualified Data.CaseInsensitive as CI import qualified Data.List1 as List1 import qualified Data.Text as Text -import qualified Galley.Types.Teams as Team import Imports import Test.Tasty hiding (Timeout) import Test.Tasty.HUnit import Util +import Wire.API.Team.Permission import Wire.API.User.RichInfo tests :: ConnectionLimit -> Opt.Timeout -> Opt.Opts -> Manager -> Brig -> Cannon -> Galley -> TestTree @@ -56,8 +56,8 @@ testDefaultRichInfo :: Brig -> Galley -> Http () testDefaultRichInfo brig galley = do -- Create a team with two users (owner, tid) <- createUserWithTeam brig - member1 <- userId <$> createTeamMember brig galley owner tid Team.noPermissions - member2 <- userId <$> createTeamMember brig galley owner tid Team.noPermissions + member1 <- userId <$> createTeamMember brig galley owner tid noPermissions + member2 <- userId <$> createTeamMember brig galley owner tid noPermissions -- The first user should see the second user's rich info and it should be empty richInfo <- getRichInfo brig member1 member2 liftIO $ @@ -69,8 +69,8 @@ testDefaultRichInfo brig galley = do testDeleteMissingFieldsInUpdates :: Brig -> Galley -> Http () testDeleteMissingFieldsInUpdates brig galley = do (owner, tid) <- createUserWithTeam brig - member1 <- userId <$> createTeamMember brig galley owner tid Team.noPermissions - member2 <- userId <$> createTeamMember brig galley owner tid Team.noPermissions + member1 <- userId <$> createTeamMember brig galley owner tid noPermissions + member2 <- userId <$> createTeamMember brig galley owner tid noPermissions let superset = mkRichInfoAssocList [ RichField "department" "blue", @@ -88,8 +88,8 @@ testDeleteMissingFieldsInUpdates brig galley = do testDeleteEmptyFields :: Brig -> Galley -> Http () testDeleteEmptyFields brig galley = do (owner, tid) <- createUserWithTeam brig - member1 <- userId <$> createTeamMember brig galley owner tid Team.noPermissions - member2 <- userId <$> createTeamMember brig galley owner tid Team.noPermissions + member1 <- userId <$> createTeamMember brig galley owner tid noPermissions + member2 <- userId <$> createTeamMember brig galley owner tid noPermissions let withEmpty = mkRichInfoAssocList [ RichField "department" "" diff --git a/services/brig/test/integration/API/UserPendingActivation.hs b/services/brig/test/integration/API/UserPendingActivation.hs index b42b51868a..c8586028bd 100644 --- a/services/brig/test/integration/API/UserPendingActivation.hs +++ b/services/brig/test/integration/API/UserPendingActivation.hs @@ -45,7 +45,6 @@ import Data.String.Conversions (cs) import Data.Text.Encoding (encodeUtf8) import qualified Data.UUID as UUID import qualified Data.UUID.V4 as UUID -import qualified Galley.Types.Teams as Galley import Imports import qualified SAML2.WebSSO as SAML import Spar.Scim (CreateScimTokenResponse (..), SparTag, userSchemas) @@ -64,7 +63,7 @@ import qualified Web.Scim.Schema.Meta as Scim import qualified Web.Scim.Schema.User as Scim.User import qualified Web.Scim.Schema.User.Email as Email import qualified Web.Scim.Schema.User.Phone as Phone -import Wire.API.Team (Icon (..)) +import Wire.API.Team hiding (newTeam) import Wire.API.User.RichInfo (RichInfo) import Wire.API.User.Scim (CreateScimToken (..), ScimToken, ScimUserExtra (ScimUserExtra)) @@ -151,8 +150,8 @@ getInvitationByEmail brig email = Brig -> Galley -> m (UserId, TeamId) createUserWithTeamDisableSSO brg gly = do @@ -168,9 +167,9 @@ createUserWithTeamDisableSSO brg gly = do ] bdy <- selfUser . responseJsonUnsafe <$> post (brg . path "/i/users" . contentJson . body p) let (uid, Just tid) = (Brig.userId bdy, Brig.userTeam bdy) - (team : _) <- (^. Galley.teamListTeams) <$> getTeams uid gly + (team : _) <- (^. teamListTeams) <$> getTeams uid gly () <- - Control.Exception.assert {- "Team ID in registration and team table do not match" -} (tid == team ^. Galley.teamId) $ + Control.Exception.assert {- "Team ID in registration and team table do not match" -} (tid == team ^. teamId) $ pure () selfTeam <- Brig.userTeam . Brig.selfUser <$> getSelfProfile brg uid () <- diff --git a/services/brig/test/integration/Federation/Util.hs b/services/brig/test/integration/Federation/Util.hs index 281d66154e..282f29143f 100644 --- a/services/brig/test/integration/Federation/Util.hs +++ b/services/brig/test/integration/Federation/Util.hs @@ -46,7 +46,6 @@ import qualified Database.Bloodhound as ES import qualified Federator.MockServer as Mock import Foreign.C.Error (Errno (..), eCONNREFUSED) import GHC.IO.Exception (IOException (ioe_errno)) -import qualified Galley.Types.Teams.SearchVisibility as Team import Imports import qualified Network.HTTP.Client as HTTP import Network.HTTP.Media diff --git a/services/brig/test/integration/Util.hs b/services/brig/test/integration/Util.hs index 8b52773df2..3ffbd2b6c9 100644 --- a/services/brig/test/integration/Util.hs +++ b/services/brig/test/integration/Util.hs @@ -76,7 +76,6 @@ import qualified Data.UUID.V4 as UUID import qualified Federator.MockServer as Mock import GHC.TypeLits import Galley.Types.Conversations.One2One (one2OneConvId) -import qualified Galley.Types.Teams as Team import Imports import qualified Network.HTTP.Client as HTTP import Network.HTTP.Media.MediaType @@ -114,6 +113,7 @@ import Wire.API.Federation.API import Wire.API.Federation.Domain import Wire.API.Internal.Notification import Wire.API.Routes.MultiTablePaging +import Wire.API.Team.Member hiding (userId) import Wire.API.VersionInfo type Brig = Request -> Request @@ -655,7 +655,7 @@ getTeamMember :: UserId -> TeamId -> Galley -> - m Team.TeamMember + m TeamMember getTeamMember u tid galley = responseJsonError =<< get diff --git a/services/galley/migrate-data/src/V1_BackfillBillingTeamMembers.hs b/services/galley/migrate-data/src/V1_BackfillBillingTeamMembers.hs index fe6b29af55..43cd385c8a 100644 --- a/services/galley/migrate-data/src/V1_BackfillBillingTeamMembers.hs +++ b/services/galley/migrate-data/src/V1_BackfillBillingTeamMembers.hs @@ -25,9 +25,9 @@ import qualified Data.Conduit.List as C import Data.Id import qualified Data.Set as Set import Galley.DataMigration.Types -import Galley.Types.Teams import Imports import qualified System.Logger.Class as Log +import Wire.API.Team.Permission migration :: Migration migration = diff --git a/services/galley/src/Galley/API/Create.hs b/services/galley/src/Galley/API/Create.hs index d577dc5585..17e2ee5edf 100644 --- a/services/galley/src/Galley/API/Create.hs +++ b/services/galley/src/Galley/API/Create.hs @@ -53,7 +53,7 @@ import qualified Galley.Effects.TeamStore as E import Galley.Intra.Push import Galley.Options import Galley.Types.Conversations.Members -import Galley.Types.Teams (ListType (..), Perm (..), TeamBinding (Binding), notTeamMember) +import Galley.Types.Teams (notTeamMember) import Galley.Types.ToUserRole import Galley.Types.UserList import Galley.Validation @@ -70,7 +70,10 @@ import Wire.API.Event.Conversation import Wire.API.Federation.Error import Wire.API.Routes.Public.Galley (ConversationResponse) import Wire.API.Routes.Public.Util +import Wire.API.Team import Wire.API.Team.LegalHold (LegalholdProtectee (LegalholdPlusFederationNotImplemented)) +import Wire.API.Team.Member +import Wire.API.Team.Permission hiding (self) ---------------------------------------------------------------------------- -- Group conversations diff --git a/services/galley/src/Galley/API/CustomBackend.hs b/services/galley/src/Galley/API/CustomBackend.hs index 1d594dec8e..596102ab71 100644 --- a/services/galley/src/Galley/API/CustomBackend.hs +++ b/services/galley/src/Galley/API/CustomBackend.hs @@ -27,13 +27,13 @@ import Data.Domain (Domain) import Galley.API.Util import Galley.Effects.CustomBackendStore import Galley.Effects.WaiRoutes -import Galley.Types import Imports hiding ((\\)) import Network.HTTP.Types import Network.Wai import Network.Wai.Predicate hiding (Error, setStatus) import Network.Wai.Utilities hiding (Error) import Polysemy +import Wire.API.CustomBackend import qualified Wire.API.CustomBackend as Public import Wire.API.Error import Wire.API.Error.Galley diff --git a/services/galley/src/Galley/API/Internal.hs b/services/galley/src/Galley/API/Internal.hs index bcaac0873e..81bde9a548 100644 --- a/services/galley/src/Galley/API/Internal.hs +++ b/services/galley/src/Galley/API/Internal.hs @@ -65,13 +65,11 @@ import qualified Galley.Intra.Push as Intra import Galley.Monad import Galley.Options import qualified Galley.Queue as Q -import Galley.Types import Galley.Types.Bot (AddBot, RemoveBot) import Galley.Types.Bot.Service import Galley.Types.Conversations.Intra (UpsertOne2OneConversationRequest (..), UpsertOne2OneConversationResponse (..)) -import Galley.Types.Teams hiding (MemberLeave) +import Galley.Types.Conversations.Members (RemoteMember (rmId)) import Galley.Types.Teams.Intra -import Galley.Types.Teams.SearchVisibility import Galley.Types.UserList import Imports hiding (head) import Network.Wai.Predicate hiding (Error, err) @@ -90,11 +88,14 @@ import qualified System.Logger.Class as Log import Wire.API.Conversation hiding (Member) import Wire.API.Conversation.Action import Wire.API.Conversation.Role +import Wire.API.CustomBackend import Wire.API.Error import Wire.API.Error.Galley +import Wire.API.Event.Conversation import Wire.API.Federation.API import Wire.API.Federation.API.Galley import Wire.API.Federation.Error +import Wire.API.Provider.Service hiding (Service) import Wire.API.Routes.API import Wire.API.Routes.Internal.Galley.TeamFeatureNoConfigMulti import Wire.API.Routes.MultiTablePaging (mtpHasMore, mtpPagingState, mtpResults) @@ -102,7 +103,10 @@ import Wire.API.Routes.MultiVerb import Wire.API.Routes.Named import Wire.API.Routes.Public import Wire.API.Routes.Public.Galley +import Wire.API.Team import Wire.API.Team.Feature +import Wire.API.Team.Member +import Wire.API.Team.SearchVisibility type IFeatureAPI = -- SSOConfig diff --git a/services/galley/src/Galley/API/LegalHold.hs b/services/galley/src/Galley/API/LegalHold.hs index 5bd899e241..d024d6947c 100644 --- a/services/galley/src/Galley/API/LegalHold.hs +++ b/services/galley/src/Galley/API/LegalHold.hs @@ -61,7 +61,7 @@ import qualified Galley.Effects.TeamFeatureStore as TeamFeatures import Galley.Effects.TeamMemberStore import Galley.Effects.TeamStore import qualified Galley.External.LegalHoldService as LHService -import Galley.Types (LocalMember, lmConvRoleName, lmId) +import Galley.Types.Conversations.Members import Galley.Types.Teams as Team import Imports import Network.HTTP.Types.Status (status200) @@ -79,6 +79,7 @@ import Wire.API.Routes.Public.Galley (DisableLegalHoldForUserResponse (..), Gran import qualified Wire.API.Team.Feature as Public import Wire.API.Team.LegalHold (LegalholdProtectee (LegalholdPlusFederationNotImplemented)) import qualified Wire.API.Team.LegalHold as Public +import Wire.API.Team.Member assertLegalHoldEnabledForTeam :: forall db r. @@ -329,7 +330,7 @@ removeSettings' tid = spawnMany (map removeLHForUser lhMembers) removeLHForUser :: TeamMember -> Sem r () removeLHForUser member = do - luid <- qualifyLocal (member ^. Team.userId) + luid <- qualifyLocal (member ^. userId) removeLegalHoldClientFromUser (tUnqualified luid) LHService.removeLegalHold tid (tUnqualified luid) changeLegalholdStatus tid luid (member ^. legalHoldStatus) UserLegalHoldDisabled -- (support for withdrawing consent is not planned yet.) diff --git a/services/galley/src/Galley/API/LegalHold/Conflicts.hs b/services/galley/src/Galley/API/LegalHold/Conflicts.hs index dfbd525361..f9e3e07126 100644 --- a/services/galley/src/Galley/API/LegalHold/Conflicts.hs +++ b/services/galley/src/Galley/API/LegalHold/Conflicts.hs @@ -31,7 +31,7 @@ import Galley.Effects import Galley.Effects.BrigAccess import Galley.Effects.TeamStore import Galley.Options -import Galley.Types.Teams hiding (self) +import Galley.Types.Teams import Imports import Polysemy import Polysemy.Error @@ -39,6 +39,7 @@ import Polysemy.Input import qualified Polysemy.TinyLog as P import qualified System.Logger.Class as Log import Wire.API.Team.LegalHold +import Wire.API.Team.Member import Wire.API.User import Wire.API.User.Client as Client diff --git a/services/galley/src/Galley/API/MLS/Message.hs b/services/galley/src/Galley/API/MLS/Message.hs index d6569f9735..1d62914d24 100644 --- a/services/galley/src/Galley/API/MLS/Message.hs +++ b/services/galley/src/Galley/API/MLS/Message.hs @@ -42,7 +42,6 @@ import Galley.Effects.ConversationStore import Galley.Effects.FederatorAccess import Galley.Effects.MemberStore import Galley.Options -import Galley.Types import Galley.Types.Conversations.Members import Imports import Network.Wai.Utilities.Server @@ -56,6 +55,7 @@ import Wire.API.Conversation.Protocol import Wire.API.Conversation.Role import Wire.API.Error import Wire.API.Error.Galley +import Wire.API.Event.Conversation import Wire.API.Federation.API import Wire.API.Federation.API.Brig import Wire.API.Federation.API.Galley diff --git a/services/galley/src/Galley/API/Query.hs b/services/galley/src/Galley/API/Query.hs index 46e4184c84..b016d2508b 100644 --- a/services/galley/src/Galley/API/Query.hs +++ b/services/galley/src/Galley/API/Query.hs @@ -79,9 +79,7 @@ import qualified Galley.Effects.MemberStore as E import Galley.Effects.TeamFeatureStore (FeaturePersistentConstraint) import qualified Galley.Effects.TeamFeatureStore as TeamFeatures import Galley.Options -import Galley.Types import Galley.Types.Conversations.Members -import Galley.Types.Conversations.Roles import Galley.Types.Teams import Imports import Network.HTTP.Types @@ -93,8 +91,11 @@ import Polysemy.Error import Polysemy.Input import qualified Polysemy.TinyLog as P import qualified System.Logger.Class as Logger -import Wire.API.Conversation (ConversationCoverView (..)) +import Wire.API.Conversation (Access (CodeAccess), Conversation, ConversationCoverView (..), ConversationList (ConversationList), ConversationMetadata, convHasMore, convList) import qualified Wire.API.Conversation as Public +import Wire.API.Conversation.Code +import Wire.API.Conversation.Member hiding (Member) +import Wire.API.Conversation.Role import qualified Wire.API.Conversation.Role as Public import Wire.API.Error import Wire.API.Error.Galley diff --git a/services/galley/src/Galley/API/Teams.hs b/services/galley/src/Galley/API/Teams.hs index b33885ae38..04345a6026 100644 --- a/services/galley/src/Galley/API/Teams.hs +++ b/services/galley/src/Galley/API/Teams.hs @@ -109,11 +109,9 @@ import qualified Galley.Effects.TeamStore as E import qualified Galley.Intra.Journal as Journal import Galley.Intra.Push import Galley.Options -import qualified Galley.Types as Conv -import Galley.Types.Conversations.Roles as Roles -import Galley.Types.Teams hiding (newTeam) +import qualified Galley.Types.Conversations.Members as Conv +import Galley.Types.Teams import Galley.Types.Teams.Intra -import Galley.Types.Teams.SearchVisibility import Galley.Types.UserList import Imports hiding (forkIO) import Network.Wai @@ -127,19 +125,28 @@ import Polysemy.Output import qualified Polysemy.TinyLog as P import qualified SAML2.WebSSO as SAML import qualified System.Logger.Class as Log +import Wire.API.Conversation.Role (Action (DeleteConversation), wireConvRoles) import qualified Wire.API.Conversation.Role as Public import Wire.API.Error import Wire.API.Error.Galley +import qualified Wire.API.Event.Conversation as Conv +import Wire.API.Event.Team import Wire.API.Federation.Error +import qualified Wire.API.Message as Conv import qualified Wire.API.Notification as Public import Wire.API.Routes.Public.Galley +import Wire.API.Team import qualified Wire.API.Team as Public +import Wire.API.Team.Conversation import qualified Wire.API.Team.Conversation as Public import Wire.API.Team.Export (TeamExportUser (..)) import Wire.API.Team.Feature import qualified Wire.API.Team.Feature as Public -import Wire.API.Team.Member (TeamMemberOptPerms, ntmNewTeamMember, setOptionalPerms, setOptionalPermsMany) +import Wire.API.Team.Member (HardTruncationLimit, ListType (ListComplete, ListTruncated), NewTeamMember, TeamMember, TeamMemberList, TeamMemberListOptPerms, TeamMemberOptPerms, hardTruncationLimit, invitation, nPermissions, nUserId, newTeamMemberList, ntmNewTeamMember, permissions, setOptionalPerms, setOptionalPermsMany, teamMemberListType, teamMembers, tmdAuthPassword, userId) import qualified Wire.API.Team.Member as Public +import Wire.API.Team.Permission (Perm (..), Permissions (..), SPerm (..), copy, fullPermissions, self) +import Wire.API.Team.Role +import Wire.API.Team.SearchVisibility import qualified Wire.API.Team.SearchVisibility as Public import Wire.API.User (User, UserIdList, UserSSOId (UserScimExternalId), userSCIMExternalId, userSSOId) import qualified Wire.API.User as U diff --git a/services/galley/src/Galley/API/Teams/Features.hs b/services/galley/src/Galley/API/Teams/Features.hs index d8cf644d81..01c520bff7 100644 --- a/services/galley/src/Galley/API/Teams/Features.hs +++ b/services/galley/src/Galley/API/Teams/Features.hs @@ -62,8 +62,7 @@ import qualified Galley.Effects.TeamFeatureStore as TeamFeatures import Galley.Effects.TeamStore (getLegalHoldFlag, getOneUserTeam, getTeam, getTeamMember) import Galley.Intra.Push (PushEvent (FeatureConfigEvent), newPush) import Galley.Options -import Galley.Types.Conversations.Roles (Action (RemoveConversationMember)) -import Galley.Types.Teams hiding (newTeam) +import Galley.Types.Teams import Imports import Polysemy import Polysemy.Error @@ -71,11 +70,13 @@ import Polysemy.Input import qualified Polysemy.TinyLog as P import qualified System.Logger.Class as Log import Wire.API.Conversation (cnvmTeam) +import Wire.API.Conversation.Role (Action (RemoveConversationMember)) import Wire.API.Error (ErrorS, throwS) import Wire.API.Error.Galley import qualified Wire.API.Event.FeatureConfig as Event import qualified Wire.API.Routes.Internal.Galley.TeamFeatureNoConfigMulti as Multi import Wire.API.Team.Feature +import Wire.API.Team.Member data DoAuth = DoAuth UserId | DontDoAuth diff --git a/services/galley/src/Galley/API/Teams/Notifications.hs b/services/galley/src/Galley/API/Teams/Notifications.hs index 89584b0e87..c94ba53fc5 100644 --- a/services/galley/src/Galley/API/Teams/Notifications.hs +++ b/services/galley/src/Galley/API/Teams/Notifications.hs @@ -49,11 +49,11 @@ import qualified Galley.Data.TeamNotifications as DataTeamQueue import Galley.Effects import Galley.Effects.BrigAccess as Intra import qualified Galley.Effects.TeamNotificationStore as E -import Galley.Types.Teams hiding (newTeam) import Imports import Polysemy import Wire.API.Error import Wire.API.Error.Galley +import Wire.API.Event.Team (Event) import Wire.API.Internal.Notification getTeamNotifications :: diff --git a/services/galley/src/Galley/API/Update.hs b/services/galley/src/Galley/API/Update.hs index 61398d6903..9f1ed8e8a9 100644 --- a/services/galley/src/Galley/API/Update.hs +++ b/services/galley/src/Galley/API/Update.hs @@ -102,9 +102,9 @@ import Galley.Effects.TeamFeatureStore (FeaturePersistentConstraint) import Galley.Effects.WaiRoutes import Galley.Intra.Push import Galley.Options -import Galley.Types import Galley.Types.Bot hiding (addBot) -import Galley.Types.Teams hiding (Event, EventData (..), EventType (..), self) +import Galley.Types.Bot.Service (Service) +import Galley.Types.Conversations.Members (LocalMember (..)) import Galley.Types.UserList import Imports hiding (forkIO) import Network.HTTP.Types @@ -117,6 +117,7 @@ import Polysemy.Input import Polysemy.TinyLog import Wire.API.Conversation hiding (Member) import Wire.API.Conversation.Action +import Wire.API.Conversation.Code import Wire.API.Conversation.Role import Wire.API.Error import Wire.API.Error.Galley @@ -125,10 +126,12 @@ import Wire.API.Federation.API import Wire.API.Federation.API.Galley import Wire.API.Federation.Error import Wire.API.Message +import Wire.API.Provider.Service (ServiceRef) import Wire.API.Routes.Public.Galley import Wire.API.Routes.Public.Util (UpdateResult (..)) import Wire.API.ServantProto (RawProto (..)) import Wire.API.Team.Feature +import Wire.API.Team.Member import Wire.API.User.Client acceptConvH :: diff --git a/services/galley/src/Galley/API/Util.hs b/services/galley/src/Galley/API/Util.hs index edfcde581e..e66f015a7e 100644 --- a/services/galley/src/Galley/API/Util.hs +++ b/services/galley/src/Galley/API/Util.hs @@ -52,10 +52,9 @@ import Galley.Effects.MemberStore import Galley.Effects.TeamStore import Galley.Intra.Push import Galley.Options -import Galley.Types -import Galley.Types.Conversations.Members (localMemberToOther, remoteMemberToOther) +import Galley.Types.Conversations.Members (LocalMember (..), RemoteMember (..), localMemberToOther, remoteMemberToOther) import Galley.Types.Conversations.Roles -import Galley.Types.Teams hiding (Event, MemberJoin, self) +import Galley.Types.Teams import Galley.Types.UserList import Imports hiding (forkIO) import Network.HTTP.Types @@ -65,12 +64,18 @@ import qualified Network.Wai.Utilities as Wai import Polysemy import Polysemy.Error import Polysemy.Input +import Wire.API.Conversation hiding (Member) import qualified Wire.API.Conversation as Public +import Wire.API.Conversation.Protocol +import Wire.API.Conversation.Role import Wire.API.Error import Wire.API.Error.Galley +import Wire.API.Event.Conversation import Wire.API.Federation.API import Wire.API.Federation.API.Galley import Wire.API.Federation.Error +import Wire.API.Team.Member +import Wire.API.Team.Role import Wire.API.User (VerificationAction) import qualified Wire.API.User as User diff --git a/services/galley/src/Galley/Cassandra/CustomBackend.hs b/services/galley/src/Galley/Cassandra/CustomBackend.hs index 8217b4239f..c257416707 100644 --- a/services/galley/src/Galley/Cassandra/CustomBackend.hs +++ b/services/galley/src/Galley/Cassandra/CustomBackend.hs @@ -25,10 +25,10 @@ import Galley.Cassandra.Instances () import qualified Galley.Cassandra.Queries as Cql import Galley.Cassandra.Store import Galley.Effects.CustomBackendStore (CustomBackendStore (..)) -import Galley.Types import Imports import Polysemy import Polysemy.Input +import Wire.API.CustomBackend interpretCustomBackendStoreToCassandra :: Members '[Embed IO, Input ClientState] r => diff --git a/services/galley/src/Galley/Cassandra/Instances.hs b/services/galley/src/Galley/Cassandra/Instances.hs index 84411d2042..2534872802 100644 --- a/services/galley/src/Galley/Cassandra/Instances.hs +++ b/services/galley/src/Galley/Cassandra/Instances.hs @@ -29,16 +29,15 @@ import Data.ByteString.Conversion import qualified Data.ByteString.Lazy as LBS import Data.Domain (Domain, domainText, mkDomain) import qualified Data.Text.Encoding as T -import Galley.Types import Galley.Types.Bot () -import Galley.Types.Teams import Galley.Types.Teams.Intra -import Galley.Types.Teams.SearchVisibility import Imports import Wire.API.Asset (AssetKey, assetKeyToText) +import Wire.API.Conversation import Wire.API.Conversation.Protocol import Wire.API.Team import qualified Wire.API.Team.Feature as Public +import Wire.API.Team.SearchVisibility deriving instance Cql MutedStatus diff --git a/services/galley/src/Galley/Cassandra/Queries.hs b/services/galley/src/Galley/Cassandra/Queries.hs index c510f54a36..616a64cca8 100644 --- a/services/galley/src/Galley/Cassandra/Queries.hs +++ b/services/galley/src/Galley/Cassandra/Queries.hs @@ -29,16 +29,16 @@ import Data.LegalHold import Data.Misc import qualified Data.Text.Lazy as LT import Galley.Data.Scope -import Galley.Types hiding (Conversation) -import Galley.Types.Conversations.Roles -import Galley.Types.Teams import Galley.Types.Teams.Intra -import Galley.Types.Teams.SearchVisibility import Imports import Text.RawString.QQ import Wire.API.Asset (AssetKey) +import Wire.API.Conversation import Wire.API.Conversation.Protocol +import Wire.API.Conversation.Role import Wire.API.Team +import Wire.API.Team.Permission +import Wire.API.Team.SearchVisibility -- Teams -------------------------------------------------------------------- diff --git a/services/galley/src/Galley/Cassandra/SearchVisibility.hs b/services/galley/src/Galley/Cassandra/SearchVisibility.hs index 9a11ffe436..d8884b9758 100644 --- a/services/galley/src/Galley/Cassandra/SearchVisibility.hs +++ b/services/galley/src/Galley/Cassandra/SearchVisibility.hs @@ -23,10 +23,10 @@ import Galley.Cassandra.Instances () import Galley.Cassandra.Queries import Galley.Cassandra.Store import Galley.Effects.SearchVisibilityStore (SearchVisibilityStore (..)) -import Galley.Types.Teams.SearchVisibility import Imports import Polysemy import Polysemy.Input +import Wire.API.Team.SearchVisibility interpretSearchVisibilityStoreToCassandra :: Members '[Embed IO, Input ClientState] r => diff --git a/services/galley/src/Galley/Cassandra/Services.hs b/services/galley/src/Galley/Cassandra/Services.hs index 765da19bb1..9052ca607c 100644 --- a/services/galley/src/Galley/Cassandra/Services.hs +++ b/services/galley/src/Galley/Cassandra/Services.hs @@ -23,13 +23,13 @@ import Data.Id import Galley.Cassandra.Queries import Galley.Cassandra.Store import Galley.Data.Services -import Galley.Effects.ServiceStore (ServiceStore (..)) -import Galley.Types hiding (Conversation) -import Galley.Types.Bot -import Galley.Types.Conversations.Members (newMember) +import Galley.Effects.ServiceStore hiding (deleteService) +import qualified Galley.Types.Bot.Service as Bot +import Galley.Types.Conversations.Members (lmService, newMember) import Imports import Polysemy import Polysemy.Input +import Wire.API.Provider.Service hiding (DeleteService) -- FUTUREWORK: support adding bots to a remote conversation addBotMember :: ServiceRef -> BotId -> ConvId -> Client BotMember @@ -56,23 +56,23 @@ interpretServiceStoreToCassandra = interpret $ \case GetService sr -> embedClient $ lookupService sr DeleteService sr -> embedClient $ deleteService sr -insertService :: MonadClient m => Service -> m () +insertService :: MonadClient m => Bot.Service -> m () insertService s = do - let sid = s ^. serviceRef . serviceRefId - let pid = s ^. serviceRef . serviceRefProvider - let tok = s ^. serviceToken - let url = s ^. serviceUrl - let fps = Set (s ^. serviceFingerprints) - let ena = s ^. serviceEnabled + let sid = s ^. Bot.serviceRef . serviceRefId + let pid = s ^. Bot.serviceRef . serviceRefProvider + let tok = s ^. Bot.serviceToken + let url = s ^. Bot.serviceUrl + let fps = Set (s ^. Bot.serviceFingerprints) + let ena = s ^. Bot.serviceEnabled retry x5 $ write insertSrv (params LocalQuorum (pid, sid, url, tok, fps, ena)) -lookupService :: MonadClient m => ServiceRef -> m (Maybe Service) +lookupService :: MonadClient m => ServiceRef -> m (Maybe Bot.Service) lookupService s = fmap toService <$> retry x1 (query1 selectSrv (params LocalQuorum (s ^. serviceRefProvider, s ^. serviceRefId))) where toService (url, tok, Set fps, ena) = - newService s url tok fps & set serviceEnabled ena + Bot.newService s url tok fps & set Bot.serviceEnabled ena deleteService :: MonadClient m => ServiceRef -> m () deleteService s = retry x5 (write rmSrv (params LocalQuorum (s ^. serviceRefProvider, s ^. serviceRefId))) diff --git a/services/galley/src/Galley/Cassandra/Team.hs b/services/galley/src/Galley/Cassandra/Team.hs index 7029800abe..bf4b0dd42e 100644 --- a/services/galley/src/Galley/Cassandra/Team.hs +++ b/services/galley/src/Galley/Cassandra/Team.hs @@ -51,19 +51,16 @@ import Galley.Effects.TeamStore (TeamStore (..)) import Galley.Env import Galley.Monad import Galley.Options -import Galley.Types.Teams hiding - ( DeleteTeam, - GetTeamConversations, - SetTeamData, - ) -import qualified Galley.Types.Teams as Teams +import Galley.Types.Teams import Galley.Types.Teams.Intra import Imports hiding (Set, max) import Polysemy import Polysemy.Input import qualified UnliftIO -import Wire.API.Team (Icon (..)) +import Wire.API.Team +import Wire.API.Team.Conversation import Wire.API.Team.Member +import Wire.API.Team.Permission (Perm (SetBilling), Permissions, self) interpretTeamStoreToCassandra :: Members '[Embed IO, Input Env, Input ClientState] r => @@ -233,7 +230,7 @@ updateTeamMember oldPerms tid uid newPerms = do when (SetBilling `Set.member` lostPerms) $ addPrepQuery Cql.deleteBillingTeamMember (tid, uid) where - permDiff = Set.difference `on` view Teams.self + permDiff = Set.difference `on` view self acquiredPerms = newPerms `permDiff` oldPerms lostPerms = oldPerms `permDiff` newPerms diff --git a/services/galley/src/Galley/Data/Services.hs b/services/galley/src/Galley/Data/Services.hs index 7871a23c44..3d627ad419 100644 --- a/services/galley/src/Galley/Data/Services.hs +++ b/services/galley/src/Galley/Data/Services.hs @@ -25,9 +25,9 @@ module Galley.Data.Services where import Data.Id -import Galley.Types hiding (Conversation) -import Galley.Types.Bot +import Galley.Types.Conversations.Members import Imports +import Wire.API.Provider.Service -- BotMember ------------------------------------------------------------------ diff --git a/services/galley/src/Galley/Effects/CustomBackendStore.hs b/services/galley/src/Galley/Effects/CustomBackendStore.hs index 22d21ece8f..9e55e74943 100644 --- a/services/galley/src/Galley/Effects/CustomBackendStore.hs +++ b/services/galley/src/Galley/Effects/CustomBackendStore.hs @@ -26,9 +26,9 @@ module Galley.Effects.CustomBackendStore where import Data.Domain (Domain) -import Galley.Types import Imports import Polysemy +import Wire.API.CustomBackend data CustomBackendStore m a where GetCustomBackend :: Domain -> CustomBackendStore m (Maybe CustomBackend) diff --git a/services/galley/src/Galley/Effects/MemberStore.hs b/services/galley/src/Galley/Effects/MemberStore.hs index ffa90a7441..2def279536 100644 --- a/services/galley/src/Galley/Effects/MemberStore.hs +++ b/services/galley/src/Galley/Effects/MemberStore.hs @@ -47,13 +47,13 @@ where import Data.Id import Data.Qualified import Galley.Data.Services -import Galley.Types.Bot import Galley.Types.Conversations.Members import Galley.Types.ToUserRole import Galley.Types.UserList import Imports import Polysemy import Wire.API.Conversation.Member hiding (Member) +import Wire.API.Provider.Service data MemberStore m a where CreateMembers :: ToUserRole u => ConvId -> UserList u -> MemberStore m ([LocalMember], [RemoteMember]) diff --git a/services/galley/src/Galley/Effects/SearchVisibilityStore.hs b/services/galley/src/Galley/Effects/SearchVisibilityStore.hs index 01f1d36a72..cd7aecf21f 100644 --- a/services/galley/src/Galley/Effects/SearchVisibilityStore.hs +++ b/services/galley/src/Galley/Effects/SearchVisibilityStore.hs @@ -26,8 +26,8 @@ module Galley.Effects.SearchVisibilityStore where import Data.Id -import Galley.Types.Teams.SearchVisibility import Polysemy +import Wire.API.Team.SearchVisibility data SearchVisibilityStore m a where GetSearchVisibility :: TeamId -> SearchVisibilityStore m TeamSearchVisibility diff --git a/services/galley/src/Galley/Effects/ServiceStore.hs b/services/galley/src/Galley/Effects/ServiceStore.hs index 37d3195c81..c7affe084b 100644 --- a/services/galley/src/Galley/Effects/ServiceStore.hs +++ b/services/galley/src/Galley/Effects/ServiceStore.hs @@ -32,9 +32,10 @@ module Galley.Effects.ServiceStore ) where -import Galley.Types.Bot +import Galley.Types.Bot.Service import Imports import Polysemy +import Wire.API.Provider.Service (ServiceRef) data ServiceStore m a where CreateService :: Service -> ServiceStore m () diff --git a/services/galley/src/Galley/Effects/TeamMemberStore.hs b/services/galley/src/Galley/Effects/TeamMemberStore.hs index e923929364..eac886b946 100644 --- a/services/galley/src/Galley/Effects/TeamMemberStore.hs +++ b/services/galley/src/Galley/Effects/TeamMemberStore.hs @@ -28,9 +28,9 @@ where import Data.Id import Galley.Effects.Paging -import Galley.Types.Teams import Imports import Polysemy +import Wire.API.Team.Member data TeamMemberStore p m a where ListTeamMembers :: diff --git a/services/galley/src/Galley/Effects/TeamStore.hs b/services/galley/src/Galley/Effects/TeamStore.hs index 5836300ac6..5441919cca 100644 --- a/services/galley/src/Galley/Effects/TeamStore.hs +++ b/services/galley/src/Galley/Effects/TeamStore.hs @@ -87,7 +87,10 @@ import Polysemy import qualified Proto.TeamEvents as E import Wire.API.Error import Wire.API.Error.Galley -import Wire.API.Team (Icon) +import Wire.API.Team +import Wire.API.Team.Conversation +import Wire.API.Team.Member (HardTruncationLimit, TeamMember, TeamMemberList) +import Wire.API.Team.Permission data TeamStore m a where CreateTeamMember :: TeamId -> TeamMember -> TeamStore m () diff --git a/services/galley/src/Galley/Env.hs b/services/galley/src/Galley/Env.hs index d085c0289e..8958e3cdc7 100644 --- a/services/galley/src/Galley/Env.hs +++ b/services/galley/src/Galley/Env.hs @@ -29,7 +29,6 @@ import Data.Range import qualified Galley.Aws as Aws import Galley.Options import qualified Galley.Queue as Q -import qualified Galley.Types.Teams as Teams import Imports import Network.HTTP.Client import Network.HTTP.Client.OpenSSL @@ -39,6 +38,7 @@ import qualified OpenSSL.X509.SystemStore as Ssl import Ssl.Util import System.Logger import Util.Options +import Wire.API.Team.Member data DeleteItem = TeamItem TeamId UserId (Maybe ConnId) deriving (Eq, Ord, Show) @@ -95,7 +95,7 @@ reqIdMsg :: RequestId -> Msg -> Msg reqIdMsg = ("request" .=) . unRequestId {-# INLINE reqIdMsg #-} -currentFanoutLimit :: Opts -> Range 1 Teams.HardTruncationLimit Int32 +currentFanoutLimit :: Opts -> Range 1 HardTruncationLimit Int32 currentFanoutLimit o = do let optFanoutLimit = fromIntegral . fromRange $ fromMaybe defFanoutLimit (o ^. (optSettings . setMaxFanoutSize)) let maxTeamSize = fromIntegral (o ^. (optSettings . setMaxTeamSize)) diff --git a/services/galley/src/Galley/External.hs b/services/galley/src/Galley/External.hs index c0c4e1806c..8d8b84f696 100644 --- a/services/galley/src/Galley/External.hs +++ b/services/galley/src/Galley/External.hs @@ -31,8 +31,7 @@ import Galley.Effects.ExternalAccess (ExternalAccess (..)) import Galley.Env import Galley.Intra.User import Galley.Monad -import Galley.Types (Event) -import Galley.Types.Bot +import Galley.Types.Bot.Service (Service, serviceEnabled, serviceFingerprints, serviceToken, serviceUrl) import Imports import qualified Network.HTTP.Client as Http import Network.HTTP.Types.Method @@ -44,6 +43,8 @@ import qualified System.Logger.Class as Log import System.Logger.Message (field, msg, val, (~~)) import URI.ByteString import UnliftIO (Async, async, waitCatch) +import Wire.API.Event.Conversation (Event) +import Wire.API.Provider.Service (serviceRefId, serviceRefProvider) interpretExternalAccess :: Members '[Embed IO, Input Env] r => diff --git a/services/galley/src/Galley/Intra/Journal.hs b/services/galley/src/Galley/Intra/Journal.hs index 3d1a9bfd07..7ae78d9a81 100644 --- a/services/galley/src/Galley/Intra/Journal.hs +++ b/services/galley/src/Galley/Intra/Journal.hs @@ -46,6 +46,8 @@ import qualified Polysemy.TinyLog as P import Proto.TeamEvents (TeamEvent'EventData, TeamEvent'EventType (..)) import qualified Proto.TeamEvents_Fields as T import System.Logger (field, msg, val) +import Wire.API.Team.Member +import Wire.API.Team.Permission -- [Note: journaling] -- Team journal operations to SQS are a no-op when the service diff --git a/services/galley/src/Galley/Intra/Push/Internal.hs b/services/galley/src/Galley/Intra/Push/Internal.hs index 98c3f43090..bd0165787f 100644 --- a/services/galley/src/Galley/Intra/Push/Internal.hs +++ b/services/galley/src/Galley/Intra/Push/Internal.hs @@ -35,14 +35,16 @@ import Galley.Env import Galley.Intra.Util import Galley.Monad import Galley.Options -import Galley.Types -import qualified Galley.Types.Teams as Teams +import Galley.Types.Conversations.Members import Gundeck.Types.Push.V2 (RecipientClients (..)) import qualified Gundeck.Types.Push.V2 as Gundeck import Imports hiding (forkIO) import Safe (headDef, tailDef) import UnliftIO.Async (mapConcurrently) +import Wire.API.Event.Conversation (Event (evtFrom)) import qualified Wire.API.Event.FeatureConfig as FeatureConfig +import qualified Wire.API.Event.Team as Teams +import Wire.API.Team.Member data PushEvent = ConvEvent Event @@ -73,7 +75,7 @@ data PushTo user = Push pushOrigin :: Maybe UserId, _pushRecipients :: List1 (RecipientBy user), pushJson :: Object, - pushRecipientListType :: Teams.ListType + pushRecipientListType :: ListType } deriving stock (Functor, Foldable, Traversable, Show) @@ -130,7 +132,7 @@ pushLocal ps = do removeIfLargeFanout limit = filter ( \p -> - (pushRecipientListType p == Teams.ListComplete) + (pushRecipientListType p == ListComplete) && (length (_pushRecipients p) <= fromIntegral (fromRange limit)) ) @@ -140,7 +142,7 @@ recipient = userRecipient . lmId userRecipient :: user -> RecipientBy user userRecipient u = Recipient u RecipientClientsAll -newPush1 :: Teams.ListType -> Maybe UserId -> PushEvent -> List1 Recipient -> Push +newPush1 :: ListType -> Maybe UserId -> PushEvent -> List1 Recipient -> Push newPush1 recipientListType from e rr = Push { _pushConn = Nothing, @@ -154,20 +156,20 @@ newPush1 recipientListType from e rr = _pushRecipients = rr } -newPushLocal1 :: Teams.ListType -> UserId -> PushEvent -> List1 Recipient -> Push +newPushLocal1 :: ListType -> UserId -> PushEvent -> List1 Recipient -> Push newPushLocal1 lt uid = newPush1 lt (Just uid) -newPush :: Teams.ListType -> Maybe UserId -> PushEvent -> [Recipient] -> Maybe Push +newPush :: ListType -> Maybe UserId -> PushEvent -> [Recipient] -> Maybe Push newPush _ _ _ [] = Nothing newPush t u e (r : rr) = Just $ newPush1 t u e (list1 r rr) -newPushLocal :: Teams.ListType -> UserId -> PushEvent -> [Recipient] -> Maybe Push +newPushLocal :: ListType -> UserId -> PushEvent -> [Recipient] -> Maybe Push newPushLocal lt uid = newPush lt (Just uid) newConversationEventPush :: Event -> Local [UserId] -> Maybe Push newConversationEventPush e users = let musr = guard (tDomain users == qDomain (evtFrom e)) $> qUnqualified (evtFrom e) - in newPush Teams.ListComplete musr (ConvEvent e) (map userRecipient (tUnqualified users)) + in newPush ListComplete musr (ConvEvent e) (map userRecipient (tUnqualified users)) pushSlowly :: Foldable f => f Push -> App () pushSlowly ps = do diff --git a/services/galley/src/Galley/Options.hs b/services/galley/src/Galley/Options.hs index 72c5561916..d8782870b6 100644 --- a/services/galley/src/Galley/Options.hs +++ b/services/galley/src/Galley/Options.hs @@ -57,11 +57,12 @@ import Data.Aeson.TH (deriveFromJSON) import Data.Domain (Domain) import Data.Misc import Data.Range -import Galley.Types.Teams (FeatureFlags (..), HardTruncationLimit, hardTruncationLimit) +import Galley.Types.Teams import Imports import System.Logger.Extended (Level, LogFormat) import Util.Options import Util.Options.Common +import Wire.API.Team.Member data Settings = Settings { -- | Number of connections for the HTTP client pool diff --git a/services/galley/src/Galley/Types/Clients.hs b/services/galley/src/Galley/Types/Clients.hs index 6db58d2034..6771b261a2 100644 --- a/services/galley/src/Galley/Types/Clients.hs +++ b/services/galley/src/Galley/Types/Clients.hs @@ -41,8 +41,8 @@ import Data.Id import qualified Data.Map.Strict as Map import Data.Range import qualified Data.Set as Set -import Galley.Types (UserClients (..)) import Imports hiding (filter, toList) +import Wire.API.User.Client newtype Clients = Clients { clients :: UserClients diff --git a/services/galley/test/integration/API.hs b/services/galley/test/integration/API.hs index b2854625c0..d25e535cef 100644 --- a/services/galley/test/integration/API.hs +++ b/services/galley/test/integration/API.hs @@ -68,11 +68,8 @@ import Federator.Discovery (DiscoveryFailure (..)) import Federator.MockServer (FederatedRequest (..), MockException (..)) import Galley.API.Mapping import Galley.Options (optFederator) -import Galley.Types hiding (LocalMember (..)) import Galley.Types.Conversations.Intra import Galley.Types.Conversations.Members -import Galley.Types.Conversations.Roles -import qualified Galley.Types.Teams as Teams import Imports import qualified Network.HTTP.Types as HTTP import Network.Wai.Utilities.Error @@ -87,16 +84,21 @@ import TestSetup import Util.Options (Endpoint (Endpoint)) import Wire.API.Conversation import Wire.API.Conversation.Action +import Wire.API.Conversation.Protocol +import Wire.API.Conversation.Role +import Wire.API.Conversation.Typing import Wire.API.Event.Conversation import Wire.API.Federation.API import qualified Wire.API.Federation.API.Brig as F import Wire.API.Federation.API.Galley import qualified Wire.API.Federation.API.Galley as F import Wire.API.Internal.Notification +import Wire.API.Message import qualified Wire.API.Message as Message import Wire.API.Routes.MultiTablePaging import Wire.API.Routes.Named import qualified Wire.API.Team.Feature as Public +import qualified Wire.API.Team.Member as Teams import Wire.API.User.Client import Wire.API.UserMap (UserMap (..)) diff --git a/services/galley/test/integration/API/Federation.hs b/services/galley/test/integration/API/Federation.hs index eb0e99d33f..6cac0503bf 100644 --- a/services/galley/test/integration/API/Federation.hs +++ b/services/galley/test/integration/API/Federation.hs @@ -45,7 +45,6 @@ import Data.Time.Clock import Data.Timeout (TimeoutUnit (..), (#)) import Data.UUID.V4 (nextRandom) import Federator.MockServer (FederatedRequest (..)) -import Galley.Types import Galley.Types.Conversations.Intra import Imports import Test.QuickCheck (arbitrary, generate) diff --git a/services/galley/test/integration/API/MessageTimer.hs b/services/galley/test/integration/API/MessageTimer.hs index c40dc95873..7566fbb0a8 100644 --- a/services/galley/test/integration/API/MessageTimer.hs +++ b/services/galley/test/integration/API/MessageTimer.hs @@ -34,9 +34,6 @@ import Data.Misc import Data.Qualified import Data.Singletons import Federator.MockServer (FederatedRequest (..)) -import Galley.Types -import Galley.Types.Conversations.Roles -import qualified Galley.Types.Teams as Teams import Imports hiding (head) import Network.Wai.Utilities.Error import Test.Tasty @@ -45,12 +42,15 @@ import qualified Test.Tasty.Cannon as WS import Test.Tasty.HUnit import TestHelpers import TestSetup +import Wire.API.Conversation import Wire.API.Conversation.Action +import Wire.API.Conversation.Role import Wire.API.Event.Conversation import qualified Wire.API.Federation.API.Galley as F import Wire.API.Federation.Component import Wire.API.Internal.Notification (Notification (..)) import qualified Wire.API.Team.Member as Member +import Wire.API.Team.Permission tests :: IO TestSetup -> TestTree tests s = @@ -190,7 +190,7 @@ messageTimerChangeWithoutAllowedAction = do -- Create a team and a guest user [owner, member, guest] <- randomUsers 3 connectUsers owner (list1 member [guest]) - tid <- createNonBindingTeam "team" owner [Member.mkTeamMember member Teams.fullPermissions Nothing LH.defUserLegalHoldStatus] + tid <- createNonBindingTeam "team" owner [Member.mkTeamMember member fullPermissions Nothing LH.defUserLegalHoldStatus] -- Create a conversation cid <- createTeamConvWithRole owner tid [member, guest] Nothing Nothing Nothing roleNameWireMember -- Try to change the timer (as a non admin, guest user) and observe failure diff --git a/services/galley/test/integration/API/Roles.hs b/services/galley/test/integration/API/Roles.hs index ac4982c555..6fcc3bfdc1 100644 --- a/services/galley/test/integration/API/Roles.hs +++ b/services/galley/test/integration/API/Roles.hs @@ -31,8 +31,6 @@ import Data.Qualified import qualified Data.Set as Set import Data.Singletons import Federator.MockServer (FederatedRequest (..)) -import Galley.Types -import Galley.Types.Conversations.Roles import Imports import Network.Wai.Utilities.Error import Test.Tasty @@ -43,6 +41,7 @@ import TestHelpers import TestSetup import Wire.API.Conversation import Wire.API.Conversation.Action +import Wire.API.Conversation.Role import Wire.API.Event.Conversation import qualified Wire.API.Federation.API.Galley as F import Wire.API.Federation.Component diff --git a/services/galley/test/integration/API/Teams.hs b/services/galley/test/integration/API/Teams.hs index 81eec033f8..e4fdc27cca 100644 --- a/services/galley/test/integration/API/Teams.hs +++ b/services/galley/test/integration/API/Teams.hs @@ -60,11 +60,9 @@ import qualified Data.Vector as V import GHC.TypeLits (KnownSymbol) import qualified Galley.Env as Galley import Galley.Options (optSettings, setEnableIndexedBillingTeamMembers, setFeatureFlags, setMaxConvSize, setMaxFanoutSize) -import Galley.Types hiding (EventData (..), EventType (..), MemberUpdate (..)) import Galley.Types.Conversations.Roles import Galley.Types.Teams import Galley.Types.Teams.Intra -import Galley.Types.Teams.SearchVisibility import Imports import Network.HTTP.Types.Status (status403) import qualified Network.Wai.Utilities.Error as Error @@ -79,13 +77,20 @@ import Test.Tasty.HUnit import TestHelpers (test, viewFederationDomain) import TestSetup (TestM, TestSetup, tsBrig, tsCannon, tsGConf, tsGalley) import UnliftIO (mapConcurrently, mapConcurrently_) +import Wire.API.Conversation import Wire.API.Conversation.Protocol +import Wire.API.Conversation.Role +import Wire.API.Event.Team import Wire.API.Internal.Notification hiding (target) -import Wire.API.Team (Icon (..)) +import Wire.API.Team import Wire.API.Team.Export (TeamExportUser (..)) import qualified Wire.API.Team.Feature as Public +import Wire.API.Team.Member import qualified Wire.API.Team.Member as Member import qualified Wire.API.Team.Member as TM +import Wire.API.Team.Permission +import Wire.API.Team.Role +import Wire.API.Team.SearchVisibility import qualified Wire.API.User as Public import qualified Wire.API.User as U import qualified Wire.API.User.Client as C diff --git a/services/galley/test/integration/API/Teams/Feature.hs b/services/galley/test/integration/API/Teams/Feature.hs index 6b0d672bb3..f0b100277f 100644 --- a/services/galley/test/integration/API/Teams/Feature.hs +++ b/services/galley/test/integration/API/Teams/Feature.hs @@ -53,6 +53,7 @@ import Wire.API.Internal.Notification (Notification) import Wire.API.Routes.Internal.Galley.TeamFeatureNoConfigMulti as Multi import Wire.API.Team.Feature (FeatureStatus (..), FeatureTTL (..)) import qualified Wire.API.Team.Feature as Public +import Wire.API.Team.Role tests :: IO TestSetup -> TestTree tests s = diff --git a/services/galley/test/integration/API/Teams/LegalHold.hs b/services/galley/test/integration/API/Teams/LegalHold.hs index 62cbc2e873..c1149ded07 100644 --- a/services/galley/test/integration/API/Teams/LegalHold.hs +++ b/services/galley/test/integration/API/Teams/LegalHold.hs @@ -91,6 +91,9 @@ import Wire.API.Internal.Notification (ntfPayload) import qualified Wire.API.Message as Msg import Wire.API.Routes.Internal.Brig.Connection import qualified Wire.API.Team.Feature as Public +import Wire.API.Team.Member +import Wire.API.Team.Permission +import Wire.API.Team.Role import Wire.API.User (UserProfile (..)) import Wire.API.User.Client (UserClients (..), UserClientsFull (userClientsFull)) import qualified Wire.API.User.Client as Client diff --git a/services/galley/test/integration/API/Teams/LegalHold/DisabledByDefault.hs b/services/galley/test/integration/API/Teams/LegalHold/DisabledByDefault.hs index 76597a389d..d276d2647b 100644 --- a/services/galley/test/integration/API/Teams/LegalHold/DisabledByDefault.hs +++ b/services/galley/test/integration/API/Teams/LegalHold/DisabledByDefault.hs @@ -99,6 +99,9 @@ import TestSetup import Wire.API.Internal.Notification (ntfPayload) import qualified Wire.API.Message as Msg import qualified Wire.API.Team.Feature as Public +import Wire.API.Team.Member +import Wire.API.Team.Permission +import Wire.API.Team.Role import Wire.API.User (UserProfile (..)) import Wire.API.User.Client (UserClients (..), UserClientsFull (userClientsFull)) import qualified Wire.API.User.Client as Client diff --git a/services/galley/test/integration/API/Util.hs b/services/galley/test/integration/API/Util.hs index 6aee5c25e8..d4bb694de4 100644 --- a/services/galley/test/integration/API/Util.hs +++ b/services/galley/test/integration/API/Util.hs @@ -75,12 +75,14 @@ import GHC.TypeLits (KnownSymbol) import Galley.Intra.User (chunkify) import qualified Galley.Options as Opts import qualified Galley.Run as Run -import Galley.Types -import qualified Galley.Types as Conv +-- import Galley.Types +-- import Galley.Types.Conversations.Intra +-- import Galley.Types.Conversations.One2One (one2OneConvId) +-- import Galley.Types.Conversations.Roles hiding (DeleteConversation) +-- import Galley.Types.Teams hiding (Event, EventType (..), self) + import Galley.Types.Conversations.Intra -import Galley.Types.Conversations.One2One (one2OneConvId) -import Galley.Types.Conversations.Roles hiding (DeleteConversation) -import Galley.Types.Teams hiding (Event, EventType (..), self) +import Galley.Types.Conversations.One2One import qualified Galley.Types.Teams as Team import Galley.Types.Teams.Intra import Galley.Types.UserList @@ -106,7 +108,11 @@ import Util.Options import Web.Cookie import Wire.API.Conversation import Wire.API.Conversation.Action +import Wire.API.Conversation.Protocol +import Wire.API.Conversation.Role import Wire.API.Event.Conversation +import qualified Wire.API.Event.Conversation as Conv +import Wire.API.Event.Team import qualified Wire.API.Event.Team as TE import Wire.API.Federation.API import Wire.API.Federation.API.Galley @@ -128,12 +134,15 @@ import qualified Wire.API.Message.Proto as Proto import Wire.API.Routes.Internal.Brig.Connection import qualified Wire.API.Routes.Internal.Galley.TeamFeatureNoConfigMulti as Multi import Wire.API.Routes.MultiTablePaging -import Wire.API.Team (Icon (..)) +import Wire.API.Team import Wire.API.Team.Feature -import Wire.API.Team.Member (mkNewTeamMember) +import Wire.API.Team.Member +import qualified Wire.API.Team.Member as Team +import Wire.API.Team.Permission hiding (self) +import Wire.API.Team.Role +import Wire.API.User import Wire.API.User.Client import qualified Wire.API.User.Client as Client -import Wire.API.User.Identity (mkSimpleSampleUref) ------------------------------------------------------------------------------- -- API Operations @@ -178,7 +187,7 @@ createBindingTeamWithMembers numUsers = do -- refreshing the index once at the end would be that the hard member limit wouldn't hold -- any more. refreshIndex - pure $ view Galley.Types.Teams.userId mem + pure $ view Team.userId mem pure (tid, owner, members) @@ -212,7 +221,7 @@ createBindingTeamWithNMembersWithHandles withHandles n = do setHandle owner mems <- replicateM n $ do member1 <- randomUser - addTeamMemberInternal tid member1 (rolePermissions RoleMember) Nothing + addTeamMemberInternal tid member1 (Team.rolePermissions RoleMember) Nothing setHandle member1 pure member1 SQS.ensureQueueEmpty @@ -1611,7 +1620,7 @@ assertMLSMessageEvent :: Qualified ConvId -> Qualified UserId -> ByteString -> - Event -> + Conv.Event -> IO () assertMLSMessageEvent conv u message e = do evtConv e @?= conv @@ -1629,7 +1638,7 @@ wsAssertMemberJoinWithRole conv usr new role n = do ntfTransient n @?= False assertJoinEvent conv usr new role e -assertJoinEvent :: Qualified ConvId -> Qualified UserId -> [Qualified UserId] -> RoleName -> Event -> IO () +assertJoinEvent :: Qualified ConvId -> Qualified UserId -> [Qualified UserId] -> RoleName -> Conv.Event -> IO () assertJoinEvent conv usr new role e = do evtConv e @?= conv evtType e @?= Conv.MemberJoin @@ -1657,7 +1666,7 @@ assertLeaveEvent :: Qualified ConvId -> Qualified UserId -> [Qualified UserId] -> - Event -> + Conv.Event -> IO () assertLeaveEvent conv usr leaving e = do evtConv e @?= conv @@ -1980,7 +1989,7 @@ randomUserProfile' isCreator hasPassword hasEmail = do ["name" .= fromEmail e] <> ["password" .= defPassword | hasPassword] <> ["email" .= fromEmail e | hasEmail] - <> ["team" .= Team.BindingNewTeam (Team.newNewTeam (unsafeRange "teamName") DefaultIcon) | isCreator] + <> ["team" .= BindingNewTeam (newNewTeam (unsafeRange "teamName") DefaultIcon) | isCreator] responseJsonUnsafe <$> (post (b . path "/i/users" . json p) TestM UserId diff --git a/services/galley/test/unit/Test/Galley/API.hs b/services/galley/test/unit/Test/Galley/API.hs index c1bb365482..4f04401eb2 100644 --- a/services/galley/test/unit/Test/Galley/API.hs +++ b/services/galley/test/unit/Test/Galley/API.hs @@ -24,13 +24,13 @@ import Data.Predicate (exec) import Data.Set hiding (drop) import Galley.API () import Galley.API.Public (filterMissing) -import Galley.Types import Imports import qualified Network.HTTP.Types as H import qualified Network.Wai as W import qualified Network.Wai.Predicate as P import Test.Tasty import Test.Tasty.HUnit +import Wire.API.Message tests :: TestTree tests = diff --git a/services/spar/src/Spar/Intra/Galley.hs b/services/spar/src/Spar/Intra/Galley.hs index bbd2a74f25..07b4454d76 100644 --- a/services/spar/src/Spar/Intra/Galley.hs +++ b/services/spar/src/Spar/Intra/Galley.hs @@ -30,6 +30,7 @@ import Network.HTTP.Types.Method import Spar.Error import qualified System.Logger.Class as Log import Wire.API.Team.Feature +import Wire.API.Team.Member ---------------------------------------------------------------------- diff --git a/services/spar/src/Spar/Sem/GalleyAccess.hs b/services/spar/src/Spar/Sem/GalleyAccess.hs index 2ec359eeda..05ccc230ec 100644 --- a/services/spar/src/Spar/Sem/GalleyAccess.hs +++ b/services/spar/src/Spar/Sem/GalleyAccess.hs @@ -27,9 +27,10 @@ module Spar.Sem.GalleyAccess where import Data.Id (TeamId, UserId) -import Galley.Types.Teams (IsPerm, TeamMember) +import Galley.Types.Teams (IsPerm) import Imports import Polysemy +import Wire.API.Team.Member data GalleyAccess m a where GetTeamMembers :: TeamId -> GalleyAccess m [TeamMember] diff --git a/services/spar/test-integration/Test/Spar/APISpec.hs b/services/spar/test-integration/Test/Spar/APISpec.hs index 5f5f111c82..728dbce9da 100644 --- a/services/spar/test-integration/Test/Spar/APISpec.hs +++ b/services/spar/test-integration/Test/Spar/APISpec.hs @@ -88,6 +88,9 @@ import qualified Util.Scim as ScimT import Util.Types import qualified Web.Cookie as Cky import qualified Web.Scim.Schema.User as Scim +import Wire.API.Team.Member (newTeamMemberDeleteData) +import Wire.API.Team.Permission hiding (self) +import Wire.API.Team.Role import Wire.API.User.IdentityProvider import qualified Wire.API.User.Saml as WireAPI (saml) import Wire.API.User.Scim @@ -360,7 +363,7 @@ specFinalizeLogin = do . header "Z-User" (toByteString' ownerid) . header "Z-Connection" "fake" . paths ["teams", toByteString' teamid, "members", toByteString' newUserId] - . Bilge.json (Galley.newTeamMemberDeleteData (Just defPassword)) + . Bilge.json (newTeamMemberDeleteData (Just defPassword)) . expect2xx ) liftIO $ threadDelay 100000 -- make sure deletion is done. if we don't want to take @@ -558,7 +561,7 @@ testGetPutDelete whichone = do env <- ask (_, teamid, (^. idpId) -> idpid, (idpmeta, _)) <- registerTestIdPWithMeta newmember <- - let perms = Galley.noPermissions + let perms = noPermissions in call $ createTeamMember (env ^. teBrig) (env ^. teGalley) teamid perms whichone (env ^. teSpar) (Just newmember) idpid idpmeta `shouldRespondWith` checkErrHspec 403 "insufficient-permissions" @@ -606,7 +609,7 @@ specCRUDIdentityProvider = do (_owner :: UserId, teamid :: TeamId) <- call $ createUserWithTeam (env ^. teBrig) (env ^. teGalley) member :: UserId <- - let perms = Galley.noPermissions + let perms = noPermissions in call $ createTeamMember (env ^. teBrig) (env ^. teGalley) teamid perms callIdpGetAll' (env ^. teSpar) (Just member) `shouldRespondWith` checkErrHspec 403 "insufficient-permissions" @@ -647,12 +650,12 @@ specCRUDIdentityProvider = do it "responds 204 resp. 403" $ do env <- ask (_, tid, (^. idpId) -> idpid) <- registerTestIdP - let mkUser :: Galley.Role -> TestSpar UserId + let mkUser :: Role -> TestSpar UserId mkUser role = do let perms = Galley.rolePermissions role call $ createTeamMember (env ^. teBrig) (env ^. teGalley) tid perms - admin <- mkUser Galley.RoleAdmin - member <- mkUser Galley.RoleMember + admin <- mkUser RoleAdmin + member <- mkUser RoleMember callIdpDelete' (env ^. teSpar) (Just member) idpid `shouldRespondWith` checkErrHspec 403 "insufficient-permissions" callIdpDelete' (env ^. teSpar) (Just admin) idpid @@ -941,7 +944,7 @@ specCRUDIdentityProvider = do env <- ask (_owner, tid, idp) <- registerTestIdP newmember <- - let perms = Galley.noPermissions + let perms = noPermissions in call $ createTeamMember (env ^. teBrig) (env ^. teGalley) tid perms callIdpCreate' (env ^. teWireIdPAPIVersion) (env ^. teSpar) (Just newmember) (idp ^. idpMetadata) `shouldRespondWith` checkErrHspec 403 "insufficient-permissions" @@ -1276,10 +1279,10 @@ specAux = do ) parsedResp <- either (error . show) pure $ selfUser <$> Intra.parseResponse @SelfProfile "brig" rawResp liftIO $ userTeam parsedResp `shouldSatisfy` isJust - permses :: [Galley.Permissions] + permses :: [Permissions] permses = - [ Galley.fullPermissions, - Galley.noPermissions + [ fullPermissions, + noPermissions ] sequence_ [check tryowner perms | tryowner <- [minBound ..], perms <- [0 .. (length permses - 1)]] @@ -1386,7 +1389,7 @@ specSparUserMigration = do let issuer = idp ^. SAML.idpMetadata . SAML.edIssuer pure (issuer, subj) - memberUid <- call $ createTeamMember (env ^. teBrig) (env ^. teGalley) tid (Galley.rolePermissions Galley.RoleMember) + memberUid <- call $ createTeamMember (env ^. teBrig) (env ^. teGalley) tid (Galley.rolePermissions RoleMember) do -- insert to legacy tale diff --git a/services/spar/test-integration/Test/Spar/Scim/AuthSpec.hs b/services/spar/test-integration/Test/Spar/Scim/AuthSpec.hs index b7bf973a91..061f7cb845 100644 --- a/services/spar/test-integration/Test/Spar/Scim/AuthSpec.hs +++ b/services/spar/test-integration/Test/Spar/Scim/AuthSpec.hs @@ -52,6 +52,7 @@ import Text.RawString.QQ (r) import Util import Wire.API.Team.Feature (featureNameBS) import qualified Wire.API.Team.Feature as Public +import Wire.API.Team.Role import qualified Wire.API.User as Public -- | Tests for authentication and operations with provisioning tokens ('ScimToken's). @@ -226,7 +227,7 @@ testCreateTokenAuthorizesOnlyAdmins = do env <- ask (_, teamId, _) <- registerTestIdP - let mkUser :: Galley.Role -> TestSpar UserId + let mkUser :: Role -> TestSpar UserId mkUser role = do runHttpT (env ^. teMgr) $ createTeamMember @@ -245,10 +246,10 @@ testCreateTokenAuthorizesOnlyAdmins = do } (env ^. teSpar) - (mkUser Galley.RoleMember >>= createToken') + (mkUser RoleMember >>= createToken') !!! checkErr 403 (Just "insufficient-permissions") - (mkUser Galley.RoleAdmin >>= createToken') + (mkUser RoleAdmin >>= createToken') !!! const 200 === statusCode -- @END diff --git a/services/spar/test-integration/Util/Core.hs b/services/spar/test-integration/Util/Core.hs index 5ebfb72760..9d2867e4e9 100644 --- a/services/spar/test-integration/Util/Core.hs +++ b/services/spar/test-integration/Util/Core.hs @@ -163,7 +163,7 @@ import Data.UUID as UUID hiding (fromByteString, null) import Data.UUID.V4 as UUID (nextRandom) import qualified Data.Yaml as Yaml import GHC.TypeLits -import qualified Galley.Types.Teams as Galley +import Galley.Types.Teams (rolePermissions) import qualified Galley.Types.Teams as Teams import Imports hiding (head) import Network.HTTP.Client.MultipartFormData @@ -196,9 +196,14 @@ import Util.Options import Util.Types import qualified Web.Cookie as Web import Wire.API.Team (Icon (..)) +import qualified Wire.API.Team as Galley import Wire.API.Team.Feature (FeatureStatus (..), FeatureTrivialConfig (trivialConfig), SSOConfig, WithStatusNoLock (WithStatusNoLock)) import qualified Wire.API.Team.Invitation as TeamInvitation +import Wire.API.Team.Member (NewTeamMember, TeamMemberList) import qualified Wire.API.Team.Member as Member +import qualified Wire.API.Team.Member as Team +import Wire.API.Team.Permission +import Wire.API.Team.Role import qualified Wire.API.Team.Role as Role import Wire.API.User (HandleUpdate (HandleUpdate), UserUpdate) import qualified Wire.API.User as User @@ -462,7 +467,7 @@ createTeamMember :: BrigReq -> GalleyReq -> TeamId -> - Galley.Permissions -> + Permissions -> m UserId createTeamMember brigreq galleyreq teamid perms = do let randomtxt = liftIO $ UUID.toText <$> UUID.nextRandom @@ -484,7 +489,7 @@ addTeamMember :: (HasCallStack, MonadCatch m, MonadIO m, MonadHttp m) => GalleyReq -> TeamId -> - Galley.NewTeamMember -> + NewTeamMember -> m () addTeamMember galleyreq tid mem = void $ @@ -585,7 +590,7 @@ getTeams u gly = do pure $ responseJsonUnsafe r getTeamMemberIds :: HasCallStack => UserId -> TeamId -> TestSpar [UserId] -getTeamMemberIds usr tid = (^. Galley.userId) <$$> getTeamMembers usr tid +getTeamMemberIds usr tid = (^. Team.userId) <$$> getTeamMembers usr tid getTeamMembers :: HasCallStack => UserId -> TeamId -> TestSpar [Member.TeamMember] getTeamMembers usr tid = do @@ -594,15 +599,15 @@ getTeamMembers usr tid = do call $ get (gly . paths ["teams", toByteString' tid, "members"] . zUser usr) UserId -> TeamId -> UserId -> TestSpar () promoteTeamMember usr tid memid = do gly <- view teGalley - let bdy :: Galley.NewTeamMember - bdy = Member.mkNewTeamMember memid Galley.fullPermissions Nothing + let bdy :: NewTeamMember + bdy = Member.mkNewTeamMember memid fullPermissions Nothing call $ put (gly . paths ["teams", toByteString' tid, "members"] . zAuthAccess usr "conn" . json bdy) !!! const 200 === statusCode @@ -1228,7 +1233,7 @@ stdInvitationRequest :: User.Email -> TeamInvitation.InvitationRequest stdInvitationRequest = stdInvitationRequest' Nothing Nothing -- | copied from brig integration tests -stdInvitationRequest' :: Maybe User.Locale -> Maybe Galley.Role -> User.Email -> TeamInvitation.InvitationRequest +stdInvitationRequest' :: Maybe User.Locale -> Maybe Role -> User.Email -> TeamInvitation.InvitationRequest stdInvitationRequest' loc role email = TeamInvitation.InvitationRequest loc role Nothing email Nothing @@ -1272,7 +1277,7 @@ updateTeamMemberRole tid adminUid targetUid role = do . zUser adminUid . zConn "user" . paths ["teams", toByteString' tid, "members"] - . json (Member.mkNewTeamMember targetUid (Galley.rolePermissions role) Nothing) + . json (Member.mkNewTeamMember targetUid (rolePermissions role) Nothing) . expect2xx -- https://wearezeta.atlassian.net/browse/SQSERVICES-1279: change role after successful creation/activation. diff --git a/tools/db/billing-team-member-backfill/billing-team-member-backfill.cabal b/tools/db/billing-team-member-backfill/billing-team-member-backfill.cabal index 8083541636..895b266e7e 100644 --- a/tools/db/billing-team-member-backfill/billing-team-member-backfill.cabal +++ b/tools/db/billing-team-member-backfill/billing-team-member-backfill.cabal @@ -4,7 +4,7 @@ cabal-version: 1.12 -- -- see: https://github.com/sol/hpack -- --- hash: 69b89f4d76894f5121e8fbff700727500dc0f48747dda5b75f74d7ce16ad4f84 +-- hash: c58131b47e82c5c350d69739a326a16c5d5cef209995eddd9dd96c62128c28da name: billing-team-member-backfill version: 1.0.0 @@ -69,11 +69,11 @@ executable billing-team-member-backfill , cassandra-util , conduit , containers - , galley-types , imports , lens , optparse-applicative , text , tinylog , types-common + , wire-api default-language: Haskell2010 diff --git a/tools/db/billing-team-member-backfill/package.yaml b/tools/db/billing-team-member-backfill/package.yaml index 3285cd278d..50a49e8154 100644 --- a/tools/db/billing-team-member-backfill/package.yaml +++ b/tools/db/billing-team-member-backfill/package.yaml @@ -18,7 +18,6 @@ dependencies: - base - cassandra-util - containers -- galley-types - imports - optparse-applicative - text @@ -26,6 +25,7 @@ dependencies: - tinylog - types-common - conduit +- wire-api executables: billing-team-member-backfill: main: Main.hs diff --git a/tools/db/billing-team-member-backfill/src/Work.hs b/tools/db/billing-team-member-backfill/src/Work.hs index e0b80f62ae..84b8b1d604 100644 --- a/tools/db/billing-team-member-backfill/src/Work.hs +++ b/tools/db/billing-team-member-backfill/src/Work.hs @@ -27,10 +27,10 @@ import Data.Conduit.Internal (zipSources) import qualified Data.Conduit.List as C import Data.Id import qualified Data.Set as Set -import Galley.Types.Teams import Imports import System.Logger (Logger) import qualified System.Logger as Log +import Wire.API.Team.Permission runCommand :: Logger -> ClientState -> IO () runCommand l galley = diff --git a/tools/stern/src/Stern/API.hs b/tools/stern/src/Stern/API.hs index ef3dff5d1f..8174db0c76 100644 --- a/tools/stern/src/Stern/API.hs +++ b/tools/stern/src/Stern/API.hs @@ -47,7 +47,6 @@ import qualified Data.Text as T import Data.Text.Encoding (decodeLatin1) import GHC.TypeLits (KnownSymbol) import qualified Galley.Types.Teams.Intra as Team -import qualified Galley.Types.Teams.SearchVisibility as Team import Imports hiding (head) import Network.HTTP.Types import Network.Wai @@ -68,6 +67,7 @@ import System.Logger.Class hiding (Error, name, trace, (.=)) import Util.Options import Wire.API.Team.Feature import qualified Wire.API.Team.Feature as Public +import Wire.API.Team.SearchVisibility import qualified Wire.API.Team.SearchVisibility as Public import qualified Wire.Swagger as Doc @@ -408,7 +408,7 @@ routes = do put "/teams/:tid/search-visibility" (continue setSearchVisibility) $ contentType "application" "json" .&. capture "tid" - .&. jsonRequest @Team.TeamSearchVisibility + .&. jsonRequest @TeamSearchVisibility document "PUT" "setSearchVisibility" $ do summary "Set specific search visibility for the team" Doc.parameter Doc.Path "tid" Doc.bytes' $ @@ -632,9 +632,9 @@ getTeamInfo = fmap json . Intra.getTeamInfo getTeamAdminInfo :: TeamId -> Handler Response getTeamAdminInfo = fmap (json . toAdminInfo) . Intra.getTeamInfo -setSearchVisibility :: JSON ::: TeamId ::: JsonRequest Team.TeamSearchVisibility -> Handler Response +setSearchVisibility :: JSON ::: TeamId ::: JsonRequest TeamSearchVisibility -> Handler Response setSearchVisibility (_ ::: tid ::: req) = do - status :: Team.TeamSearchVisibility <- parseBody req !>> mkError status400 "client-error" + status :: TeamSearchVisibility <- parseBody req !>> mkError status400 "client-error" json <$> Intra.setSearchVisibility tid status getTeamBillingInfo :: TeamId -> Handler Response diff --git a/tools/stern/src/Stern/Intra.hs b/tools/stern/src/Stern/Intra.hs index 3814b8e699..d3ad183faa 100644 --- a/tools/stern/src/Stern/Intra.hs +++ b/tools/stern/src/Stern/Intra.hs @@ -85,11 +85,8 @@ import Data.Text (strip) import Data.Text.Encoding (decodeUtf8, encodeUtf8) import Data.Text.Lazy (pack) import GHC.TypeLits (KnownSymbol) -import Galley.Types -import Galley.Types.Teams import Galley.Types.Teams.Intra import qualified Galley.Types.Teams.Intra as Team -import Galley.Types.Teams.SearchVisibility import Imports import Network.HTTP.Types.Method import Network.HTTP.Types.Status hiding (statusCode) @@ -99,11 +96,15 @@ import Stern.Types import System.Logger.Class hiding (Error, name, (.=)) import qualified System.Logger.Class as Log import UnliftIO.Exception hiding (Handler) +import Wire.API.Conversation import Wire.API.Internal.Notification import Wire.API.Properties import Wire.API.Routes.Internal.Brig.Connection import qualified Wire.API.Routes.Internal.Brig.EJPD as EJPD +import Wire.API.Team import qualified Wire.API.Team.Feature as Public +import Wire.API.Team.Member +import Wire.API.Team.SearchVisibility ------------------------------------------------------------------------------- diff --git a/tools/stern/src/Stern/Types.hs b/tools/stern/src/Stern/Types.hs index 9af0409b2b..f51c98dd0c 100644 --- a/tools/stern/src/Stern/Types.hs +++ b/tools/stern/src/Stern/Types.hs @@ -32,10 +32,11 @@ import Data.ByteString.Conversion import Data.Json.Util import Data.Range import Galley.Types.Teams -import Galley.Types.Teams.Intra +import Galley.Types.Teams.Intra (TeamData) import Imports import Wire.API.Properties -import Wire.API.Team.Member (teamMemberJson) +import Wire.API.Team.Member +import Wire.API.Team.Permission newtype TeamMemberInfo = TeamMemberInfo {tm :: TeamMember}