diff --git a/changelog.d/0-release-notes/pr-1937 b/changelog.d/0-release-notes/pr-1937 deleted file mode 100644 index 85e7a39820c..00000000000 --- a/changelog.d/0-release-notes/pr-1937 +++ /dev/null @@ -1 +0,0 @@ -If you have `selfDeletingMessages` configured in `galley.yaml`, add `lockStatus: unlocked`. diff --git a/changelog.d/1-api-changes/get-feature-config-seld-del-msgs-with-payment-status b/changelog.d/1-api-changes/get-feature-config-seld-del-msgs-with-payment-status deleted file mode 100644 index d1855d92dde..00000000000 --- a/changelog.d/1-api-changes/get-feature-config-seld-del-msgs-with-payment-status +++ /dev/null @@ -1 +0,0 @@ -get team feature config for self deleting messages response includes lock status diff --git a/changelog.d/1-api-changes/set-payment-status-self-del-msgs b/changelog.d/1-api-changes/set-payment-status-self-del-msgs deleted file mode 100644 index 3cca58aab4f..00000000000 --- a/changelog.d/1-api-changes/set-payment-status-self-del-msgs +++ /dev/null @@ -1 +0,0 @@ -new internal endpoints for setting the lock status of self deleting messages diff --git a/changelog.d/2-features/set-payment-status-for-self-del-msgs b/changelog.d/2-features/set-payment-status-for-self-del-msgs deleted file mode 100644 index 1b0c9e647be..00000000000 --- a/changelog.d/2-features/set-payment-status-for-self-del-msgs +++ /dev/null @@ -1 +0,0 @@ -Lock status for the self deleting messages feature can be set internally by ibis and customer support diff --git a/docs/reference/cassandra-schema.cql b/docs/reference/cassandra-schema.cql index 43505d0d58f..7b70e2f4642 100644 --- a/docs/reference/cassandra-schema.cql +++ b/docs/reference/cassandra-schema.cql @@ -422,7 +422,6 @@ CREATE TABLE galley_test.team_features ( file_sharing int, legalhold_status int, search_visibility_status int, - self_deleting_messages_lock_status int, self_deleting_messages_status int, self_deleting_messages_ttl int, sso_status int, diff --git a/libs/galley-types/src/Galley/Types/Teams.hs b/libs/galley-types/src/Galley/Types/Teams.hs index d1b0d1851ab..8e727e90a1d 100644 --- a/libs/galley-types/src/Galley/Types/Teams.hs +++ b/libs/galley-types/src/Galley/Types/Teams.hs @@ -212,11 +212,11 @@ data FeatureFlags = FeatureFlags { _flagSSO :: !FeatureSSO, _flagLegalHold :: !FeatureLegalHold, _flagTeamSearchVisibility :: !FeatureTeamSearchVisibility, - _flagAppLockDefaults :: !(Defaults (TeamFeatureStatus 'WithoutLockStatus 'TeamFeatureAppLock)), - _flagClassifiedDomains :: !(TeamFeatureStatus 'WithoutLockStatus 'TeamFeatureClassifiedDomains), - _flagFileSharing :: !(Defaults (TeamFeatureStatus 'WithoutLockStatus 'TeamFeatureFileSharing)), - _flagConferenceCalling :: !(Defaults (TeamFeatureStatus 'WithoutLockStatus 'TeamFeatureConferenceCalling)), - _flagSelfDeletingMessages :: !(Defaults (TeamFeatureStatus 'WithLockStatus 'TeamFeatureSelfDeletingMessages)) + _flagAppLockDefaults :: !(Defaults (TeamFeatureStatus 'TeamFeatureAppLock)), + _flagClassifiedDomains :: !(TeamFeatureStatus 'TeamFeatureClassifiedDomains), + _flagFileSharing :: !(Defaults (TeamFeatureStatus 'TeamFeatureFileSharing)), + _flagConferenceCalling :: !(Defaults (TeamFeatureStatus 'TeamFeatureConferenceCalling)), + _flagSelfDeletingMessages :: !(Defaults (TeamFeatureStatus 'TeamFeatureSelfDeletingMessages)) } deriving (Eq, Show, Generic) diff --git a/libs/wire-api/src/Wire/API/Routes/Internal/Brig.hs b/libs/wire-api/src/Wire/API/Routes/Internal/Brig.hs index 5027a554056..51e34b18d40 100644 --- a/libs/wire-api/src/Wire/API/Routes/Internal/Brig.hs +++ b/libs/wire-api/src/Wire/API/Routes/Internal/Brig.hs @@ -66,7 +66,7 @@ type GetAccountFeatureConfig = :> Capture "uid" UserId :> "features" :> "conferenceCalling" - :> Get '[Servant.JSON] (ApiFt.TeamFeatureStatus 'ApiFt.WithLockStatus 'ApiFt.TeamFeatureConferenceCalling) + :> Get '[Servant.JSON] (ApiFt.TeamFeatureStatus 'ApiFt.TeamFeatureConferenceCalling) type PutAccountFeatureConfig = Summary @@ -75,7 +75,7 @@ type PutAccountFeatureConfig = :> Capture "uid" UserId :> "features" :> "conferenceCalling" - :> Servant.ReqBody '[Servant.JSON] (ApiFt.TeamFeatureStatus 'ApiFt.WithoutLockStatus 'ApiFt.TeamFeatureConferenceCalling) + :> Servant.ReqBody '[Servant.JSON] (ApiFt.TeamFeatureStatus 'ApiFt.TeamFeatureConferenceCalling) :> Put '[Servant.JSON] NoContent type DeleteAccountFeatureConfig = diff --git a/libs/wire-api/src/Wire/API/Routes/Public/Galley.hs b/libs/wire-api/src/Wire/API/Routes/Public/Galley.hs index ff1dc2ed877..7aafbfa7bf7 100644 --- a/libs/wire-api/src/Wire/API/Routes/Public/Galley.hs +++ b/libs/wire-api/src/Wire/API/Routes/Public/Galley.hs @@ -623,7 +623,7 @@ data Api routes = Api :- FeatureStatusPut 'TeamFeatureSearchVisibility, teamFeatureStatusSearchVisibilityDeprecatedGet :: routes - :- FeatureStatusDeprecatedGet 'WithoutLockStatus 'TeamFeatureSearchVisibility, + :- FeatureStatusDeprecatedGet 'TeamFeatureSearchVisibility, teamFeatureStatusSearchVisibilityDeprecatedPut :: routes :- FeatureStatusDeprecatedPut 'TeamFeatureSearchVisibility, @@ -632,13 +632,13 @@ data Api routes = Api :- FeatureStatusGet 'TeamFeatureValidateSAMLEmails, teamFeatureStatusValidateSAMLEmailsDeprecatedGet :: routes - :- FeatureStatusDeprecatedGet 'WithoutLockStatus 'TeamFeatureValidateSAMLEmails, + :- FeatureStatusDeprecatedGet 'TeamFeatureValidateSAMLEmails, teamFeatureStatusDigitalSignaturesGet :: routes :- FeatureStatusGet 'TeamFeatureDigitalSignatures, teamFeatureStatusDigitalSignaturesDeprecatedGet :: routes - :- FeatureStatusDeprecatedGet 'WithoutLockStatus 'TeamFeatureDigitalSignatures, + :- FeatureStatusDeprecatedGet 'TeamFeatureDigitalSignatures, teamFeatureStatusAppLockGet :: routes :- FeatureStatusGet 'TeamFeatureAppLock, @@ -668,34 +668,34 @@ data Api routes = Api :- AllFeatureConfigsGet, featureConfigLegalHoldGet :: routes - :- FeatureConfigGet 'WithoutLockStatus 'TeamFeatureLegalHold, + :- FeatureConfigGet 'TeamFeatureLegalHold, featureConfigSSOGet :: routes - :- FeatureConfigGet 'WithoutLockStatus 'TeamFeatureSSO, + :- FeatureConfigGet 'TeamFeatureSSO, featureConfigSearchVisibilityGet :: routes - :- FeatureConfigGet 'WithoutLockStatus 'TeamFeatureSearchVisibility, + :- FeatureConfigGet 'TeamFeatureSearchVisibility, featureConfigValidateSAMLEmailsGet :: routes - :- FeatureConfigGet 'WithoutLockStatus 'TeamFeatureValidateSAMLEmails, + :- FeatureConfigGet 'TeamFeatureValidateSAMLEmails, featureConfigDigitalSignaturesGet :: routes - :- FeatureConfigGet 'WithoutLockStatus 'TeamFeatureDigitalSignatures, + :- FeatureConfigGet 'TeamFeatureDigitalSignatures, featureConfigAppLockGet :: routes - :- FeatureConfigGet 'WithoutLockStatus 'TeamFeatureAppLock, + :- FeatureConfigGet 'TeamFeatureAppLock, featureConfigFileSharingGet :: routes - :- FeatureConfigGet 'WithoutLockStatus 'TeamFeatureFileSharing, + :- FeatureConfigGet 'TeamFeatureFileSharing, featureConfigClassifiedDomainsGet :: routes - :- FeatureConfigGet 'WithoutLockStatus 'TeamFeatureClassifiedDomains, + :- FeatureConfigGet 'TeamFeatureClassifiedDomains, featureConfigConferenceCallingGet :: routes - :- FeatureConfigGet 'WithoutLockStatus 'TeamFeatureConferenceCalling, + :- FeatureConfigGet 'TeamFeatureConferenceCalling, featureConfigSelfDeletingMessagesGet :: routes - :- FeatureConfigGet 'WithLockStatus 'TeamFeatureSelfDeletingMessages + :- FeatureConfigGet 'TeamFeatureSelfDeletingMessages } deriving (Generic) @@ -708,7 +708,7 @@ type FeatureStatusGet featureName = :> Capture "tid" TeamId :> "features" :> KnownTeamFeatureNameSymbol featureName - :> Get '[Servant.JSON] (TeamFeatureStatus 'WithLockStatus featureName) + :> Get '[Servant.JSON] (TeamFeatureStatus featureName) type FeatureStatusPut featureName = Summary (AppendSymbol "Put config for " (KnownTeamFeatureNameSymbol featureName)) @@ -717,18 +717,18 @@ type FeatureStatusPut featureName = :> Capture "tid" TeamId :> "features" :> KnownTeamFeatureNameSymbol featureName - :> ReqBody '[Servant.JSON] (TeamFeatureStatus 'WithoutLockStatus featureName) - :> Put '[Servant.JSON] (TeamFeatureStatus 'WithoutLockStatus featureName) + :> ReqBody '[Servant.JSON] (TeamFeatureStatus featureName) + :> Put '[Servant.JSON] (TeamFeatureStatus featureName) -- | A type for a GET endpoint for a feature with a deprecated path -type FeatureStatusDeprecatedGet ps featureName = +type FeatureStatusDeprecatedGet featureName = Summary (AppendSymbol "[deprecated] Get config for " (KnownTeamFeatureNameSymbol featureName)) :> ZUser :> "teams" :> Capture "tid" TeamId :> "features" :> DeprecatedFeatureName featureName - :> Get '[Servant.JSON] (TeamFeatureStatus ps featureName) + :> Get '[Servant.JSON] (TeamFeatureStatus featureName) -- | A type for a PUT endpoint for a feature with a deprecated path type FeatureStatusDeprecatedPut featureName = @@ -738,15 +738,15 @@ type FeatureStatusDeprecatedPut featureName = :> Capture "tid" TeamId :> "features" :> DeprecatedFeatureName featureName - :> ReqBody '[Servant.JSON] (TeamFeatureStatus 'WithoutLockStatus featureName) - :> Put '[Servant.JSON] (TeamFeatureStatus 'WithoutLockStatus featureName) + :> ReqBody '[Servant.JSON] (TeamFeatureStatus featureName) + :> Put '[Servant.JSON] (TeamFeatureStatus featureName) -type FeatureConfigGet ps featureName = +type FeatureConfigGet featureName = Summary (AppendSymbol "Get feature config for feature " (KnownTeamFeatureNameSymbol featureName)) :> ZUser :> "feature-configs" :> KnownTeamFeatureNameSymbol featureName - :> Get '[Servant.JSON] (TeamFeatureStatus ps featureName) + :> Get '[Servant.JSON] (TeamFeatureStatus featureName) type AllFeatureConfigsGet = Summary "Get configurations of all features" diff --git a/libs/wire-api/src/Wire/API/Routes/Public/LegalHold.hs b/libs/wire-api/src/Wire/API/Routes/Public/LegalHold.hs index 6c3db162ae9..6bb24b75430 100644 --- a/libs/wire-api/src/Wire/API/Routes/Public/LegalHold.hs +++ b/libs/wire-api/src/Wire/API/Routes/Public/LegalHold.hs @@ -52,9 +52,9 @@ type PublicAPI = type InternalAPI = "i" :> "teams" :> Capture "tid" TeamId :> "legalhold" - :> Get '[JSON] (TeamFeatureStatus 'WithLockStatus 'TeamFeatureLegalHold) + :> Get '[JSON] (TeamFeatureStatus 'TeamFeatureLegalHold) :<|> "i" :> "teams" :> Capture "tid" TeamId :> "legalhold" - :> ReqBody '[JSON] (TeamFeatureStatus 'WithoutLockStatus 'TeamFeatureLegalHold) + :> ReqBody '[JSON] (TeamFeatureStatus 'TeamFeatureLegalHold) :> Put '[] NoContent swaggerDoc :: Swagger diff --git a/libs/wire-api/src/Wire/API/Swagger.hs b/libs/wire-api/src/Wire/API/Swagger.hs index 68160851619..f746c3465c3 100644 --- a/libs/wire-api/src/Wire/API/Swagger.hs +++ b/libs/wire-api/src/Wire/API/Swagger.hs @@ -129,7 +129,6 @@ models = Team.Feature.modelTeamFeatureAppLockConfig, Team.Feature.modelTeamFeatureClassifiedDomainsConfig, Team.Feature.modelTeamFeatureSelfDeletingMessagesConfig, - Team.Feature.modelLockStatus, Team.Invitation.modelTeamInvitation, Team.Invitation.modelTeamInvitationList, Team.Invitation.modelTeamInvitationRequest, diff --git a/libs/wire-api/src/Wire/API/Team/Feature.hs b/libs/wire-api/src/Wire/API/Team/Feature.hs index aa1bdc89726..f466fe3102c 100644 --- a/libs/wire-api/src/Wire/API/Team/Feature.hs +++ b/libs/wire-api/src/Wire/API/Team/Feature.hs @@ -30,12 +30,8 @@ module Wire.API.Team.Feature KnownTeamFeatureName (..), TeamFeatureStatusNoConfig (..), TeamFeatureStatusWithConfig (..), - TeamFeatureStatusWithConfigAndLockStatus (..), HasDeprecatedFeatureName (..), AllFeatureConfigs (..), - LockStatus (..), - LockStatusValue (..), - IncludeLockStatus (..), defaultAppLockStatus, defaultClassifiedDomains, defaultSelfDeletingMessagesStatus, @@ -48,9 +44,7 @@ module Wire.API.Team.Feature modelTeamFeatureAppLockConfig, modelTeamFeatureClassifiedDomainsConfig, modelTeamFeatureSelfDeletingMessagesConfig, - modelTeamFeatureStatusWithConfigAndLockStatus, modelForTeamFeature, - modelLockStatus, ) where @@ -58,9 +52,8 @@ import qualified Cassandra.CQL as Cass import Control.Lens.Combinators (dimap) import qualified Data.Aeson as Aeson import qualified Data.Attoparsec.ByteString as Parser -import Data.ByteString.Conversion (FromByteString (..), ToByteString (..), fromByteString, toByteString') +import Data.ByteString.Conversion (FromByteString (..), ToByteString (..), toByteString') import Data.Domain (Domain) -import Data.Either.Extra (maybeToEither) import Data.Kind (Constraint) import Data.Schema import Data.String.Conversions (cs) @@ -71,7 +64,6 @@ import qualified Data.Text.Encoding as T import Deriving.Aeson import GHC.TypeLits (Symbol) import Imports -import Servant (FromHttpApiData (..)) import Test.QuickCheck.Arbitrary (arbitrary) import Wire.API.Arbitrary (Arbitrary, GenericUniform (..)) @@ -280,8 +272,8 @@ instance Cass.Cql TeamFeatureStatusValue where ctype = Cass.Tagged Cass.IntColumn fromCql (Cass.CqlInt n) = case n of - 0 -> pure TeamFeatureDisabled - 1 -> pure TeamFeatureEnabled + 0 -> pure $ TeamFeatureDisabled + 1 -> pure $ TeamFeatureEnabled _ -> Left "fromCql: Invalid TeamFeatureStatusValue" fromCql _ = Left "fromCql: TeamFeatureStatusValue: CqlInt expected" @@ -291,22 +283,19 @@ instance Cass.Cql TeamFeatureStatusValue where ---------------------------------------------------------------------- -- TeamFeatureStatus -data IncludeLockStatus = WithLockStatus | WithoutLockStatus +type family TeamFeatureStatus (a :: TeamFeatureName) :: * where + TeamFeatureStatus 'TeamFeatureLegalHold = TeamFeatureStatusNoConfig + TeamFeatureStatus 'TeamFeatureSSO = TeamFeatureStatusNoConfig + TeamFeatureStatus 'TeamFeatureSearchVisibility = TeamFeatureStatusNoConfig + TeamFeatureStatus 'TeamFeatureValidateSAMLEmails = TeamFeatureStatusNoConfig + TeamFeatureStatus 'TeamFeatureDigitalSignatures = TeamFeatureStatusNoConfig + TeamFeatureStatus 'TeamFeatureAppLock = TeamFeatureStatusWithConfig TeamFeatureAppLockConfig + TeamFeatureStatus 'TeamFeatureFileSharing = TeamFeatureStatusNoConfig + TeamFeatureStatus 'TeamFeatureClassifiedDomains = TeamFeatureStatusWithConfig TeamFeatureClassifiedDomainsConfig + TeamFeatureStatus 'TeamFeatureConferenceCalling = TeamFeatureStatusNoConfig + TeamFeatureStatus 'TeamFeatureSelfDeletingMessages = TeamFeatureStatusWithConfig TeamFeatureSelfDeletingMessagesConfig -type family TeamFeatureStatus (ps :: IncludeLockStatus) (a :: TeamFeatureName) :: * where - TeamFeatureStatus _ 'TeamFeatureLegalHold = TeamFeatureStatusNoConfig - TeamFeatureStatus _ 'TeamFeatureSSO = TeamFeatureStatusNoConfig - TeamFeatureStatus _ 'TeamFeatureSearchVisibility = TeamFeatureStatusNoConfig - TeamFeatureStatus _ 'TeamFeatureValidateSAMLEmails = TeamFeatureStatusNoConfig - TeamFeatureStatus _ 'TeamFeatureDigitalSignatures = TeamFeatureStatusNoConfig - TeamFeatureStatus _ 'TeamFeatureAppLock = TeamFeatureStatusWithConfig TeamFeatureAppLockConfig - TeamFeatureStatus _ 'TeamFeatureFileSharing = TeamFeatureStatusNoConfig - TeamFeatureStatus _ 'TeamFeatureClassifiedDomains = TeamFeatureStatusWithConfig TeamFeatureClassifiedDomainsConfig - TeamFeatureStatus _ 'TeamFeatureConferenceCalling = TeamFeatureStatusNoConfig - TeamFeatureStatus 'WithoutLockStatus 'TeamFeatureSelfDeletingMessages = TeamFeatureStatusWithConfig TeamFeatureSelfDeletingMessagesConfig - TeamFeatureStatus 'WithLockStatus 'TeamFeatureSelfDeletingMessages = TeamFeatureStatusWithConfigAndLockStatus TeamFeatureSelfDeletingMessagesConfig - -type FeatureHasNoConfig (ps :: IncludeLockStatus) (a :: TeamFeatureName) = (TeamFeatureStatus ps a ~ TeamFeatureStatusNoConfig) :: Constraint +type FeatureHasNoConfig (a :: TeamFeatureName) = (TeamFeatureStatus a ~ TeamFeatureStatusNoConfig) :: Constraint -- if you add a new constructor here, don't forget to add it to the swagger (1.2) docs in "Wire.API.Swagger"! modelForTeamFeature :: TeamFeatureName -> Doc.Model @@ -371,32 +360,6 @@ instance ToSchema cfg => ToSchema (TeamFeatureStatusWithConfig cfg) where <$> tfwcStatus .= field "status" schema <*> tfwcConfig .= field "config" schema -data TeamFeatureStatusWithConfigAndLockStatus (cfg :: *) = TeamFeatureStatusWithConfigAndLockStatus - { tfwcapsStatus :: TeamFeatureStatusValue, - tfwcapsConfig :: cfg, - tfwcapsLockStatus :: LockStatusValue - } - deriving stock (Eq, Show, Generic, Typeable) - deriving (ToJSON, FromJSON, S.ToSchema) via (Schema (TeamFeatureStatusWithConfigAndLockStatus cfg)) - -instance Arbitrary cfg => Arbitrary (TeamFeatureStatusWithConfigAndLockStatus cfg) where - arbitrary = TeamFeatureStatusWithConfigAndLockStatus <$> arbitrary <*> arbitrary <*> arbitrary - -modelTeamFeatureStatusWithConfigAndLockStatus :: TeamFeatureName -> Doc.Model -> Doc.Model -modelTeamFeatureStatusWithConfigAndLockStatus name cfgModel = Doc.defineModel (cs $ show name) $ do - Doc.description $ "Status and config of " <> cs (show name) - Doc.property "status" typeTeamFeatureStatusValue $ Doc.description "status" - Doc.property "config" (Doc.ref cfgModel) $ Doc.description "config" - Doc.property "lockStatus" typeLockStatusValue $ Doc.description "config" - -instance ToSchema cfg => ToSchema (TeamFeatureStatusWithConfigAndLockStatus cfg) where - schema = - object "TeamFeatureStatusWithConfigAndLockStatus" $ - TeamFeatureStatusWithConfigAndLockStatus - <$> tfwcapsStatus .= field "status" schema - <*> tfwcapsConfig .= field "config" schema - <*> tfwcapsLockStatus .= field "lockStatus" schema - ---------------------------------------------------------------------- -- TeamFeatureClassifiedDomainsConfig @@ -420,10 +383,7 @@ modelTeamFeatureClassifiedDomainsConfig = Doc.property "domains" (Doc.array Doc.string') $ Doc.description "domains" defaultClassifiedDomains :: TeamFeatureStatusWithConfig TeamFeatureClassifiedDomainsConfig -defaultClassifiedDomains = - TeamFeatureStatusWithConfig - TeamFeatureDisabled - (TeamFeatureClassifiedDomainsConfig []) +defaultClassifiedDomains = TeamFeatureStatusWithConfig TeamFeatureDisabled (TeamFeatureClassifiedDomainsConfig []) ---------------------------------------------------------------------- -- TeamFeatureAppLockConfig @@ -485,82 +445,11 @@ modelTeamFeatureSelfDeletingMessagesConfig = Doc.defineModel "TeamFeatureSelfDeletingMessagesConfig" $ do Doc.property "enforcedTimeoutSeconds" Doc.int32' $ Doc.description "optional; default: `0` (no enforcement)" -defaultSelfDeletingMessagesStatus :: TeamFeatureStatusWithConfigAndLockStatus TeamFeatureSelfDeletingMessagesConfig +defaultSelfDeletingMessagesStatus :: TeamFeatureStatusWithConfig TeamFeatureSelfDeletingMessagesConfig defaultSelfDeletingMessagesStatus = - TeamFeatureStatusWithConfigAndLockStatus + TeamFeatureStatusWithConfig TeamFeatureEnabled (TeamFeatureSelfDeletingMessagesConfig 0) - Unlocked - ----------------------------------------------------------------------- --- LockStatus - -instance FromHttpApiData LockStatusValue where - parseUrlPiece = maybeToEither "Invalid lock status" . fromByteString . cs - -data LockStatusValue = Locked | Unlocked - deriving stock (Eq, Show, Generic) - deriving (Arbitrary) via (GenericUniform LockStatusValue) - deriving (ToJSON, FromJSON, S.ToSchema) via (Schema LockStatusValue) - -newtype LockStatus = LockStatus - { lockStatus :: LockStatusValue - } - deriving stock (Eq, Show, Generic) - deriving (FromJSON, ToJSON, S.ToSchema) via (Schema LockStatus) - deriving (Arbitrary) via (GenericUniform LockStatus) - -instance ToSchema LockStatus where - schema = - object "LockStatus" $ - LockStatus - <$> lockStatus .= field "lockStatus" schema - -modelLockStatus :: Doc.Model -modelLockStatus = - Doc.defineModel "LockStatus" $ do - Doc.property "lockStatus" typeLockStatusValue $ Doc.description "" - -typeLockStatusValue :: Doc.DataType -typeLockStatusValue = - Doc.string $ - Doc.enum - [ "locked", - "unlocked" - ] - -instance ToSchema LockStatusValue where - schema = - enum @Text "LockStatusValue" $ - mconcat - [ element "locked" Locked, - element "unlocked" Unlocked - ] - -instance ToByteString LockStatusValue where - builder Locked = "locked" - builder Unlocked = "unlocked" - -instance FromByteString LockStatusValue where - parser = - Parser.takeByteString >>= \b -> - case T.decodeUtf8' b of - Right "locked" -> pure Locked - Right "unlocked" -> pure Unlocked - Right t -> fail $ "Invalid LockStatusValue: " <> T.unpack t - Left e -> fail $ "Invalid LockStatusValue: " <> show e - -instance Cass.Cql LockStatusValue where - ctype = Cass.Tagged Cass.IntColumn - - fromCql (Cass.CqlInt n) = case n of - 0 -> pure Locked - 1 -> pure Unlocked - _ -> Left "fromCql: Invalid LockStatusValue" - fromCql _ = Left "fromCql: LockStatusValue: CqlInt expected" - - toCql Locked = Cass.CqlInt 0 - toCql Unlocked = Cass.CqlInt 1 ---------------------------------------------------------------------- -- internal diff --git a/libs/wire-api/test/golden/Test/Wire/API/Golden/Generator.hs b/libs/wire-api/test/golden/Test/Wire/API/Golden/Generator.hs index e4daf3da24b..4d022f0eac0 100644 --- a/libs/wire-api/test/golden/Test/Wire/API/Golden/Generator.hs +++ b/libs/wire-api/test/golden/Test/Wire/API/Golden/Generator.hs @@ -328,8 +328,8 @@ generateTestModule = do generateBindingModule @Team.TeamDeleteData "team" ref generateBindingModule @Team.Conversation.TeamConversation "team" ref generateBindingModule @Team.Conversation.TeamConversationList "team" ref - generateBindingModule @(Team.Feature.TeamFeatureStatus 'Team.Feature.WithoutLockStatus 'Team.Feature.TeamFeatureLegalHold) "team" ref - generateBindingModule @(Team.Feature.TeamFeatureStatus 'Team.Feature.WithoutLockStatus 'Team.Feature.TeamFeatureAppLock) "team" ref + generateBindingModule @(Team.Feature.TeamFeatureStatus 'Team.Feature.TeamFeatureLegalHold) "team" ref + generateBindingModule @(Team.Feature.TeamFeatureStatus 'Team.Feature.TeamFeatureAppLock) "team" ref generateBindingModule @Team.Feature.TeamFeatureStatusValue "team" ref generateBindingModule @Team.Invitation.InvitationRequest "team" ref generateBindingModule @Team.Invitation.Invitation "team" ref diff --git a/libs/wire-api/test/unit/Test/Wire/API/Roundtrip/Aeson.hs b/libs/wire-api/test/unit/Test/Wire/API/Roundtrip/Aeson.hs index 05501016904..6e09181e543 100644 --- a/libs/wire-api/test/unit/Test/Wire/API/Roundtrip/Aeson.hs +++ b/libs/wire-api/test/unit/Test/Wire/API/Roundtrip/Aeson.hs @@ -195,21 +195,17 @@ tests = testRoundTrip @Team.TeamDeleteData, testRoundTrip @Team.Conversation.TeamConversation, testRoundTrip @Team.Conversation.TeamConversationList, - testRoundTrip @(Team.Feature.TeamFeatureStatus 'Team.Feature.WithoutLockStatus 'Team.Feature.TeamFeatureLegalHold), - testRoundTrip @(Team.Feature.TeamFeatureStatus 'Team.Feature.WithoutLockStatus 'Team.Feature.TeamFeatureSSO), - testRoundTrip @(Team.Feature.TeamFeatureStatus 'Team.Feature.WithoutLockStatus 'Team.Feature.TeamFeatureSearchVisibility), - testRoundTrip @(Team.Feature.TeamFeatureStatus 'Team.Feature.WithoutLockStatus 'Team.Feature.TeamFeatureValidateSAMLEmails), - testRoundTrip @(Team.Feature.TeamFeatureStatus 'Team.Feature.WithoutLockStatus 'Team.Feature.TeamFeatureDigitalSignatures), - testRoundTrip @(Team.Feature.TeamFeatureStatus 'Team.Feature.WithoutLockStatus 'Team.Feature.TeamFeatureAppLock), - testRoundTrip @(Team.Feature.TeamFeatureStatus 'Team.Feature.WithoutLockStatus 'Team.Feature.TeamFeatureFileSharing), - testRoundTrip @(Team.Feature.TeamFeatureStatus 'Team.Feature.WithoutLockStatus 'Team.Feature.TeamFeatureClassifiedDomains), - testRoundTrip @(Team.Feature.TeamFeatureStatus 'Team.Feature.WithoutLockStatus 'Team.Feature.TeamFeatureConferenceCalling), - testRoundTrip @(Team.Feature.TeamFeatureStatus 'Team.Feature.WithoutLockStatus 'Team.Feature.TeamFeatureSelfDeletingMessages), - testRoundTrip @(Team.Feature.TeamFeatureStatus 'Team.Feature.WithLockStatus 'Team.Feature.TeamFeatureSelfDeletingMessages), - testRoundTrip @(Team.Feature.TeamFeatureStatus 'Team.Feature.WithoutLockStatus 'Team.Feature.TeamFeatureSelfDeletingMessages), + testRoundTrip @(Team.Feature.TeamFeatureStatus 'Team.Feature.TeamFeatureLegalHold), + testRoundTrip @(Team.Feature.TeamFeatureStatus 'Team.Feature.TeamFeatureSSO), + testRoundTrip @(Team.Feature.TeamFeatureStatus 'Team.Feature.TeamFeatureSearchVisibility), + testRoundTrip @(Team.Feature.TeamFeatureStatus 'Team.Feature.TeamFeatureValidateSAMLEmails), + testRoundTrip @(Team.Feature.TeamFeatureStatus 'Team.Feature.TeamFeatureDigitalSignatures), + testRoundTrip @(Team.Feature.TeamFeatureStatus 'Team.Feature.TeamFeatureAppLock), + testRoundTrip @(Team.Feature.TeamFeatureStatus 'Team.Feature.TeamFeatureFileSharing), + testRoundTrip @(Team.Feature.TeamFeatureStatus 'Team.Feature.TeamFeatureClassifiedDomains), + testRoundTrip @(Team.Feature.TeamFeatureStatus 'Team.Feature.TeamFeatureConferenceCalling), + testRoundTrip @(Team.Feature.TeamFeatureStatus 'Team.Feature.TeamFeatureSelfDeletingMessages), testRoundTrip @Team.Feature.TeamFeatureStatusValue, - testRoundTrip @Team.Feature.LockStatusValue, - testRoundTrip @Team.Feature.LockStatus, testRoundTrip @Team.Invitation.InvitationRequest, testRoundTrip @Team.Invitation.Invitation, testRoundTrip @Team.Invitation.InvitationList, diff --git a/services/brig/src/Brig/IO/Intra.hs b/services/brig/src/Brig/IO/Intra.hs index 3a906829fea..df063cbdd0d 100644 --- a/services/brig/src/Brig/IO/Intra.hs +++ b/services/brig/src/Brig/IO/Intra.hs @@ -121,7 +121,7 @@ import Wire.API.Federation.API.Brig import Wire.API.Federation.Client import Wire.API.Federation.Error (federationNotImplemented) import Wire.API.Message (UserClients) -import Wire.API.Team.Feature (IncludeLockStatus (..), TeamFeatureName (..), TeamFeatureStatus) +import Wire.API.Team.Feature (TeamFeatureName (..), TeamFeatureStatus) import Wire.API.Team.LegalHold (LegalholdProtectee) ----------------------------------------------------------------------------- @@ -968,7 +968,7 @@ getTeamName tid = do . expect2xx -- | Calls 'Galley.API.getTeamFeatureStatusH'. -getTeamLegalHoldStatus :: TeamId -> AppIO (TeamFeatureStatus 'WithoutLockStatus 'TeamFeatureLegalHold) +getTeamLegalHoldStatus :: TeamId -> AppIO (TeamFeatureStatus 'TeamFeatureLegalHold) getTeamLegalHoldStatus tid = do debug $ remote "galley" . msg (val "Get legalhold settings") galleyRequest GET req >>= decodeBody "galley" diff --git a/services/brig/src/Brig/Options.hs b/services/brig/src/Brig/Options.hs index 874fd3a4a1c..7710b7608ef 100644 --- a/services/brig/src/Brig/Options.hs +++ b/services/brig/src/Brig/Options.hs @@ -508,8 +508,8 @@ data Settings = Settings -- they are grandfathered), and feature-specific extra data (eg., TLL for self-deleting -- messages). For now, we have something quick & simple. data AccountFeatureConfigs = AccountFeatureConfigs - { afcConferenceCallingDefNew :: !(ApiFT.TeamFeatureStatus 'ApiFT.WithoutLockStatus 'ApiFT.TeamFeatureConferenceCalling), - afcConferenceCallingDefNull :: !(ApiFT.TeamFeatureStatus 'ApiFT.WithoutLockStatus 'ApiFT.TeamFeatureConferenceCalling) + { afcConferenceCallingDefNew :: !(ApiFT.TeamFeatureStatus 'ApiFT.TeamFeatureConferenceCalling), + afcConferenceCallingDefNull :: !(ApiFT.TeamFeatureStatus 'ApiFT.TeamFeatureConferenceCalling) } deriving (Show, Eq, Generic) deriving (Arbitrary) via (GenericUniform AccountFeatureConfigs) diff --git a/services/galley/galley.cabal b/services/galley/galley.cabal index d6247bd175b..b1f68193ca3 100644 --- a/services/galley/galley.cabal +++ b/services/galley/galley.cabal @@ -437,7 +437,6 @@ executable galley-schema V52_FeatureConferenceCalling V53_AddRemoteConvStatus V54_TeamFeatureSelfDeletingMessages - V55_SelfDeletingMessagesLockStatus Paths_galley hs-source-dirs: schema/src diff --git a/services/galley/schema/src/Main.hs b/services/galley/schema/src/Main.hs index e6bed347169..369a4644368 100644 --- a/services/galley/schema/src/Main.hs +++ b/services/galley/schema/src/Main.hs @@ -57,7 +57,6 @@ import qualified V51_FeatureFileSharing import qualified V52_FeatureConferenceCalling import qualified V53_AddRemoteConvStatus import qualified V54_TeamFeatureSelfDeletingMessages -import qualified V55_SelfDeletingMessagesLockStatus main :: IO () main = do @@ -100,10 +99,9 @@ main = do V51_FeatureFileSharing.migration, V52_FeatureConferenceCalling.migration, V53_AddRemoteConvStatus.migration, - V54_TeamFeatureSelfDeletingMessages.migration, - V55_SelfDeletingMessagesLockStatus.migration + V54_TeamFeatureSelfDeletingMessages.migration -- When adding migrations here, don't forget to update - -- 'schemaVersion' in Galley.Cassandra + -- 'schemaVersion' in Galley.Data -- (see also docs/developer/cassandra-interaction.md) -- -- FUTUREWORK: once #1726 has made its way to master/production, diff --git a/services/galley/schema/src/V55_SelfDeletingMessagesLockStatus.hs b/services/galley/schema/src/V55_SelfDeletingMessagesLockStatus.hs deleted file mode 100644 index 58e61690693..00000000000 --- a/services/galley/schema/src/V55_SelfDeletingMessagesLockStatus.hs +++ /dev/null @@ -1,33 +0,0 @@ --- This file is part of the Wire Server implementation. --- --- Copyright (C) 2020 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 V55_SelfDeletingMessagesLockStatus - ( migration, - ) -where - -import Cassandra.Schema -import Imports -import Text.RawString.QQ - -migration :: Migration -migration = Migration 55 "Add payment status config for self deleting messages team feature" $ do - schema' - [r| ALTER TABLE team_features ADD ( - self_deleting_messages_lock_status int - ) - |] diff --git a/services/galley/src/Galley/API/Error.hs b/services/galley/src/Galley/API/Error.hs index 2f49164b8ba..34c6ec0d3c8 100644 --- a/services/galley/src/Galley/API/Error.hs +++ b/services/galley/src/Galley/API/Error.hs @@ -161,14 +161,12 @@ data TeamFeatureError | LegalHoldFeatureFlagNotEnabled | LegalHoldWhitelistedOnly | DisableSsoNotImplemented - | FeatureLocked instance APIError TeamFeatureError where toWai AppLockinactivityTimeoutTooLow = inactivityTimeoutTooLow toWai LegalHoldFeatureFlagNotEnabled = legalHoldFeatureFlagNotEnabled toWai LegalHoldWhitelistedOnly = legalHoldWhitelistedOnly toWai DisableSsoNotImplemented = disableSsoNotImplemented - toWai FeatureLocked = setTeamFeatureConfigFeatureLocked data TeamNotificationError = InvalidTeamNotificationId @@ -460,9 +458,6 @@ noLegalHoldDeviceAllocated = mkError status404 "legalhold-no-device-allocated" " legalHoldCouldNotBlockConnections :: Error legalHoldCouldNotBlockConnections = mkError status500 "legalhold-internal" "legal hold service: could not block connections when resolving policy conflicts." -setTeamFeatureConfigFeatureLocked :: Error -setTeamFeatureConfigFeatureLocked = mkError status409 "feature-locked" "feature config cannot be updated (eg., because it is configured to be locked, or because you need to upgrade your plan)" - disableSsoNotImplemented :: Error disableSsoNotImplemented = mkError diff --git a/services/galley/src/Galley/API/Internal.hs b/services/galley/src/Galley/API/Internal.hs index 5d870c0dddb..5c5a555b927 100644 --- a/services/galley/src/Galley/API/Internal.hs +++ b/services/galley/src/Galley/API/Internal.hs @@ -52,7 +52,6 @@ import Galley.API.Util import Galley.App import Galley.Cassandra.Paging import qualified Galley.Data.Conversation as Data -import Galley.Data.TeamFeatures (MaybeHasLockStatusCol) import Galley.Effects import Galley.Effects.ClientStore import Galley.Effects.ConversationStore @@ -122,82 +121,79 @@ data InternalApi routes = InternalApi -- Viewing the config for features should be allowed for any admin. iTeamFeatureStatusSSOGet :: routes - :- IFeatureStatusGet 'Public.WithoutLockStatus 'Public.TeamFeatureSSO, + :- IFeatureStatusGet 'Public.TeamFeatureSSO, iTeamFeatureStatusSSOPut :: routes :- IFeatureStatusPut 'Public.TeamFeatureSSO, iTeamFeatureStatusLegalHoldGet :: routes - :- IFeatureStatusGet 'Public.WithoutLockStatus 'Public.TeamFeatureLegalHold, + :- IFeatureStatusGet 'Public.TeamFeatureLegalHold, iTeamFeatureStatusLegalHoldPut :: routes :- IFeatureStatusPut 'Public.TeamFeatureLegalHold, iTeamFeatureStatusSearchVisibilityGet :: routes - :- IFeatureStatusGet 'Public.WithoutLockStatus 'Public.TeamFeatureSearchVisibility, + :- IFeatureStatusGet 'Public.TeamFeatureSearchVisibility, iTeamFeatureStatusSearchVisibilityPut :: routes :- IFeatureStatusPut 'Public.TeamFeatureSearchVisibility, iTeamFeatureStatusSearchVisibilityDeprecatedGet :: routes - :- IFeatureStatusDeprecatedGet 'Public.WithoutLockStatus 'Public.TeamFeatureSearchVisibility, + :- IFeatureStatusDeprecatedGet 'Public.TeamFeatureSearchVisibility, iTeamFeatureStatusSearchVisibilityDeprecatedPut :: routes :- IFeatureStatusDeprecatedPut 'Public.TeamFeatureSearchVisibility, iTeamFeatureStatusValidateSAMLEmailsGet :: routes - :- IFeatureStatusGet 'Public.WithoutLockStatus 'Public.TeamFeatureValidateSAMLEmails, + :- IFeatureStatusGet 'Public.TeamFeatureValidateSAMLEmails, iTeamFeatureStatusValidateSAMLEmailsPut :: routes :- IFeatureStatusPut 'Public.TeamFeatureValidateSAMLEmails, iTeamFeatureStatusValidateSAMLEmailsDeprecatedGet :: routes - :- IFeatureStatusDeprecatedGet 'Public.WithoutLockStatus 'Public.TeamFeatureValidateSAMLEmails, + :- IFeatureStatusDeprecatedGet 'Public.TeamFeatureValidateSAMLEmails, iTeamFeatureStatusValidateSAMLEmailsDeprecatedPut :: routes :- IFeatureStatusDeprecatedPut 'Public.TeamFeatureValidateSAMLEmails, iTeamFeatureStatusDigitalSignaturesGet :: routes - :- IFeatureStatusGet 'Public.WithoutLockStatus 'Public.TeamFeatureDigitalSignatures, + :- IFeatureStatusGet 'Public.TeamFeatureDigitalSignatures, iTeamFeatureStatusDigitalSignaturesPut :: routes :- IFeatureStatusPut 'Public.TeamFeatureDigitalSignatures, iTeamFeatureStatusDigitalSignaturesDeprecatedGet :: routes - :- IFeatureStatusDeprecatedGet 'Public.WithoutLockStatus 'Public.TeamFeatureDigitalSignatures, + :- IFeatureStatusDeprecatedGet 'Public.TeamFeatureDigitalSignatures, iTeamFeatureStatusDigitalSignaturesDeprecatedPut :: routes :- IFeatureStatusDeprecatedPut 'Public.TeamFeatureDigitalSignatures, iTeamFeatureStatusAppLockGet :: routes - :- IFeatureStatusGet 'Public.WithoutLockStatus 'Public.TeamFeatureAppLock, + :- IFeatureStatusGet 'Public.TeamFeatureAppLock, iTeamFeatureStatusAppLockPut :: routes :- IFeatureStatusPut 'Public.TeamFeatureAppLock, iTeamFeatureStatusFileSharingGet :: routes - :- IFeatureStatusGet 'Public.WithoutLockStatus 'Public.TeamFeatureFileSharing, + :- IFeatureStatusGet 'Public.TeamFeatureFileSharing, iTeamFeatureStatusFileSharingPut :: routes :- IFeatureStatusPut 'Public.TeamFeatureFileSharing, iTeamFeatureStatusClassifiedDomainsGet :: routes - :- IFeatureStatusGet 'Public.WithoutLockStatus 'Public.TeamFeatureClassifiedDomains, + :- IFeatureStatusGet 'Public.TeamFeatureClassifiedDomains, iTeamFeatureStatusConferenceCallingPut :: routes :- IFeatureStatusPut 'Public.TeamFeatureConferenceCalling, iTeamFeatureStatusConferenceCallingGet :: routes - :- IFeatureStatusGet 'Public.WithoutLockStatus 'Public.TeamFeatureConferenceCalling, + :- IFeatureStatusGet 'Public.TeamFeatureConferenceCalling, iTeamFeatureStatusSelfDeletingMessagesPut :: routes :- IFeatureStatusPut 'Public.TeamFeatureSelfDeletingMessages, iTeamFeatureStatusSelfDeletingMessagesGet :: routes - :- IFeatureStatusGet 'Public.WithLockStatus 'Public.TeamFeatureSelfDeletingMessages, - iTeamFeatureLockStatusSelfDeletingMessagesPut :: - routes - :- IFeatureStatusLockStatusPut 'Public.TeamFeatureSelfDeletingMessages, + :- IFeatureStatusGet 'Public.TeamFeatureSelfDeletingMessages, -- This endpoint can lead to the following events being sent: -- - MemberLeave event to members for all conversations the user was in iDeleteUser :: @@ -236,14 +232,14 @@ data InternalApi routes = InternalApi type ServantAPI = ToServantApi InternalApi -type IFeatureStatusGet lockStatus featureName = +type IFeatureStatusGet featureName = Summary (AppendSymbol "Get config for " (Public.KnownTeamFeatureNameSymbol featureName)) :> "i" :> "teams" :> Capture "tid" TeamId :> "features" :> Public.KnownTeamFeatureNameSymbol featureName - :> Get '[Servant.JSON] (Public.TeamFeatureStatus lockStatus featureName) + :> Get '[Servant.JSON] (Public.TeamFeatureStatus featureName) type IFeatureStatusPut featureName = Summary (AppendSymbol "Put config for " (Public.KnownTeamFeatureNameSymbol featureName)) @@ -252,28 +248,18 @@ type IFeatureStatusPut featureName = :> Capture "tid" TeamId :> "features" :> Public.KnownTeamFeatureNameSymbol featureName - :> ReqBody '[Servant.JSON] (Public.TeamFeatureStatus 'Public.WithoutLockStatus featureName) - :> Put '[Servant.JSON] (Public.TeamFeatureStatus 'Public.WithoutLockStatus featureName) - -type IFeatureStatusLockStatusPut featureName = - Summary (AppendSymbol "(Un-)lock " (Public.KnownTeamFeatureNameSymbol featureName)) - :> "i" - :> "teams" - :> Capture "tid" TeamId - :> "features" - :> Public.KnownTeamFeatureNameSymbol featureName - :> Capture "lockStatus" Public.LockStatusValue - :> Put '[Servant.JSON] Public.LockStatus + :> ReqBody '[Servant.JSON] (Public.TeamFeatureStatus featureName) + :> Put '[Servant.JSON] (Public.TeamFeatureStatus featureName) -- | A type for a GET endpoint for a feature with a deprecated path -type IFeatureStatusDeprecatedGet lockStatus featureName = +type IFeatureStatusDeprecatedGet featureName = Summary (AppendSymbol "[deprecated] Get config for " (Public.KnownTeamFeatureNameSymbol featureName)) :> "i" :> "teams" :> Capture "tid" TeamId :> "features" :> Public.DeprecatedFeatureName featureName - :> Get '[Servant.JSON] (Public.TeamFeatureStatus lockStatus featureName) + :> Get '[Servant.JSON] (Public.TeamFeatureStatus featureName) -- | A type for a PUT endpoint for a feature with a deprecated path type IFeatureStatusDeprecatedPut featureName = @@ -283,8 +269,8 @@ type IFeatureStatusDeprecatedPut featureName = :> Capture "tid" TeamId :> "features" :> Public.DeprecatedFeatureName featureName - :> ReqBody '[Servant.JSON] (Public.TeamFeatureStatus 'Public.WithoutLockStatus featureName) - :> Put '[Servant.JSON] (Public.TeamFeatureStatus 'Public.WithoutLockStatus featureName) + :> ReqBody '[Servant.JSON] (Public.TeamFeatureStatus featureName) + :> Put '[Servant.JSON] (Public.TeamFeatureStatus featureName) servantSitemap :: ServerT ServantAPI (Sem GalleyEffects) servantSitemap = @@ -292,39 +278,38 @@ servantSitemap = InternalApi { iStatusGet = pure NoContent, iStatusHead = pure NoContent, - iTeamFeatureStatusSSOGet = iGetTeamFeature @'Public.WithoutLockStatus @'Public.TeamFeatureSSO Features.getSSOStatusInternal, + iTeamFeatureStatusSSOGet = iGetTeamFeature @'Public.TeamFeatureSSO Features.getSSOStatusInternal, iTeamFeatureStatusSSOPut = iPutTeamFeature @'Public.TeamFeatureSSO Features.setSSOStatusInternal, - iTeamFeatureStatusLegalHoldGet = iGetTeamFeature @'Public.WithoutLockStatus @'Public.TeamFeatureLegalHold Features.getLegalholdStatusInternal, + iTeamFeatureStatusLegalHoldGet = iGetTeamFeature @'Public.TeamFeatureLegalHold Features.getLegalholdStatusInternal, iTeamFeatureStatusLegalHoldPut = iPutTeamFeature @'Public.TeamFeatureLegalHold (Features.setLegalholdStatusInternal @InternalPaging), - iTeamFeatureStatusSearchVisibilityGet = iGetTeamFeature @'Public.WithoutLockStatus @'Public.TeamFeatureSearchVisibility Features.getTeamSearchVisibilityAvailableInternal, + iTeamFeatureStatusSearchVisibilityGet = iGetTeamFeature @'Public.TeamFeatureSearchVisibility Features.getTeamSearchVisibilityAvailableInternal, iTeamFeatureStatusSearchVisibilityPut = iPutTeamFeature @'Public.TeamFeatureLegalHold Features.setTeamSearchVisibilityAvailableInternal, - iTeamFeatureStatusSearchVisibilityDeprecatedGet = iGetTeamFeature @'Public.WithoutLockStatus @'Public.TeamFeatureSearchVisibility Features.getTeamSearchVisibilityAvailableInternal, + iTeamFeatureStatusSearchVisibilityDeprecatedGet = iGetTeamFeature @'Public.TeamFeatureSearchVisibility Features.getTeamSearchVisibilityAvailableInternal, iTeamFeatureStatusSearchVisibilityDeprecatedPut = iPutTeamFeature @'Public.TeamFeatureLegalHold Features.setTeamSearchVisibilityAvailableInternal, - iTeamFeatureStatusValidateSAMLEmailsGet = iGetTeamFeature @'Public.WithoutLockStatus @'Public.TeamFeatureValidateSAMLEmails Features.getValidateSAMLEmailsInternal, + iTeamFeatureStatusValidateSAMLEmailsGet = iGetTeamFeature @'Public.TeamFeatureValidateSAMLEmails Features.getValidateSAMLEmailsInternal, iTeamFeatureStatusValidateSAMLEmailsPut = iPutTeamFeature @'Public.TeamFeatureValidateSAMLEmails Features.setValidateSAMLEmailsInternal, - iTeamFeatureStatusValidateSAMLEmailsDeprecatedGet = iGetTeamFeature @'Public.WithoutLockStatus @'Public.TeamFeatureValidateSAMLEmails Features.getValidateSAMLEmailsInternal, + iTeamFeatureStatusValidateSAMLEmailsDeprecatedGet = iGetTeamFeature @'Public.TeamFeatureValidateSAMLEmails Features.getValidateSAMLEmailsInternal, iTeamFeatureStatusValidateSAMLEmailsDeprecatedPut = iPutTeamFeature @'Public.TeamFeatureValidateSAMLEmails Features.setValidateSAMLEmailsInternal, - iTeamFeatureStatusDigitalSignaturesGet = iGetTeamFeature @'Public.WithoutLockStatus @'Public.TeamFeatureDigitalSignatures Features.getDigitalSignaturesInternal, + iTeamFeatureStatusDigitalSignaturesGet = iGetTeamFeature @'Public.TeamFeatureDigitalSignatures Features.getDigitalSignaturesInternal, iTeamFeatureStatusDigitalSignaturesPut = iPutTeamFeature @'Public.TeamFeatureDigitalSignatures Features.setDigitalSignaturesInternal, - iTeamFeatureStatusDigitalSignaturesDeprecatedGet = iGetTeamFeature @'Public.WithoutLockStatus @'Public.TeamFeatureDigitalSignatures Features.getDigitalSignaturesInternal, + iTeamFeatureStatusDigitalSignaturesDeprecatedGet = iGetTeamFeature @'Public.TeamFeatureDigitalSignatures Features.getDigitalSignaturesInternal, iTeamFeatureStatusDigitalSignaturesDeprecatedPut = iPutTeamFeature @'Public.TeamFeatureDigitalSignatures Features.setDigitalSignaturesInternal, - iTeamFeatureStatusAppLockGet = iGetTeamFeature @'Public.WithoutLockStatus @'Public.TeamFeatureAppLock Features.getAppLockInternal, + iTeamFeatureStatusAppLockGet = iGetTeamFeature @'Public.TeamFeatureAppLock Features.getAppLockInternal, iTeamFeatureStatusAppLockPut = iPutTeamFeature @'Public.TeamFeatureAppLock Features.setAppLockInternal, - iTeamFeatureStatusFileSharingGet = iGetTeamFeature @'Public.WithoutLockStatus @'Public.TeamFeatureFileSharing Features.getFileSharingInternal, + iTeamFeatureStatusFileSharingGet = iGetTeamFeature @'Public.TeamFeatureFileSharing Features.getFileSharingInternal, iTeamFeatureStatusFileSharingPut = iPutTeamFeature @'Public.TeamFeatureFileSharing Features.setFileSharingInternal, - iTeamFeatureStatusClassifiedDomainsGet = iGetTeamFeature @'Public.WithoutLockStatus @'Public.TeamFeatureClassifiedDomains Features.getClassifiedDomainsInternal, + iTeamFeatureStatusClassifiedDomainsGet = iGetTeamFeature @'Public.TeamFeatureClassifiedDomains Features.getClassifiedDomainsInternal, iTeamFeatureStatusConferenceCallingPut = iPutTeamFeature @'Public.TeamFeatureConferenceCalling Features.setConferenceCallingInternal, - iTeamFeatureStatusConferenceCallingGet = iGetTeamFeature @'Public.WithoutLockStatus @'Public.TeamFeatureConferenceCalling Features.getConferenceCallingInternal, + iTeamFeatureStatusConferenceCallingGet = iGetTeamFeature @'Public.TeamFeatureConferenceCalling Features.getConferenceCallingInternal, iTeamFeatureStatusSelfDeletingMessagesPut = iPutTeamFeature @'Public.TeamFeatureSelfDeletingMessages Features.setSelfDeletingMessagesInternal, - iTeamFeatureStatusSelfDeletingMessagesGet = iGetTeamFeature @'Public.WithLockStatus @'Public.TeamFeatureSelfDeletingMessages Features.getSelfDeletingMessagesInternal, - iTeamFeatureLockStatusSelfDeletingMessagesPut = Features.setLockStatus @'Public.TeamFeatureSelfDeletingMessages, + iTeamFeatureStatusSelfDeletingMessagesGet = iGetTeamFeature @'Public.TeamFeatureSelfDeletingMessages Features.getSelfDeletingMessagesInternal, iDeleteUser = rmUser, iConnect = Create.createConnectConversation, iUpsertOne2OneConversation = One2One.iUpsertOne2OneConversation } iGetTeamFeature :: - forall ps a r. + forall a r. ( Public.KnownTeamFeatureName a, Members '[ Error ActionError, @@ -334,29 +319,26 @@ iGetTeamFeature :: ] r ) => - (Features.GetFeatureInternalParam -> Sem r (Public.TeamFeatureStatus ps a)) -> + (Features.GetFeatureInternalParam -> Sem r (Public.TeamFeatureStatus a)) -> TeamId -> - Sem r (Public.TeamFeatureStatus ps a) -iGetTeamFeature getter = Features.getFeatureStatus @ps @a getter DontDoAuth + Sem r (Public.TeamFeatureStatus a) +iGetTeamFeature getter = Features.getFeatureStatus @a getter DontDoAuth iPutTeamFeature :: forall a r. ( Public.KnownTeamFeatureName a, - MaybeHasLockStatusCol a, Members '[ Error ActionError, Error NotATeamMember, Error TeamError, - Error TeamFeatureError, - TeamStore, - TeamFeatureStore + TeamStore ] r ) => - (TeamId -> Public.TeamFeatureStatus 'Public.WithoutLockStatus a -> Sem r (Public.TeamFeatureStatus 'Public.WithoutLockStatus a)) -> + (TeamId -> Public.TeamFeatureStatus a -> Sem r (Public.TeamFeatureStatus a)) -> TeamId -> - Public.TeamFeatureStatus 'Public.WithoutLockStatus a -> - Sem r (Public.TeamFeatureStatus 'Public.WithoutLockStatus a) + Public.TeamFeatureStatus a -> + Sem r (Public.TeamFeatureStatus a) iPutTeamFeature setter = Features.setFeatureStatus @a setter DontDoAuth sitemap :: Routes a (Sem GalleyEffects) () @@ -599,7 +581,7 @@ rmUser lusr conn = do for_ (maybeList1 (catMaybes pp)) - push + (push) -- FUTUREWORK: This could be optimized to reduce the number of RPCs -- made. When a team is deleted the burst of RPCs created here could diff --git a/services/galley/src/Galley/API/LegalHold.hs b/services/galley/src/Galley/API/LegalHold.hs index 051d82c30a2..5bbe62a2362 100644 --- a/services/galley/src/Galley/API/LegalHold.hs +++ b/services/galley/src/Galley/API/LegalHold.hs @@ -103,7 +103,7 @@ isLegalHoldEnabledForTeam tid = do pure False FeatureLegalHoldDisabledByDefault -> do statusValue <- - Public.tfwoStatus <$$> TeamFeatures.getFeatureStatusNoConfig @'Public.WithoutLockStatus @'Public.TeamFeatureLegalHold tid + Public.tfwoStatus <$$> TeamFeatures.getFeatureStatusNoConfig @'Public.TeamFeatureLegalHold tid return $ case statusValue of Just Public.TeamFeatureEnabled -> True Just Public.TeamFeatureDisabled -> False diff --git a/services/galley/src/Galley/API/Public.hs b/services/galley/src/Galley/API/Public.hs index fa6eb5e7a56..3027ba070ab 100644 --- a/services/galley/src/Galley/API/Public.hs +++ b/services/galley/src/Galley/API/Public.hs @@ -117,70 +117,70 @@ servantSitemap = GalleyAPI.postOtrMessageUnqualified = Update.postOtrMessageUnqualified, GalleyAPI.postProteusMessage = Update.postProteusMessage, GalleyAPI.teamFeatureStatusSSOGet = - getFeatureStatus @'Public.WithoutLockStatus @'Public.TeamFeatureSSO Features.getSSOStatusInternal + getFeatureStatus @'Public.TeamFeatureSSO Features.getSSOStatusInternal . DoAuth, GalleyAPI.teamFeatureStatusLegalHoldGet = - getFeatureStatus @'Public.WithoutLockStatus @'Public.TeamFeatureLegalHold Features.getLegalholdStatusInternal + getFeatureStatus @'Public.TeamFeatureLegalHold Features.getLegalholdStatusInternal . DoAuth, GalleyAPI.teamFeatureStatusLegalHoldPut = setFeatureStatus @'Public.TeamFeatureLegalHold (Features.setLegalholdStatusInternal @InternalPaging) . DoAuth, GalleyAPI.teamFeatureStatusSearchVisibilityGet = - getFeatureStatus @'Public.WithoutLockStatus @'Public.TeamFeatureSearchVisibility Features.getTeamSearchVisibilityAvailableInternal + getFeatureStatus @'Public.TeamFeatureSearchVisibility Features.getTeamSearchVisibilityAvailableInternal . DoAuth, GalleyAPI.teamFeatureStatusSearchVisibilityPut = setFeatureStatus @'Public.TeamFeatureSearchVisibility Features.setTeamSearchVisibilityAvailableInternal . DoAuth, GalleyAPI.teamFeatureStatusSearchVisibilityDeprecatedGet = - getFeatureStatus @'Public.WithoutLockStatus @'Public.TeamFeatureSearchVisibility Features.getTeamSearchVisibilityAvailableInternal + getFeatureStatus @'Public.TeamFeatureSearchVisibility Features.getTeamSearchVisibilityAvailableInternal . DoAuth, GalleyAPI.teamFeatureStatusSearchVisibilityDeprecatedPut = setFeatureStatus @'Public.TeamFeatureSearchVisibility Features.setTeamSearchVisibilityAvailableInternal . DoAuth, GalleyAPI.teamFeatureStatusValidateSAMLEmailsGet = - getFeatureStatus @'Public.WithoutLockStatus @'Public.TeamFeatureValidateSAMLEmails Features.getValidateSAMLEmailsInternal + getFeatureStatus @'Public.TeamFeatureValidateSAMLEmails Features.getValidateSAMLEmailsInternal . DoAuth, GalleyAPI.teamFeatureStatusValidateSAMLEmailsDeprecatedGet = - getFeatureStatus @'Public.WithoutLockStatus @'Public.TeamFeatureValidateSAMLEmails Features.getValidateSAMLEmailsInternal + getFeatureStatus @'Public.TeamFeatureValidateSAMLEmails Features.getValidateSAMLEmailsInternal . DoAuth, GalleyAPI.teamFeatureStatusDigitalSignaturesGet = - getFeatureStatus @'Public.WithoutLockStatus @'Public.TeamFeatureDigitalSignatures Features.getDigitalSignaturesInternal + getFeatureStatus @'Public.TeamFeatureDigitalSignatures Features.getDigitalSignaturesInternal . DoAuth, GalleyAPI.teamFeatureStatusDigitalSignaturesDeprecatedGet = - getFeatureStatus @'Public.WithoutLockStatus @'Public.TeamFeatureDigitalSignatures Features.getDigitalSignaturesInternal + getFeatureStatus @'Public.TeamFeatureDigitalSignatures Features.getDigitalSignaturesInternal . DoAuth, GalleyAPI.teamFeatureStatusAppLockGet = - getFeatureStatus @'Public.WithoutLockStatus @'Public.TeamFeatureAppLock Features.getAppLockInternal + getFeatureStatus @'Public.TeamFeatureAppLock Features.getAppLockInternal . DoAuth, GalleyAPI.teamFeatureStatusAppLockPut = setFeatureStatus @'Public.TeamFeatureAppLock Features.setAppLockInternal . DoAuth, GalleyAPI.teamFeatureStatusFileSharingGet = - getFeatureStatus @'Public.WithoutLockStatus @'Public.TeamFeatureFileSharing Features.getFileSharingInternal . DoAuth, + getFeatureStatus @'Public.TeamFeatureFileSharing Features.getFileSharingInternal . DoAuth, GalleyAPI.teamFeatureStatusFileSharingPut = setFeatureStatus @'Public.TeamFeatureFileSharing Features.setFileSharingInternal . DoAuth, GalleyAPI.teamFeatureStatusClassifiedDomainsGet = - getFeatureStatus @'Public.WithoutLockStatus @'Public.TeamFeatureClassifiedDomains Features.getClassifiedDomainsInternal + getFeatureStatus @'Public.TeamFeatureClassifiedDomains Features.getClassifiedDomainsInternal . DoAuth, GalleyAPI.teamFeatureStatusConferenceCallingGet = - getFeatureStatus @'Public.WithoutLockStatus @'Public.TeamFeatureConferenceCalling Features.getConferenceCallingInternal + getFeatureStatus @'Public.TeamFeatureConferenceCalling Features.getConferenceCallingInternal . DoAuth, GalleyAPI.teamFeatureStatusSelfDeletingMessagesGet = - getFeatureStatus @'Public.WithLockStatus @'Public.TeamFeatureSelfDeletingMessages Features.getSelfDeletingMessagesInternal + getFeatureStatus @'Public.TeamFeatureSelfDeletingMessages Features.getSelfDeletingMessagesInternal . DoAuth, GalleyAPI.teamFeatureStatusSelfDeletingMessagesPut = setFeatureStatus @'Public.TeamFeatureSelfDeletingMessages Features.setSelfDeletingMessagesInternal . DoAuth, GalleyAPI.featureAllFeatureConfigsGet = Features.getAllFeatureConfigs, - GalleyAPI.featureConfigLegalHoldGet = Features.getFeatureConfig @'Public.WithoutLockStatus @'Public.TeamFeatureLegalHold Features.getLegalholdStatusInternal, - GalleyAPI.featureConfigSSOGet = Features.getFeatureConfig @'Public.WithoutLockStatus @'Public.TeamFeatureSSO Features.getSSOStatusInternal, - GalleyAPI.featureConfigSearchVisibilityGet = Features.getFeatureConfig @'Public.WithoutLockStatus @'Public.TeamFeatureSearchVisibility Features.getTeamSearchVisibilityAvailableInternal, - GalleyAPI.featureConfigValidateSAMLEmailsGet = Features.getFeatureConfig @'Public.WithoutLockStatus @'Public.TeamFeatureValidateSAMLEmails Features.getValidateSAMLEmailsInternal, - GalleyAPI.featureConfigDigitalSignaturesGet = Features.getFeatureConfig @'Public.WithoutLockStatus @'Public.TeamFeatureDigitalSignatures Features.getDigitalSignaturesInternal, - GalleyAPI.featureConfigAppLockGet = Features.getFeatureConfig @'Public.WithoutLockStatus @'Public.TeamFeatureAppLock Features.getAppLockInternal, - GalleyAPI.featureConfigFileSharingGet = Features.getFeatureConfig @'Public.WithoutLockStatus @'Public.TeamFeatureFileSharing Features.getFileSharingInternal, - GalleyAPI.featureConfigClassifiedDomainsGet = Features.getFeatureConfig @'Public.WithoutLockStatus @'Public.TeamFeatureClassifiedDomains Features.getClassifiedDomainsInternal, - GalleyAPI.featureConfigConferenceCallingGet = Features.getFeatureConfig @'Public.WithoutLockStatus @'Public.TeamFeatureConferenceCalling Features.getConferenceCallingInternal, - GalleyAPI.featureConfigSelfDeletingMessagesGet = Features.getFeatureConfig @'Public.WithLockStatus @'Public.TeamFeatureSelfDeletingMessages Features.getSelfDeletingMessagesInternal + GalleyAPI.featureConfigLegalHoldGet = Features.getFeatureConfig @'Public.TeamFeatureLegalHold Features.getLegalholdStatusInternal, + GalleyAPI.featureConfigSSOGet = Features.getFeatureConfig @'Public.TeamFeatureSSO Features.getSSOStatusInternal, + GalleyAPI.featureConfigSearchVisibilityGet = Features.getFeatureConfig @'Public.TeamFeatureSearchVisibility Features.getTeamSearchVisibilityAvailableInternal, + GalleyAPI.featureConfigValidateSAMLEmailsGet = Features.getFeatureConfig @'Public.TeamFeatureValidateSAMLEmails Features.getValidateSAMLEmailsInternal, + GalleyAPI.featureConfigDigitalSignaturesGet = Features.getFeatureConfig @'Public.TeamFeatureDigitalSignatures Features.getDigitalSignaturesInternal, + GalleyAPI.featureConfigAppLockGet = Features.getFeatureConfig @'Public.TeamFeatureAppLock Features.getAppLockInternal, + GalleyAPI.featureConfigFileSharingGet = Features.getFeatureConfig @'Public.TeamFeatureFileSharing Features.getFileSharingInternal, + GalleyAPI.featureConfigClassifiedDomainsGet = Features.getFeatureConfig @'Public.TeamFeatureClassifiedDomains Features.getClassifiedDomainsInternal, + GalleyAPI.featureConfigConferenceCallingGet = Features.getFeatureConfig @'Public.TeamFeatureConferenceCalling Features.getConferenceCallingInternal, + GalleyAPI.featureConfigSelfDeletingMessagesGet = Features.getFeatureConfig @'Public.TeamFeatureSelfDeletingMessages Features.getSelfDeletingMessagesInternal } sitemap :: Routes ApiBuilder (Sem GalleyEffects) () diff --git a/services/galley/src/Galley/API/Teams.hs b/services/galley/src/Galley/API/Teams.hs index 5f06956348c..ce9b1ef65ba 100644 --- a/services/galley/src/Galley/API/Teams.hs +++ b/services/galley/src/Galley/API/Teams.hs @@ -1522,7 +1522,7 @@ canUserJoinTeam tid = do getTeamSearchVisibilityAvailableInternal :: Members '[Input Opts, TeamFeatureStore] r => TeamId -> - Sem r (Public.TeamFeatureStatus 'Public.WithoutLockStatus 'Public.TeamFeatureSearchVisibility) + Sem r (Public.TeamFeatureStatus 'Public.TeamFeatureSearchVisibility) getTeamSearchVisibilityAvailableInternal tid = do -- TODO: This is just redundant given there is a decent default defConfig <- do @@ -1532,7 +1532,7 @@ getTeamSearchVisibilityAvailableInternal tid = do FeatureTeamSearchVisibilityDisabledByDefault -> Public.TeamFeatureDisabled fromMaybe defConfig - <$> TeamFeatures.getFeatureStatusNoConfig @'Public.WithoutLockStatus @'Public.TeamFeatureSearchVisibility tid + <$> TeamFeatures.getFeatureStatusNoConfig @'Public.TeamFeatureSearchVisibility tid -- | Modify and get visibility type for a team (internal, no user permission checks) getSearchVisibilityInternalH :: diff --git a/services/galley/src/Galley/API/Teams/Features.hs b/services/galley/src/Galley/API/Teams/Features.hs index 9c1650a29bb..19e49f76b1b 100644 --- a/services/galley/src/Galley/API/Teams/Features.hs +++ b/services/galley/src/Galley/API/Teams/Features.hs @@ -40,7 +40,6 @@ module Galley.API.Teams.Features setConferenceCallingInternal, getSelfDeletingMessagesInternal, setSelfDeletingMessagesInternal, - setLockStatus, DoAuth (..), GetFeatureInternalParam, ) @@ -91,7 +90,7 @@ data DoAuth = DoAuth UserId | DontDoAuth -- | For team-settings, to administrate team feature configuration. Here we have an admin uid -- and a team id, but no uid of the member for which the feature config holds. getFeatureStatus :: - forall (ps :: Public.IncludeLockStatus) (a :: Public.TeamFeatureName) r. + forall (a :: Public.TeamFeatureName) r. ( Public.KnownTeamFeatureName a, Members '[ Error ActionError, @@ -101,10 +100,10 @@ getFeatureStatus :: ] r ) => - (GetFeatureInternalParam -> Sem r (Public.TeamFeatureStatus ps a)) -> + (GetFeatureInternalParam -> Sem r (Public.TeamFeatureStatus a)) -> DoAuth -> TeamId -> - Sem r (Public.TeamFeatureStatus ps a) + Sem r (Public.TeamFeatureStatus a) getFeatureStatus getter doauth tid = do case doauth of DoAuth uid -> do @@ -118,21 +117,19 @@ getFeatureStatus getter doauth tid = do setFeatureStatus :: forall (a :: Public.TeamFeatureName) r. ( Public.KnownTeamFeatureName a, - MaybeHasLockStatusCol a, Members '[ Error ActionError, Error TeamError, Error NotATeamMember, - TeamStore, - TeamFeatureStore + TeamStore ] r ) => - (TeamId -> Public.TeamFeatureStatus 'Public.WithoutLockStatus a -> Sem r (Public.TeamFeatureStatus 'Public.WithoutLockStatus a)) -> + (TeamId -> Public.TeamFeatureStatus a -> Sem r (Public.TeamFeatureStatus a)) -> DoAuth -> TeamId -> - Public.TeamFeatureStatus 'Public.WithoutLockStatus a -> - Sem r (Public.TeamFeatureStatus 'Public.WithoutLockStatus a) + Public.TeamFeatureStatus a -> + Sem r (Public.TeamFeatureStatus a) setFeatureStatus setter doauth tid status = do case doauth of DoAuth uid -> do @@ -142,30 +139,9 @@ setFeatureStatus setter doauth tid status = do assertTeamExists tid setter tid status --- | Setting lock status can only be done through the internal API and therefore doesn't require auth. -setLockStatus :: - forall (a :: Public.TeamFeatureName) r. - ( Public.KnownTeamFeatureName a, - HasLockStatusCol a, - Members - [ Error ActionError, - Error TeamError, - Error NotATeamMember, - TeamStore, - TeamFeatureStore - ] - r - ) => - TeamId -> - Public.LockStatusValue -> - Sem r Public.LockStatus -setLockStatus tid lockStatusUpdate = do - assertTeamExists tid - TeamFeatures.setLockStatus @a tid (Public.LockStatus lockStatusUpdate) - -- | For individual users to get feature config for their account (personal or team). getFeatureConfig :: - forall (ps :: Public.IncludeLockStatus) (a :: Public.TeamFeatureName) r. + forall (a :: Public.TeamFeatureName) r. ( Public.KnownTeamFeatureName a, Members '[ Error ActionError, @@ -175,9 +151,9 @@ getFeatureConfig :: ] r ) => - (GetFeatureInternalParam -> Sem r (Public.TeamFeatureStatus ps a)) -> + (GetFeatureInternalParam -> Sem r (Public.TeamFeatureStatus a)) -> UserId -> - Sem r (Public.TeamFeatureStatus ps a) + Sem r (Public.TeamFeatureStatus a) getFeatureConfig getter zusr = do mbTeam <- getOneUserTeam zusr case mbTeam of @@ -204,34 +180,34 @@ getAllFeatureConfigs :: Sem r AllFeatureConfigs getAllFeatureConfigs zusr = do mbTeam <- getOneUserTeam zusr - zusrMembership <- maybe (pure Nothing) (flip getTeamMember zusr) mbTeam + zusrMembership <- maybe (pure Nothing) ((flip getTeamMember zusr)) mbTeam let getStatus :: - forall (ps :: Public.IncludeLockStatus) (a :: Public.TeamFeatureName) r. + forall (a :: Public.TeamFeatureName) r. ( Public.KnownTeamFeatureName a, - Aeson.ToJSON (Public.TeamFeatureStatus ps a), + Aeson.ToJSON (Public.TeamFeatureStatus a), Members '[Error ActionError, Error TeamError, Error NotATeamMember, TeamStore] r ) => - (GetFeatureInternalParam -> Sem r (Public.TeamFeatureStatus ps a)) -> + (GetFeatureInternalParam -> Sem r (Public.TeamFeatureStatus a)) -> Sem r (Text, Aeson.Value) getStatus getter = do when (isJust mbTeam) $ do void $ permissionCheck (ViewTeamFeature (Public.knownTeamFeatureName @a)) zusrMembership status <- getter (maybe (Left (Just zusr)) Right mbTeam) let feature = Public.knownTeamFeatureName @a - pure $ cs (toByteString' feature) Aeson..= status + pure $ (cs (toByteString' feature) Aeson..= status) AllFeatureConfigs . HashMap.fromList <$> sequence - [ getStatus @'Public.WithoutLockStatus @'Public.TeamFeatureLegalHold getLegalholdStatusInternal, - getStatus @'Public.WithoutLockStatus @'Public.TeamFeatureSSO getSSOStatusInternal, - getStatus @'Public.WithoutLockStatus @'Public.TeamFeatureSearchVisibility getTeamSearchVisibilityAvailableInternal, - getStatus @'Public.WithoutLockStatus @'Public.TeamFeatureValidateSAMLEmails getValidateSAMLEmailsInternal, - getStatus @'Public.WithoutLockStatus @'Public.TeamFeatureDigitalSignatures getDigitalSignaturesInternal, - getStatus @'Public.WithoutLockStatus @'Public.TeamFeatureAppLock getAppLockInternal, - getStatus @'Public.WithoutLockStatus @'Public.TeamFeatureFileSharing getFileSharingInternal, - getStatus @'Public.WithoutLockStatus @'Public.TeamFeatureClassifiedDomains getClassifiedDomainsInternal, - getStatus @'Public.WithoutLockStatus @'Public.TeamFeatureConferenceCalling getConferenceCallingInternal, - getStatus @'Public.WithLockStatus @'Public.TeamFeatureSelfDeletingMessages getSelfDeletingMessagesInternal + [ getStatus @'Public.TeamFeatureLegalHold getLegalholdStatusInternal, + getStatus @'Public.TeamFeatureSSO getSSOStatusInternal, + getStatus @'Public.TeamFeatureSearchVisibility getTeamSearchVisibilityAvailableInternal, + getStatus @'Public.TeamFeatureValidateSAMLEmails getValidateSAMLEmailsInternal, + getStatus @'Public.TeamFeatureDigitalSignatures getDigitalSignaturesInternal, + getStatus @'Public.TeamFeatureAppLock getAppLockInternal, + getStatus @'Public.TeamFeatureFileSharing getFileSharingInternal, + getStatus @'Public.TeamFeatureClassifiedDomains getClassifiedDomainsInternal, + getStatus @'Public.TeamFeatureConferenceCalling getConferenceCallingInternal, + getStatus @'Public.TeamFeatureSelfDeletingMessages getSelfDeletingMessagesInternal ] getAllFeaturesH :: @@ -270,57 +246,57 @@ getAllFeatures :: getAllFeatures uid tid = do Aeson.object <$> sequence - [ getStatus @'Public.WithoutLockStatus @'Public.TeamFeatureSSO getSSOStatusInternal, - getStatus @'Public.WithoutLockStatus @'Public.TeamFeatureLegalHold getLegalholdStatusInternal, - getStatus @'Public.WithoutLockStatus @'Public.TeamFeatureSearchVisibility getTeamSearchVisibilityAvailableInternal, - getStatus @'Public.WithoutLockStatus @'Public.TeamFeatureValidateSAMLEmails getValidateSAMLEmailsInternal, - getStatus @'Public.WithoutLockStatus @'Public.TeamFeatureDigitalSignatures getDigitalSignaturesInternal, - getStatus @'Public.WithoutLockStatus @'Public.TeamFeatureAppLock getAppLockInternal, - getStatus @'Public.WithoutLockStatus @'Public.TeamFeatureFileSharing getFileSharingInternal, - getStatus @'Public.WithoutLockStatus @'Public.TeamFeatureClassifiedDomains getClassifiedDomainsInternal, - getStatus @'Public.WithoutLockStatus @'Public.TeamFeatureConferenceCalling getConferenceCallingInternal, - getStatus @'Public.WithLockStatus @'Public.TeamFeatureSelfDeletingMessages getSelfDeletingMessagesInternal + [ getStatus @'Public.TeamFeatureSSO getSSOStatusInternal, + getStatus @'Public.TeamFeatureLegalHold getLegalholdStatusInternal, + getStatus @'Public.TeamFeatureSearchVisibility getTeamSearchVisibilityAvailableInternal, + getStatus @'Public.TeamFeatureValidateSAMLEmails getValidateSAMLEmailsInternal, + getStatus @'Public.TeamFeatureDigitalSignatures getDigitalSignaturesInternal, + getStatus @'Public.TeamFeatureAppLock getAppLockInternal, + getStatus @'Public.TeamFeatureFileSharing getFileSharingInternal, + getStatus @'Public.TeamFeatureClassifiedDomains getClassifiedDomainsInternal, + getStatus @'Public.TeamFeatureConferenceCalling getConferenceCallingInternal, + getStatus @'Public.TeamFeatureSelfDeletingMessages getSelfDeletingMessagesInternal ] where getStatus :: - forall (ps :: Public.IncludeLockStatus) (a :: Public.TeamFeatureName). + forall (a :: Public.TeamFeatureName). ( Public.KnownTeamFeatureName a, - Aeson.ToJSON (Public.TeamFeatureStatus ps a) + Aeson.ToJSON (Public.TeamFeatureStatus a) ) => - (GetFeatureInternalParam -> Sem r (Public.TeamFeatureStatus ps a)) -> + (GetFeatureInternalParam -> Sem r (Public.TeamFeatureStatus a)) -> Sem r (Text, Aeson.Value) getStatus getter = do - status <- getFeatureStatus @ps @a getter (DoAuth uid) tid + status <- getFeatureStatus @a getter (DoAuth uid) tid let feature = Public.knownTeamFeatureName @a - pure $ cs (toByteString' feature) Aeson..= status + pure $ (cs (toByteString' feature) Aeson..= status) getFeatureStatusNoConfig :: - forall (ps :: Public.IncludeLockStatus) (a :: Public.TeamFeatureName) r. - ( Public.FeatureHasNoConfig ps a, + forall (a :: Public.TeamFeatureName) r. + ( Public.FeatureHasNoConfig a, HasStatusCol a, Member TeamFeatureStore r ) => Sem r Public.TeamFeatureStatusValue -> TeamId -> - Sem r (Public.TeamFeatureStatus ps a) + Sem r (Public.TeamFeatureStatus a) getFeatureStatusNoConfig getDefault tid = do defaultStatus <- Public.TeamFeatureStatusNoConfig <$> getDefault - fromMaybe defaultStatus <$> TeamFeatures.getFeatureStatusNoConfig @ps @a tid + fromMaybe defaultStatus <$> TeamFeatures.getFeatureStatusNoConfig @a tid setFeatureStatusNoConfig :: - forall (ps :: Public.IncludeLockStatus) (a :: Public.TeamFeatureName) r. + forall (a :: Public.TeamFeatureName) r. ( Public.KnownTeamFeatureName a, - Public.FeatureHasNoConfig ps a, + Public.FeatureHasNoConfig a, HasStatusCol a, Members '[GundeckAccess, TeamFeatureStore, TeamStore, P.TinyLog] r ) => (Public.TeamFeatureStatusValue -> TeamId -> Sem r ()) -> TeamId -> - Public.TeamFeatureStatus ps a -> - Sem r (Public.TeamFeatureStatus ps a) + Public.TeamFeatureStatus a -> + Sem r (Public.TeamFeatureStatus a) setFeatureStatusNoConfig applyState tid status = do applyState (Public.tfwoStatus status) tid - newStatus <- TeamFeatures.setFeatureStatusNoConfig @ps @a tid status + newStatus <- TeamFeatures.setFeatureStatusNoConfig @a tid status pushFeatureConfigEvent tid $ Event.Event Event.Update (Public.knownTeamFeatureName @a) (EdFeatureWithoutConfigChanged newStatus) pure newStatus @@ -332,11 +308,11 @@ type GetFeatureInternalParam = Either (Maybe UserId) TeamId getSSOStatusInternal :: Members '[Input Opts, TeamFeatureStore] r => GetFeatureInternalParam -> - Sem r (Public.TeamFeatureStatus 'Public.WithoutLockStatus 'Public.TeamFeatureSSO) + Sem r (Public.TeamFeatureStatus 'Public.TeamFeatureSSO) getSSOStatusInternal = either (const $ Public.TeamFeatureStatusNoConfig <$> getDef) - (getFeatureStatusNoConfig @'Public.WithoutLockStatus @'Public.TeamFeatureSSO getDef) + (getFeatureStatusNoConfig @'Public.TeamFeatureSSO getDef) where getDef :: Member (Input Opts) r => Sem r Public.TeamFeatureStatusValue getDef = @@ -347,20 +323,20 @@ getSSOStatusInternal = setSSOStatusInternal :: Members '[Error TeamFeatureError, GundeckAccess, TeamFeatureStore, TeamStore, P.TinyLog] r => TeamId -> - Public.TeamFeatureStatus 'Public.WithoutLockStatus 'Public.TeamFeatureSSO -> - Sem r (Public.TeamFeatureStatus 'Public.WithoutLockStatus 'Public.TeamFeatureSSO) -setSSOStatusInternal = setFeatureStatusNoConfig @'Public.WithoutLockStatus @'Public.TeamFeatureSSO $ \case + (Public.TeamFeatureStatus 'Public.TeamFeatureSSO) -> + Sem r (Public.TeamFeatureStatus 'Public.TeamFeatureSSO) +setSSOStatusInternal = setFeatureStatusNoConfig @'Public.TeamFeatureSSO $ \case Public.TeamFeatureDisabled -> const (throw DisableSsoNotImplemented) Public.TeamFeatureEnabled -> const (pure ()) getTeamSearchVisibilityAvailableInternal :: Members '[Input Opts, TeamFeatureStore] r => GetFeatureInternalParam -> - Sem r (Public.TeamFeatureStatus 'Public.WithoutLockStatus 'Public.TeamFeatureSearchVisibility) + Sem r (Public.TeamFeatureStatus 'Public.TeamFeatureSearchVisibility) getTeamSearchVisibilityAvailableInternal = either (const $ Public.TeamFeatureStatusNoConfig <$> getDef) - (getFeatureStatusNoConfig @'Public.WithoutLockStatus @'Public.TeamFeatureSearchVisibility getDef) + (getFeatureStatusNoConfig @'Public.TeamFeatureSearchVisibility getDef) where getDef = do inputs (view (optSettings . setFeatureFlags . flagTeamSearchVisibility)) <&> \case @@ -370,20 +346,20 @@ getTeamSearchVisibilityAvailableInternal = setTeamSearchVisibilityAvailableInternal :: Members '[GundeckAccess, SearchVisibilityStore, TeamFeatureStore, TeamStore, P.TinyLog] r => TeamId -> - Public.TeamFeatureStatus 'Public.WithoutLockStatus 'Public.TeamFeatureSearchVisibility -> - Sem r (Public.TeamFeatureStatus 'Public.WithoutLockStatus 'Public.TeamFeatureSearchVisibility) -setTeamSearchVisibilityAvailableInternal = setFeatureStatusNoConfig @'Public.WithoutLockStatus @'Public.TeamFeatureSearchVisibility $ \case + (Public.TeamFeatureStatus 'Public.TeamFeatureSearchVisibility) -> + Sem r (Public.TeamFeatureStatus 'Public.TeamFeatureSearchVisibility) +setTeamSearchVisibilityAvailableInternal = setFeatureStatusNoConfig @'Public.TeamFeatureSearchVisibility $ \case Public.TeamFeatureDisabled -> SearchVisibilityData.resetSearchVisibility Public.TeamFeatureEnabled -> const (pure ()) getValidateSAMLEmailsInternal :: Member TeamFeatureStore r => GetFeatureInternalParam -> - Sem r (Public.TeamFeatureStatus 'Public.WithoutLockStatus 'Public.TeamFeatureValidateSAMLEmails) + Sem r (Public.TeamFeatureStatus 'Public.TeamFeatureValidateSAMLEmails) getValidateSAMLEmailsInternal = either (const $ Public.TeamFeatureStatusNoConfig <$> getDef) - (getFeatureStatusNoConfig @'Public.WithoutLockStatus @'Public.TeamFeatureValidateSAMLEmails getDef) + (getFeatureStatusNoConfig @'Public.TeamFeatureValidateSAMLEmails getDef) where -- FUTUREWORK: we may also want to get a default from the server config file here, like for -- sso, and team search visibility. @@ -393,18 +369,18 @@ getValidateSAMLEmailsInternal = setValidateSAMLEmailsInternal :: Members '[GundeckAccess, TeamFeatureStore, TeamStore, P.TinyLog] r => TeamId -> - Public.TeamFeatureStatus 'Public.WithoutLockStatus 'Public.TeamFeatureValidateSAMLEmails -> - Sem r (Public.TeamFeatureStatus 'Public.WithoutLockStatus 'Public.TeamFeatureValidateSAMLEmails) -setValidateSAMLEmailsInternal = setFeatureStatusNoConfig @'Public.WithoutLockStatus @'Public.TeamFeatureValidateSAMLEmails $ \_ _ -> pure () + (Public.TeamFeatureStatus 'Public.TeamFeatureValidateSAMLEmails) -> + Sem r (Public.TeamFeatureStatus 'Public.TeamFeatureValidateSAMLEmails) +setValidateSAMLEmailsInternal = setFeatureStatusNoConfig @'Public.TeamFeatureValidateSAMLEmails $ \_ _ -> pure () getDigitalSignaturesInternal :: Member TeamFeatureStore r => GetFeatureInternalParam -> - Sem r (Public.TeamFeatureStatus 'Public.WithoutLockStatus 'Public.TeamFeatureDigitalSignatures) + Sem r (Public.TeamFeatureStatus 'Public.TeamFeatureDigitalSignatures) getDigitalSignaturesInternal = either (const $ Public.TeamFeatureStatusNoConfig <$> getDef) - (getFeatureStatusNoConfig @'Public.WithoutLockStatus @'Public.TeamFeatureDigitalSignatures getDef) + (getFeatureStatusNoConfig @'Public.TeamFeatureDigitalSignatures getDef) where -- FUTUREWORK: we may also want to get a default from the server config file here, like for -- sso, and team search visibility. @@ -414,14 +390,14 @@ getDigitalSignaturesInternal = setDigitalSignaturesInternal :: Members '[GundeckAccess, TeamFeatureStore, TeamStore, P.TinyLog] r => TeamId -> - Public.TeamFeatureStatus 'Public.WithoutLockStatus 'Public.TeamFeatureDigitalSignatures -> - Sem r (Public.TeamFeatureStatus 'Public.WithoutLockStatus 'Public.TeamFeatureDigitalSignatures) -setDigitalSignaturesInternal = setFeatureStatusNoConfig @'Public.WithoutLockStatus @'Public.TeamFeatureDigitalSignatures $ \_ _ -> pure () + Public.TeamFeatureStatus 'Public.TeamFeatureDigitalSignatures -> + Sem r (Public.TeamFeatureStatus 'Public.TeamFeatureDigitalSignatures) +setDigitalSignaturesInternal = setFeatureStatusNoConfig @'Public.TeamFeatureDigitalSignatures $ \_ _ -> pure () getLegalholdStatusInternal :: Members '[LegalHoldStore, TeamFeatureStore, TeamStore] r => GetFeatureInternalParam -> - Sem r (Public.TeamFeatureStatus 'Public.WithoutLockStatus 'Public.TeamFeatureLegalHold) + Sem r (Public.TeamFeatureStatus 'Public.TeamFeatureLegalHold) getLegalholdStatusInternal (Left _) = pure $ Public.TeamFeatureStatusNoConfig Public.TeamFeatureDisabled getLegalholdStatusInternal (Right tid) = do @@ -464,8 +440,8 @@ setLegalholdStatusInternal :: r ) => TeamId -> - Public.TeamFeatureStatus 'Public.WithoutLockStatus 'Public.TeamFeatureLegalHold -> - Sem r (Public.TeamFeatureStatus 'Public.WithoutLockStatus 'Public.TeamFeatureLegalHold) + Public.TeamFeatureStatus 'Public.TeamFeatureLegalHold -> + Sem r (Public.TeamFeatureStatus 'Public.TeamFeatureLegalHold) setLegalholdStatusInternal tid status@(Public.tfwoStatus -> statusValue) = do do -- this extra do is to encapsulate the assertions running before the actual operation. @@ -485,29 +461,29 @@ setLegalholdStatusInternal tid status@(Public.tfwoStatus -> statusValue) = do Public.TeamFeatureDisabled -> removeSettings' @p tid Public.TeamFeatureEnabled -> do ensureNotTooLargeToActivateLegalHold tid - TeamFeatures.setFeatureStatusNoConfig @'Public.WithoutLockStatus @'Public.TeamFeatureLegalHold tid status + TeamFeatures.setFeatureStatusNoConfig @'Public.TeamFeatureLegalHold tid status getFileSharingInternal :: Members '[Input Opts, TeamFeatureStore] r => GetFeatureInternalParam -> - Sem r (Public.TeamFeatureStatus 'Public.WithoutLockStatus 'Public.TeamFeatureFileSharing) + Sem r (Public.TeamFeatureStatus 'Public.TeamFeatureFileSharing) getFileSharingInternal = - getFeatureStatusWithDefaultConfig @'Public.WithoutLockStatus @'Public.TeamFeatureFileSharing flagFileSharing . either (const Nothing) Just + getFeatureStatusWithDefaultConfig @'Public.TeamFeatureFileSharing flagFileSharing . either (const Nothing) Just getFeatureStatusWithDefaultConfig :: - forall (ps :: Public.IncludeLockStatus) (a :: TeamFeatureName) r. + forall (a :: TeamFeatureName) r. ( KnownTeamFeatureName a, HasStatusCol a, - FeatureHasNoConfig ps a, + FeatureHasNoConfig a, Members '[Input Opts, TeamFeatureStore] r ) => - Lens' FeatureFlags (Defaults (Public.TeamFeatureStatus ps a)) -> + Lens' FeatureFlags (Defaults (Public.TeamFeatureStatus a)) -> Maybe TeamId -> - Sem r (Public.TeamFeatureStatus ps a) + Sem r (Public.TeamFeatureStatus a) getFeatureStatusWithDefaultConfig lens' = maybe (Public.TeamFeatureStatusNoConfig <$> getDef) - (getFeatureStatusNoConfig @ps @a getDef) + (getFeatureStatusNoConfig @a getDef) where getDef :: Sem r Public.TeamFeatureStatusValue getDef = @@ -517,14 +493,14 @@ getFeatureStatusWithDefaultConfig lens' = setFileSharingInternal :: Members '[GundeckAccess, TeamFeatureStore, TeamStore, P.TinyLog] r => TeamId -> - Public.TeamFeatureStatus 'Public.WithoutLockStatus 'Public.TeamFeatureFileSharing -> - Sem r (Public.TeamFeatureStatus 'Public.WithoutLockStatus 'Public.TeamFeatureFileSharing) -setFileSharingInternal = setFeatureStatusNoConfig @'Public.WithoutLockStatus @'Public.TeamFeatureFileSharing $ \_status _tid -> pure () + Public.TeamFeatureStatus 'Public.TeamFeatureFileSharing -> + Sem r (Public.TeamFeatureStatus 'Public.TeamFeatureFileSharing) +setFileSharingInternal = setFeatureStatusNoConfig @'Public.TeamFeatureFileSharing $ \_status _tid -> pure () getAppLockInternal :: Members '[Input Opts, TeamFeatureStore] r => GetFeatureInternalParam -> - Sem r (Public.TeamFeatureStatus 'Public.WithoutLockStatus 'Public.TeamFeatureAppLock) + Sem r (Public.TeamFeatureStatus 'Public.TeamFeatureAppLock) getAppLockInternal mbtid = do Defaults defaultStatus <- inputs (view (optSettings . setFeatureFlags . flagAppLockDefaults)) status <- @@ -534,104 +510,67 @@ getAppLockInternal mbtid = do setAppLockInternal :: Members '[GundeckAccess, TeamFeatureStore, TeamStore, Error TeamFeatureError, P.TinyLog] r => TeamId -> - Public.TeamFeatureStatus 'Public.WithoutLockStatus 'Public.TeamFeatureAppLock -> - Sem r (Public.TeamFeatureStatus 'Public.WithoutLockStatus 'Public.TeamFeatureAppLock) + Public.TeamFeatureStatus 'Public.TeamFeatureAppLock -> + Sem r (Public.TeamFeatureStatus 'Public.TeamFeatureAppLock) setAppLockInternal tid status = do when (Public.applockInactivityTimeoutSecs (Public.tfwcConfig status) < 30) $ throw AppLockinactivityTimeoutTooLow let pushEvent = pushFeatureConfigEvent tid $ Event.Event Event.Update Public.TeamFeatureAppLock (EdFeatureApplockChanged status) - TeamFeatures.setApplockFeatureStatus tid status <* pushEvent + (TeamFeatures.setApplockFeatureStatus tid status) <* pushEvent getClassifiedDomainsInternal :: Member (Input Opts) r => GetFeatureInternalParam -> - Sem r (Public.TeamFeatureStatus 'Public.WithoutLockStatus 'Public.TeamFeatureClassifiedDomains) + Sem r (Public.TeamFeatureStatus 'Public.TeamFeatureClassifiedDomains) getClassifiedDomainsInternal _mbtid = do globalConfig <- inputs (view (optSettings . setFeatureFlags . flagClassifiedDomains)) let config = globalConfig pure $ case Public.tfwcStatus config of - Public.TeamFeatureDisabled -> Public.defaultClassifiedDomains + Public.TeamFeatureDisabled -> + Public.TeamFeatureStatusWithConfig Public.TeamFeatureDisabled (Public.TeamFeatureClassifiedDomainsConfig []) Public.TeamFeatureEnabled -> config getConferenceCallingInternal :: Members '[BrigAccess, Input Opts, TeamFeatureStore] r => GetFeatureInternalParam -> - Sem r (Public.TeamFeatureStatus 'Public.WithoutLockStatus 'Public.TeamFeatureConferenceCalling) + Sem r (Public.TeamFeatureStatus 'Public.TeamFeatureConferenceCalling) getConferenceCallingInternal (Left (Just uid)) = do getFeatureConfigViaAccount @'Public.TeamFeatureConferenceCalling uid getConferenceCallingInternal (Left Nothing) = do - getFeatureStatusWithDefaultConfig @'Public.WithoutLockStatus @'Public.TeamFeatureConferenceCalling flagConferenceCalling Nothing + getFeatureStatusWithDefaultConfig @'Public.TeamFeatureConferenceCalling flagConferenceCalling Nothing getConferenceCallingInternal (Right tid) = do - getFeatureStatusWithDefaultConfig @'Public.WithoutLockStatus @'Public.TeamFeatureConferenceCalling flagConferenceCalling (Just tid) + getFeatureStatusWithDefaultConfig @'Public.TeamFeatureConferenceCalling flagConferenceCalling (Just tid) setConferenceCallingInternal :: Members '[GundeckAccess, TeamFeatureStore, TeamStore, P.TinyLog] r => TeamId -> - Public.TeamFeatureStatus 'Public.WithoutLockStatus 'Public.TeamFeatureConferenceCalling -> - Sem r (Public.TeamFeatureStatus 'Public.WithoutLockStatus 'Public.TeamFeatureConferenceCalling) + Public.TeamFeatureStatus 'Public.TeamFeatureConferenceCalling -> + Sem r (Public.TeamFeatureStatus 'Public.TeamFeatureConferenceCalling) setConferenceCallingInternal = - setFeatureStatusNoConfig @'Public.WithoutLockStatus @'Public.TeamFeatureConferenceCalling $ \_status _tid -> pure () + setFeatureStatusNoConfig @'Public.TeamFeatureConferenceCalling $ \_status _tid -> pure () getSelfDeletingMessagesInternal :: - forall r. - ( Member (Input Opts) r, - Member TeamFeatureStore r - ) => + Member TeamFeatureStore r => GetFeatureInternalParam -> - Sem r (Public.TeamFeatureStatus 'Public.WithLockStatus 'Public.TeamFeatureSelfDeletingMessages) + Sem r (Public.TeamFeatureStatus 'Public.TeamFeatureSelfDeletingMessages) getSelfDeletingMessagesInternal = \case - Left _ -> getCfgDefault - Right tid -> do - cfgDefault <- getCfgDefault - let defLockStatus = Public.tfwcapsLockStatus cfgDefault - (maybeFeatureStatus, fromMaybe defLockStatus -> lockStatus) <- TeamFeatures.getSelfDeletingMessagesStatus tid - pure $ case (lockStatus, maybeFeatureStatus) of - (Public.Unlocked, Just featureStatus) -> - Public.TeamFeatureStatusWithConfigAndLockStatus - (Public.tfwcStatus featureStatus) - (Public.tfwcConfig featureStatus) - Public.Unlocked - (Public.Unlocked, Nothing) -> cfgDefault {Public.tfwcapsLockStatus = Public.Unlocked} - (Public.Locked, _) -> cfgDefault {Public.tfwcapsLockStatus = Public.Locked} - where - getCfgDefault :: Sem r (Public.TeamFeatureStatusWithConfigAndLockStatus Public.TeamFeatureSelfDeletingMessagesConfig) - getCfgDefault = input <&> view (optSettings . setFeatureFlags . flagSelfDeletingMessages . unDefaults) + Left _ -> pure Public.defaultSelfDeletingMessagesStatus + Right tid -> + TeamFeatures.getSelfDeletingMessagesStatus tid + <&> maybe Public.defaultSelfDeletingMessagesStatus id setSelfDeletingMessagesInternal :: - Members - '[ GundeckAccess, - TeamStore, - TeamFeatureStore, - P.TinyLog, - Error TeamFeatureError - ] - r => + Members '[GundeckAccess, TeamFeatureStore, TeamStore, P.TinyLog] r => TeamId -> - Public.TeamFeatureStatus 'Public.WithoutLockStatus 'Public.TeamFeatureSelfDeletingMessages -> - Sem r (Public.TeamFeatureStatus 'Public.WithoutLockStatus 'Public.TeamFeatureSelfDeletingMessages) + Public.TeamFeatureStatus 'Public.TeamFeatureSelfDeletingMessages -> + Sem r (Public.TeamFeatureStatus 'Public.TeamFeatureSelfDeletingMessages) setSelfDeletingMessagesInternal tid st = do - guardLockStatus @'Public.TeamFeatureSelfDeletingMessages tid Public.Locked let pushEvent = pushFeatureConfigEvent tid $ Event.Event Event.Update Public.TeamFeatureSelfDeletingMessages (EdFeatureSelfDeletingMessagesChanged st) - TeamFeatures.setSelfDeletingMessagesStatus tid st <* pushEvent - --- TODO(fisx): move this function to a more suitable place / module. -guardLockStatus :: - forall (a :: Public.TeamFeatureName) r. - ( MaybeHasLockStatusCol a, - Member TeamFeatureStore r, - Member (Error TeamFeatureError) r - ) => - TeamId -> - Public.LockStatusValue -> -- FUTUREWORK(fisx): move this into its own type class and infer from `a`? - Sem r () -guardLockStatus tid defLockStatus = do - (TeamFeatures.getLockStatus @a tid <&> fromMaybe defLockStatus) >>= \case - Public.Unlocked -> pure () - Public.Locked -> throw FeatureLocked + (TeamFeatures.setSelfDeletingMessagesStatus tid st) <* pushEvent pushFeatureConfigEvent :: Members '[GundeckAccess, TeamStore, P.TinyLog] r => @@ -649,7 +588,7 @@ pushFeatureConfigEvent tid event = do let recipients = membersToRecipients Nothing (memList ^. teamMembers) for_ (newPush (memList ^. teamMemberListType) Nothing (FeatureConfigEvent event) recipients) - push1 + (push1) -- | (Currently, we only have 'Public.TeamFeatureConferenceCalling' here, but we may have to -- extend this in the future.) @@ -658,5 +597,5 @@ getFeatureConfigViaAccount :: Member BrigAccess r ) => UserId -> - Sem r (Public.TeamFeatureStatus 'Public.WithoutLockStatus flag) + Sem r (Public.TeamFeatureStatus flag) getFeatureConfigViaAccount = getAccountFeatureConfigClient diff --git a/services/galley/src/Galley/Cassandra.hs b/services/galley/src/Galley/Cassandra.hs index 83a0a5abd1f..a32e4fdce1a 100644 --- a/services/galley/src/Galley/Cassandra.hs +++ b/services/galley/src/Galley/Cassandra.hs @@ -20,4 +20,4 @@ module Galley.Cassandra (schemaVersion) where import Imports schemaVersion :: Int32 -schemaVersion = 55 +schemaVersion = 54 diff --git a/services/galley/src/Galley/Cassandra/TeamFeatures.hs b/services/galley/src/Galley/Cassandra/TeamFeatures.hs index c72d549f656..e723fe47689 100644 --- a/services/galley/src/Galley/Cassandra/TeamFeatures.hs +++ b/services/galley/src/Galley/Cassandra/TeamFeatures.hs @@ -30,16 +30,15 @@ import Polysemy.Input import Wire.API.Team.Feature getFeatureStatusNoConfig :: - forall (ps :: IncludeLockStatus) (a :: TeamFeatureName) m. + forall (a :: TeamFeatureName) m. ( MonadClient m, - FeatureHasNoConfig ps a, + FeatureHasNoConfig a, HasStatusCol a ) => - Proxy ps -> Proxy a -> TeamId -> - m (Maybe (TeamFeatureStatus ps a)) -getFeatureStatusNoConfig _ _ tid = do + m (Maybe (TeamFeatureStatus a)) +getFeatureStatusNoConfig _ tid = do let q = query1 select (params LocalQuorum (Identity tid)) mStatusValue <- (>>= runIdentity) <$> retry x1 q pure $ TeamFeatureStatusNoConfig <$> mStatusValue @@ -48,17 +47,16 @@ getFeatureStatusNoConfig _ _ tid = do select = fromString $ "select " <> statusCol @a <> " from team_features where team_id = ?" setFeatureStatusNoConfig :: - forall (ps :: IncludeLockStatus) (a :: TeamFeatureName) m. + forall (a :: TeamFeatureName) m. ( MonadClient m, - FeatureHasNoConfig ps a, + FeatureHasNoConfig a, HasStatusCol a ) => - Proxy ps -> Proxy a -> TeamId -> - TeamFeatureStatus ps a -> - m (TeamFeatureStatus ps a) -setFeatureStatusNoConfig _ _ tid status = do + TeamFeatureStatus a -> + m (TeamFeatureStatus a) +setFeatureStatusNoConfig _ tid status = do let flag = tfwoStatus status retry x5 $ write insert (params LocalQuorum (tid, flag)) pure status @@ -70,7 +68,7 @@ getApplockFeatureStatus :: forall m. (MonadClient m) => TeamId -> - m (Maybe (TeamFeatureStatus 'WithoutLockStatus 'TeamFeatureAppLock)) + m (Maybe (TeamFeatureStatus 'TeamFeatureAppLock)) getApplockFeatureStatus tid = do let q = query1 select (params LocalQuorum (Identity tid)) mTuple <- retry x1 q @@ -87,8 +85,8 @@ getApplockFeatureStatus tid = do setApplockFeatureStatus :: (MonadClient m) => TeamId -> - TeamFeatureStatus 'WithoutLockStatus 'TeamFeatureAppLock -> - m (TeamFeatureStatus 'WithoutLockStatus 'TeamFeatureAppLock) + TeamFeatureStatus 'TeamFeatureAppLock -> + m (TeamFeatureStatus 'TeamFeatureAppLock) setApplockFeatureStatus tid status = do let statusValue = tfwcStatus status enforce = applockEnforceAppLock . tfwcConfig $ status @@ -107,30 +105,27 @@ getSelfDeletingMessagesStatus :: forall m. (MonadClient m) => TeamId -> - m (Maybe (TeamFeatureStatus 'WithoutLockStatus 'TeamFeatureSelfDeletingMessages), Maybe LockStatusValue) + m (Maybe (TeamFeatureStatus 'TeamFeatureSelfDeletingMessages)) getSelfDeletingMessagesStatus tid = do let q = query1 select (params LocalQuorum (Identity tid)) mTuple <- retry x1 q - pure - ( mTuple >>= \(mbStatusValue, mbTimeout, _) -> - TeamFeatureStatusWithConfig <$> mbStatusValue <*> (TeamFeatureSelfDeletingMessagesConfig <$> mbTimeout), - mTuple >>= \(_, _, mbLockStatus) -> mbLockStatus - ) + pure $ + mTuple >>= \(mbStatusValue, mbTimeout) -> + TeamFeatureStatusWithConfig <$> mbStatusValue <*> (TeamFeatureSelfDeletingMessagesConfig <$> mbTimeout) where - select :: PrepQuery R (Identity TeamId) (Maybe TeamFeatureStatusValue, Maybe Int32, Maybe LockStatusValue) + select :: PrepQuery R (Identity TeamId) (Maybe TeamFeatureStatusValue, Maybe Int32) select = fromString $ "select " <> statusCol @'TeamFeatureSelfDeletingMessages - <> ", self_deleting_messages_ttl, " - <> lockStatusCol @'TeamFeatureSelfDeletingMessages - <> " from team_features where team_id = ?" + <> ", self_deleting_messages_ttl " + <> "from team_features where team_id = ?" setSelfDeletingMessagesStatus :: (MonadClient m) => TeamId -> - TeamFeatureStatus 'WithoutLockStatus 'TeamFeatureSelfDeletingMessages -> - m (TeamFeatureStatus 'WithoutLockStatus 'TeamFeatureSelfDeletingMessages) + TeamFeatureStatus 'TeamFeatureSelfDeletingMessages -> + m (TeamFeatureStatus 'TeamFeatureSelfDeletingMessages) setSelfDeletingMessagesStatus tid status = do let statusValue = tfwcStatus status timeout = sdmEnforcedTimeoutSeconds . tfwcConfig $ status @@ -145,55 +140,13 @@ setSelfDeletingMessagesStatus tid status = do <> ", self_deleting_messages_ttl) " <> "values (?, ?, ?)" -setLockStatus :: - forall (a :: TeamFeatureName) m. - ( MonadClient m, - HasLockStatusCol a - ) => - Proxy a -> - TeamId -> - LockStatus -> - m LockStatus -setLockStatus _ tid (LockStatus lockStatus) = do - retry x5 $ write insert (params LocalQuorum (tid, lockStatus)) - pure (LockStatus lockStatus) - where - insert :: PrepQuery W (TeamId, LockStatusValue) () - insert = - fromString $ - "insert into team_features (team_id, " <> lockStatusCol @a <> ") values (?, ?)" - -getLockStatus :: - forall (a :: TeamFeatureName) m. - ( MonadClient m, - MaybeHasLockStatusCol a - ) => - Proxy a -> - TeamId -> - m (Maybe LockStatusValue) -getLockStatus _ tid = - case maybeLockStatusCol @a of - Nothing -> pure Nothing - Just lockStatusColName -> do - let q = query1 select (params LocalQuorum (Identity tid)) - (>>= runIdentity) <$> retry x1 q - where - select :: PrepQuery R (Identity TeamId) (Identity (Maybe LockStatusValue)) - select = - fromString $ - "select " - <> lockStatusColName - <> " from team_features where team_id = ?" - interpretTeamFeatureStoreToCassandra :: Members '[Embed IO, Input ClientState] r => Sem (TeamFeatureStore ': r) a -> Sem r a interpretTeamFeatureStoreToCassandra = interpret $ \case - GetFeatureStatusNoConfig' ps tfn tid -> embedClient $ getFeatureStatusNoConfig ps tfn tid - SetFeatureStatusNoConfig' ps tfn tid value -> embedClient $ setFeatureStatusNoConfig ps tfn tid value - SetLockStatus' p tid value -> embedClient $ setLockStatus p tid value - GetLockStatus' p tid -> embedClient $ getLockStatus p tid + GetFeatureStatusNoConfig' p tid -> embedClient $ getFeatureStatusNoConfig p tid + SetFeatureStatusNoConfig' p tid value -> embedClient $ setFeatureStatusNoConfig p tid value GetApplockFeatureStatus tid -> embedClient $ getApplockFeatureStatus tid SetApplockFeatureStatus tid value -> embedClient $ setApplockFeatureStatus tid value GetSelfDeletingMessagesStatus tid -> embedClient $ getSelfDeletingMessagesStatus tid diff --git a/services/galley/src/Galley/Data/TeamFeatures.hs b/services/galley/src/Galley/Data/TeamFeatures.hs index 65a6cc6648b..e7ab337d0f5 100644 --- a/services/galley/src/Galley/Data/TeamFeatures.hs +++ b/services/galley/src/Galley/Data/TeamFeatures.hs @@ -15,7 +15,7 @@ -- You should have received a copy of the GNU Affero General Public License along -- with this program. If not, see . -module Galley.Data.TeamFeatures (HasStatusCol (..), HasLockStatusCol (..), MaybeHasLockStatusCol (..)) where +module Galley.Data.TeamFeatures (HasStatusCol (..)) where import Imports import Wire.API.Team.Feature @@ -48,33 +48,3 @@ instance HasStatusCol 'TeamFeatureFileSharing where statusCol = "file_sharing" instance HasStatusCol 'TeamFeatureConferenceCalling where statusCol = "conference_calling" instance HasStatusCol 'TeamFeatureSelfDeletingMessages where statusCol = "self_deleting_messages_status" - ----------------------------------------------------------------------- -class HasLockStatusCol (a :: TeamFeatureName) where - lockStatusCol :: String - -class MaybeHasLockStatusCol (a :: TeamFeatureName) where - maybeLockStatusCol :: Maybe String - -instance {-# OVERLAPPABLE #-} HasLockStatusCol a => MaybeHasLockStatusCol a where - maybeLockStatusCol = Just (lockStatusCol @a) - ----------------------------------------------------------------------- -instance HasLockStatusCol 'TeamFeatureSelfDeletingMessages where - lockStatusCol = "self_deleting_messages_lock_status" - -instance MaybeHasLockStatusCol 'TeamFeatureLegalHold where maybeLockStatusCol = Nothing - -instance MaybeHasLockStatusCol 'TeamFeatureSSO where maybeLockStatusCol = Nothing - -instance MaybeHasLockStatusCol 'TeamFeatureSearchVisibility where maybeLockStatusCol = Nothing - -instance MaybeHasLockStatusCol 'TeamFeatureValidateSAMLEmails where maybeLockStatusCol = Nothing - -instance MaybeHasLockStatusCol 'TeamFeatureDigitalSignatures where maybeLockStatusCol = Nothing - -instance MaybeHasLockStatusCol 'TeamFeatureAppLock where maybeLockStatusCol = Nothing - -instance MaybeHasLockStatusCol 'TeamFeatureFileSharing where maybeLockStatusCol = Nothing - -instance MaybeHasLockStatusCol 'TeamFeatureConferenceCalling where maybeLockStatusCol = Nothing diff --git a/services/galley/src/Galley/Effects/TeamFeatureStore.hs b/services/galley/src/Galley/Effects/TeamFeatureStore.hs index 8e5673ba242..d2910980f20 100644 --- a/services/galley/src/Galley/Effects/TeamFeatureStore.hs +++ b/services/galley/src/Galley/Effects/TeamFeatureStore.hs @@ -23,8 +23,6 @@ module Galley.Effects.TeamFeatureStore setApplockFeatureStatus, getSelfDeletingMessagesStatus, setSelfDeletingMessagesStatus, - setLockStatus, - getLockStatus, ) where @@ -38,83 +36,51 @@ import Wire.API.Team.Feature data TeamFeatureStore m a where -- the proxy argument makes sure that makeSem below generates type-inference-friendly code GetFeatureStatusNoConfig' :: - forall (ps :: IncludeLockStatus) (a :: TeamFeatureName) m. - ( FeatureHasNoConfig ps a, + forall (a :: TeamFeatureName) m. + ( FeatureHasNoConfig a, HasStatusCol a ) => - Proxy ps -> Proxy a -> TeamId -> - TeamFeatureStore m (Maybe (TeamFeatureStatus ps a)) + TeamFeatureStore m (Maybe (TeamFeatureStatus a)) -- the proxy argument makes sure that makeSem below generates type-inference-friendly code SetFeatureStatusNoConfig' :: - forall (ps :: IncludeLockStatus) (a :: TeamFeatureName) m. - ( FeatureHasNoConfig ps a, + forall (a :: TeamFeatureName) m. + ( FeatureHasNoConfig a, HasStatusCol a ) => - Proxy ps -> Proxy a -> TeamId -> - TeamFeatureStatus ps a -> - TeamFeatureStore m (TeamFeatureStatus ps a) + TeamFeatureStatus a -> + TeamFeatureStore m (TeamFeatureStatus a) GetApplockFeatureStatus :: TeamId -> - TeamFeatureStore m (Maybe (TeamFeatureStatus ps 'TeamFeatureAppLock)) + TeamFeatureStore m (Maybe (TeamFeatureStatus 'TeamFeatureAppLock)) SetApplockFeatureStatus :: TeamId -> - TeamFeatureStatus 'WithoutLockStatus 'TeamFeatureAppLock -> - TeamFeatureStore m (TeamFeatureStatus 'WithoutLockStatus 'TeamFeatureAppLock) + TeamFeatureStatus 'TeamFeatureAppLock -> + TeamFeatureStore m (TeamFeatureStatus 'TeamFeatureAppLock) GetSelfDeletingMessagesStatus :: TeamId -> - TeamFeatureStore m (Maybe (TeamFeatureStatus 'WithoutLockStatus 'TeamFeatureSelfDeletingMessages), Maybe LockStatusValue) + TeamFeatureStore m (Maybe (TeamFeatureStatus 'TeamFeatureSelfDeletingMessages)) SetSelfDeletingMessagesStatus :: TeamId -> - TeamFeatureStatus 'WithoutLockStatus 'TeamFeatureSelfDeletingMessages -> - TeamFeatureStore m (TeamFeatureStatus 'WithoutLockStatus 'TeamFeatureSelfDeletingMessages) - SetLockStatus' :: - forall (a :: TeamFeatureName) m. - ( HasLockStatusCol a - ) => - Proxy a -> - TeamId -> - LockStatus -> - TeamFeatureStore m LockStatus - GetLockStatus' :: - forall (a :: TeamFeatureName) m. - ( MaybeHasLockStatusCol a - ) => - Proxy a -> - TeamId -> - TeamFeatureStore m (Maybe LockStatusValue) + TeamFeatureStatus 'TeamFeatureSelfDeletingMessages -> + TeamFeatureStore m (TeamFeatureStatus 'TeamFeatureSelfDeletingMessages) makeSem ''TeamFeatureStore getFeatureStatusNoConfig :: - forall (ps :: IncludeLockStatus) (a :: TeamFeatureName) r. - (Member TeamFeatureStore r, FeatureHasNoConfig ps a, HasStatusCol a) => - TeamId -> - Sem r (Maybe (TeamFeatureStatus ps a)) -getFeatureStatusNoConfig = getFeatureStatusNoConfig' (Proxy @ps) (Proxy @a) - -setFeatureStatusNoConfig :: - forall (ps :: IncludeLockStatus) (a :: TeamFeatureName) r. - (Member TeamFeatureStore r, FeatureHasNoConfig ps a, HasStatusCol a) => - TeamId -> - TeamFeatureStatus ps a -> - Sem r (TeamFeatureStatus ps a) -setFeatureStatusNoConfig = setFeatureStatusNoConfig' (Proxy @ps) (Proxy @a) - -setLockStatus :: forall (a :: TeamFeatureName) r. - (Member TeamFeatureStore r, HasLockStatusCol a) => + (Member TeamFeatureStore r, FeatureHasNoConfig a, HasStatusCol a) => TeamId -> - LockStatus -> - Sem r LockStatus -setLockStatus = setLockStatus' (Proxy @a) + Sem r (Maybe (TeamFeatureStatus a)) +getFeatureStatusNoConfig = getFeatureStatusNoConfig' (Proxy @a) -getLockStatus :: +setFeatureStatusNoConfig :: forall (a :: TeamFeatureName) r. - (Member TeamFeatureStore r, MaybeHasLockStatusCol a) => + (Member TeamFeatureStore r, FeatureHasNoConfig a, HasStatusCol a) => TeamId -> - Sem r (Maybe LockStatusValue) -getLockStatus = getLockStatus' (Proxy @a) + TeamFeatureStatus a -> + Sem r (TeamFeatureStatus a) +setFeatureStatusNoConfig = setFeatureStatusNoConfig' (Proxy @a) diff --git a/services/galley/test/integration/API/Teams.hs b/services/galley/test/integration/API/Teams.hs index a1edf78225a..43985abb00b 100644 --- a/services/galley/test/integration/API/Teams.hs +++ b/services/galley/test/integration/API/Teams.hs @@ -355,7 +355,7 @@ testEnableSSOPerTeam = do assertQueue "create team" tActivate let check :: HasCallStack => String -> Public.TeamFeatureStatusValue -> TestM () check msg enabledness = do - status :: Public.TeamFeatureStatus 'Public.WithoutLockStatus 'Public.TeamFeatureSSO <- responseJsonUnsafe <$> (getSSOEnabledInternal tid (getSSOEnabledInternal tid TestM () @@ -382,10 +382,10 @@ testEnableSSOPerTeam = do testEnableTeamSearchVisibilityPerTeam :: TestM () testEnableTeamSearchVisibilityPerTeam = do g <- view tsGalley - (tid, owner, member : _) <- Util.createBindingTeamWithMembers 2 + (tid, owner, (member : _)) <- Util.createBindingTeamWithMembers 2 let check :: (HasCallStack, MonadCatch m, MonadIO m, Monad m, MonadHttp m) => String -> Public.TeamFeatureStatusValue -> m () check msg enabledness = do - status :: Public.TeamFeatureStatus 'Public.WithoutLockStatus 'Public.TeamFeatureSearchVisibility <- responseJsonUnsafe <$> (Util.getTeamSearchVisibilityAvailableInternal g tid (Util.getTeamSearchVisibilityAvailableInternal g tid return (x, xs) (201, 200, _, _) -> createAndConnectUserWhileLimitNotReached alice (remaining -1) ((uid, cid) : acc) pk (403, 403, _, []) -> error "Need to connect with at least 1 user" - (403, 403, _, x : xs) -> return (x, xs) + (403, 403, _, (x : xs)) -> return (x, xs) (xxx, yyy, _, _) -> error ("Unexpected while connecting users: " ++ show xxx ++ " and " ++ show yyy) newTeamMember' :: Permissions -> UserId -> TeamMember @@ -1892,7 +1892,7 @@ getSSOEnabledInternal :: HasCallStack => TeamId -> TestM ResponseLBS getSSOEnabledInternal = Util.getTeamFeatureFlagInternal Public.TeamFeatureSSO putSSOEnabledInternal :: HasCallStack => TeamId -> Public.TeamFeatureStatusValue -> TestM () -putSSOEnabledInternal tid statusValue = void $ Util.putTeamFeatureFlagInternal @'Public.WithoutLockStatus @'Public.TeamFeatureSSO expect2xx tid (Public.TeamFeatureStatusNoConfig statusValue) +putSSOEnabledInternal tid statusValue = Util.putTeamFeatureFlagInternal @'Public.TeamFeatureSSO expect2xx tid (Public.TeamFeatureStatusNoConfig statusValue) getSearchVisibility :: HasCallStack => (Request -> Request) -> UserId -> TeamId -> (MonadIO m, MonadHttp m) => m ResponseLBS getSearchVisibility g uid tid = do diff --git a/services/galley/test/integration/API/Teams/Feature.hs b/services/galley/test/integration/API/Teams/Feature.hs index ba2a64110d5..76c5f7b408d 100644 --- a/services/galley/test/integration/API/Teams/Feature.hs +++ b/services/galley/test/integration/API/Teams/Feature.hs @@ -22,7 +22,7 @@ import qualified API.Util as Util import qualified API.Util.TeamFeature as Util import Bilge import Bilge.Assert -import Control.Lens (over, to, view) +import Control.Lens (over, view) import Control.Monad.Catch (MonadCatch) import Data.Aeson (FromJSON, ToJSON, object, (.=)) import qualified Data.Aeson as Aeson @@ -60,15 +60,15 @@ tests s = [ test s "SSO" testSSO, test s "LegalHold" testLegalHold, test s "SearchVisibility" testSearchVisibility, - test s "DigitalSignatures" $ testSimpleFlag @'Public.WithoutLockStatus @'Public.TeamFeatureDigitalSignatures Public.TeamFeatureDisabled, - test s "ValidateSAMLEmails" $ testSimpleFlag @'Public.WithoutLockStatus @'Public.TeamFeatureValidateSAMLEmails Public.TeamFeatureDisabled, - test s "FileSharing" $ testSimpleFlag @'Public.WithoutLockStatus @'Public.TeamFeatureFileSharing Public.TeamFeatureEnabled, + test s "DigitalSignatures" $ testSimpleFlag @'Public.TeamFeatureDigitalSignatures Public.TeamFeatureDisabled, + test s "ValidateSAMLEmails" $ testSimpleFlag @'Public.TeamFeatureValidateSAMLEmails Public.TeamFeatureDisabled, + test s "FileSharing" $ testSimpleFlag @'Public.TeamFeatureFileSharing Public.TeamFeatureEnabled, test s "Classified Domains (enabled)" testClassifiedDomainsEnabled, test s "Classified Domains (disabled)" testClassifiedDomainsDisabled, test s "All features" testAllFeatures, test s "Feature Configs / Team Features Consistency" testFeatureConfigConsistency, - test s "ConferenceCalling" $ testSimpleFlag @'Public.WithoutLockStatus @'Public.TeamFeatureConferenceCalling Public.TeamFeatureEnabled, - test s "SelfDeletingMessages" testSelfDeletingMessages + test s "ConferenceCalling" $ testSimpleFlag @'Public.TeamFeatureConferenceCalling Public.TeamFeatureEnabled, + test s "SelfDeletingMessages" $ testSelfDeletingMessages ] testSSO :: TestM () @@ -81,13 +81,13 @@ testSSO = do Util.addTeamMember owner tid member (rolePermissions RoleMember) Nothing let getSSO :: HasCallStack => Public.TeamFeatureStatusValue -> TestM () - getSSO = assertFlagNoConfig @'Public.WithoutLockStatus @'Public.TeamFeatureSSO $ Util.getTeamFeatureFlag Public.TeamFeatureSSO member tid + getSSO = assertFlagNoConfig @'Public.TeamFeatureSSO $ Util.getTeamFeatureFlag Public.TeamFeatureSSO member tid getSSOFeatureConfig :: HasCallStack => Public.TeamFeatureStatusValue -> TestM () - getSSOFeatureConfig = assertFlagNoConfig @'Public.WithoutLockStatus @'Public.TeamFeatureSSO $ Util.getFeatureConfig Public.TeamFeatureSSO member + getSSOFeatureConfig = assertFlagNoConfig @'Public.TeamFeatureSSO $ Util.getFeatureConfig Public.TeamFeatureSSO member getSSOInternal :: HasCallStack => Public.TeamFeatureStatusValue -> TestM () - getSSOInternal = assertFlagNoConfig @'Public.WithoutLockStatus @'Public.TeamFeatureSSO $ Util.getTeamFeatureFlagInternal Public.TeamFeatureSSO tid + getSSOInternal = assertFlagNoConfig @'Public.TeamFeatureSSO $ Util.getTeamFeatureFlagInternal Public.TeamFeatureSSO tid setSSOInternal :: HasCallStack => Public.TeamFeatureStatusValue -> TestM () - setSSOInternal = void . Util.putTeamFeatureFlagInternal @'Public.WithoutLockStatus @'Public.TeamFeatureSSO expect2xx tid . Public.TeamFeatureStatusNoConfig + setSSOInternal = Util.putTeamFeatureFlagInternal @'Public.TeamFeatureSSO expect2xx tid . Public.TeamFeatureStatusNoConfig assertFlagForbidden $ Util.getTeamFeatureFlag Public.TeamFeatureSSO nonMember tid @@ -121,13 +121,13 @@ testLegalHold = do Util.addTeamMember owner tid member (rolePermissions RoleMember) Nothing let getLegalHold :: HasCallStack => Public.TeamFeatureStatusValue -> TestM () - getLegalHold = assertFlagNoConfig @'Public.WithoutLockStatus @'Public.TeamFeatureLegalHold $ Util.getTeamFeatureFlag Public.TeamFeatureLegalHold member tid + getLegalHold = assertFlagNoConfig @'Public.TeamFeatureLegalHold $ Util.getTeamFeatureFlag Public.TeamFeatureLegalHold member tid getLegalHoldInternal :: HasCallStack => Public.TeamFeatureStatusValue -> TestM () - getLegalHoldInternal = assertFlagNoConfig @'Public.WithoutLockStatus @'Public.TeamFeatureLegalHold $ Util.getTeamFeatureFlagInternal Public.TeamFeatureLegalHold tid - getLegalHoldFeatureConfig = assertFlagNoConfig @'Public.WithoutLockStatus @'Public.TeamFeatureLegalHold $ Util.getFeatureConfig Public.TeamFeatureLegalHold member + getLegalHoldInternal = assertFlagNoConfig @'Public.TeamFeatureLegalHold $ Util.getTeamFeatureFlagInternal Public.TeamFeatureLegalHold tid + getLegalHoldFeatureConfig = assertFlagNoConfig @'Public.TeamFeatureLegalHold $ Util.getFeatureConfig Public.TeamFeatureLegalHold member setLegalHoldInternal :: HasCallStack => Public.TeamFeatureStatusValue -> TestM () - setLegalHoldInternal = void . Util.putTeamFeatureFlagInternal @'Public.WithoutLockStatus @'Public.TeamFeatureLegalHold expect2xx tid . Public.TeamFeatureStatusNoConfig + setLegalHoldInternal = Util.putTeamFeatureFlagInternal @'Public.TeamFeatureLegalHold expect2xx tid . Public.TeamFeatureStatusNoConfig getLegalHold Public.TeamFeatureDisabled getLegalHoldInternal Public.TeamFeatureDisabled @@ -249,7 +249,7 @@ getClassifiedDomains :: (HasCallStack, HasGalley m, MonadIO m, MonadHttp m, MonadCatch m) => UserId -> TeamId -> - Public.TeamFeatureStatus 'Public.WithoutLockStatus 'Public.TeamFeatureClassifiedDomains -> + Public.TeamFeatureStatus 'Public.TeamFeatureClassifiedDomains -> m () getClassifiedDomains member tid = assertFlagWithConfig @Public.TeamFeatureClassifiedDomainsConfig $ @@ -258,7 +258,7 @@ getClassifiedDomains member tid = getClassifiedDomainsInternal :: (HasCallStack, HasGalley m, MonadIO m, MonadHttp m, MonadCatch m) => TeamId -> - Public.TeamFeatureStatus 'Public.WithoutLockStatus 'Public.TeamFeatureClassifiedDomains -> + Public.TeamFeatureStatus 'Public.TeamFeatureClassifiedDomains -> m () getClassifiedDomainsInternal tid = assertFlagWithConfig @Public.TeamFeatureClassifiedDomainsConfig $ @@ -276,7 +276,7 @@ testClassifiedDomainsEnabled = do let getClassifiedDomainsFeatureConfig :: (HasCallStack, HasGalley m, MonadIO m, MonadHttp m, MonadCatch m) => UserId -> - Public.TeamFeatureStatus 'Public.WithoutLockStatus 'Public.TeamFeatureClassifiedDomains -> + Public.TeamFeatureStatus 'Public.TeamFeatureClassifiedDomains -> m () getClassifiedDomainsFeatureConfig uid = do assertFlagWithConfig @Public.TeamFeatureClassifiedDomainsConfig $ @@ -298,7 +298,7 @@ testClassifiedDomainsDisabled = do let getClassifiedDomainsFeatureConfig :: (HasCallStack, HasGalley m, MonadIO m, MonadHttp m, MonadCatch m) => UserId -> - Public.TeamFeatureStatus 'Public.WithoutLockStatus 'Public.TeamFeatureClassifiedDomains -> + Public.TeamFeatureStatus 'Public.TeamFeatureClassifiedDomains -> m () getClassifiedDomainsFeatureConfig uid = do assertFlagWithConfig @Public.TeamFeatureClassifiedDomainsConfig $ @@ -316,13 +316,13 @@ testClassifiedDomainsDisabled = do getClassifiedDomainsFeatureConfig member expected testSimpleFlag :: - forall (ps :: Public.IncludeLockStatus) (a :: Public.TeamFeatureName). + forall (a :: Public.TeamFeatureName). ( HasCallStack, Typeable a, - Public.FeatureHasNoConfig ps a, + Public.FeatureHasNoConfig a, Public.KnownTeamFeatureName a, - FromJSON (Public.TeamFeatureStatus 'Public.WithoutLockStatus a), - ToJSON (Public.TeamFeatureStatus ps a) + FromJSON (Public.TeamFeatureStatus a), + ToJSON (Public.TeamFeatureStatus a) ) => Public.TeamFeatureStatusValue -> TestM () @@ -337,19 +337,19 @@ testSimpleFlag defaultValue = do let getFlag :: HasCallStack => Public.TeamFeatureStatusValue -> TestM () getFlag expected = - flip (assertFlagNoConfig @ps @a) expected $ Util.getTeamFeatureFlag feature member tid + flip (assertFlagNoConfig @a) expected $ Util.getTeamFeatureFlag feature member tid getFeatureConfig :: HasCallStack => Public.TeamFeatureStatusValue -> TestM () getFeatureConfig expected = - flip (assertFlagNoConfig @ps @a) expected $ Util.getFeatureConfig feature member + flip (assertFlagNoConfig @a) expected $ Util.getFeatureConfig feature member getFlagInternal :: HasCallStack => Public.TeamFeatureStatusValue -> TestM () getFlagInternal expected = - flip (assertFlagNoConfig @ps @a) expected $ Util.getTeamFeatureFlagInternal feature tid + flip (assertFlagNoConfig @a) expected $ Util.getTeamFeatureFlagInternal feature tid setFlagInternal :: Public.TeamFeatureStatusValue -> TestM () setFlagInternal statusValue = - void $ Util.putTeamFeatureFlagInternal @ps @a expect2xx tid (Public.TeamFeatureStatusNoConfig statusValue) + Util.putTeamFeatureFlagInternal @a expect2xx tid (Public.TeamFeatureStatusNoConfig statusValue) assertFlagForbidden $ Util.getTeamFeatureFlag feature nonMember tid @@ -380,50 +380,32 @@ testSimpleFlag defaultValue = do testSelfDeletingMessages :: TestM () testSelfDeletingMessages = do - defLockStatus :: Public.LockStatusValue <- - view - ( tsGConf - . optSettings - . setFeatureFlags - . flagSelfDeletingMessages - . unDefaults - . to Public.tfwcapsLockStatus - ) - -- personal users - let settingWithoutLockStatus :: TeamFeatureStatusValue -> Int32 -> Public.TeamFeatureStatus 'Public.WithoutLockStatus 'Public.TeamFeatureSelfDeletingMessages - settingWithoutLockStatus stat tout = + let setting :: TeamFeatureStatusValue -> Int32 -> Public.TeamFeatureStatus 'Public.TeamFeatureSelfDeletingMessages + setting stat tout = Public.TeamFeatureStatusWithConfig @Public.TeamFeatureSelfDeletingMessagesConfig stat (Public.TeamFeatureSelfDeletingMessagesConfig tout) - settingWithLockStatus :: TeamFeatureStatusValue -> Int32 -> Public.LockStatusValue -> Public.TeamFeatureStatus 'Public.WithLockStatus 'Public.TeamFeatureSelfDeletingMessages - settingWithLockStatus stat tout lockStatus = - Public.TeamFeatureStatusWithConfigAndLockStatus @Public.TeamFeatureSelfDeletingMessagesConfig - stat - (Public.TeamFeatureSelfDeletingMessagesConfig tout) - lockStatus personalUser <- Util.randomUser Util.getFeatureConfig Public.TeamFeatureSelfDeletingMessages personalUser - !!! responseJsonEither === const (Right $ settingWithLockStatus TeamFeatureEnabled 0 defLockStatus) + !!! responseJsonEither === const (Right $ setting TeamFeatureEnabled 0) -- team users galley <- view tsGalley (owner, tid, []) <- Util.createBindingTeamWithNMembers 0 - let checkSet :: TeamFeatureStatusValue -> Int32 -> Int -> TestM () - checkSet stat tout expectedStatusCode = - do - Util.putTeamFeatureFlagInternal @'Public.WithoutLockStatus @'Public.TeamFeatureSelfDeletingMessages - galley - tid - (settingWithoutLockStatus stat tout) - !!! statusCode === const expectedStatusCode + let checkSet :: TeamFeatureStatusValue -> Int32 -> TestM () + checkSet stat tout = do + Util.putTeamFeatureFlagInternal @'Public.TeamFeatureSelfDeletingMessages + galley + tid + (setting stat tout) -- internal, public (/team/:tid/features), and team-agnostic (/feature-configs). - checkGet :: HasCallStack => TeamFeatureStatusValue -> Int32 -> Public.LockStatusValue -> TestM () - checkGet stat tout lockStatus = do - let expected = settingWithLockStatus stat tout lockStatus + checkGet :: HasCallStack => TeamFeatureStatusValue -> Int32 -> TestM () + checkGet stat tout = do + let expected = setting stat tout forM_ [ Util.getTeamFeatureFlagInternal Public.TeamFeatureSelfDeletingMessages tid, Util.getTeamFeatureFlagWithGalley Public.TeamFeatureSelfDeletingMessages galley owner tid, @@ -431,66 +413,30 @@ testSelfDeletingMessages = do ] (!!! responseJsonEither === const (Right expected)) - checkSetLockStatus :: HasCallStack => Public.LockStatusValue -> TestM () - checkSetLockStatus status = - do - Util.setLockStatusInternal @'Public.TeamFeatureSelfDeletingMessages galley tid status - !!! statusCode === const 200 - - -- test that the default lock status comes from `galley.yaml`. - -- use this to change `galley.integration.yaml` locally and manually test that conf file - -- parsing works as expected. - checkGet TeamFeatureEnabled 0 defLockStatus - - -- now don't worry about what's in the config, write something to cassandra, and test with that. - checkSetLockStatus Public.Locked - checkGet TeamFeatureEnabled 0 Public.Locked - checkSet TeamFeatureDisabled 0 409 - checkGet TeamFeatureEnabled 0 Public.Locked - checkSet TeamFeatureEnabled 30 409 - checkGet TeamFeatureEnabled 0 Public.Locked - checkSetLockStatus Public.Unlocked - checkGet TeamFeatureEnabled 0 Public.Unlocked - checkSet TeamFeatureDisabled 0 200 - checkGet TeamFeatureDisabled 0 Public.Unlocked - checkSet TeamFeatureEnabled 30 200 - checkGet TeamFeatureEnabled 30 Public.Unlocked - checkSet TeamFeatureDisabled 30 200 - checkGet TeamFeatureDisabled 30 Public.Unlocked - checkSetLockStatus Public.Locked - checkGet TeamFeatureEnabled 0 Public.Locked - checkSet TeamFeatureEnabled 50 409 - checkSetLockStatus Public.Unlocked - checkGet TeamFeatureDisabled 30 Public.Unlocked + checkGet TeamFeatureEnabled 0 + checkSet TeamFeatureDisabled 0 + checkGet TeamFeatureDisabled 0 + checkSet TeamFeatureEnabled 30 + checkGet TeamFeatureEnabled 30 -- | Call 'GET /teams/:tid/features' and 'GET /feature-configs', and check if all -- features are there. testAllFeatures :: TestM () testAllFeatures = do - defLockStatus :: Public.LockStatusValue <- - view - ( tsGConf - . optSettings - . setFeatureFlags - . flagSelfDeletingMessages - . unDefaults - . to Public.tfwcapsLockStatus - ) - (_owner, tid, member : _) <- Util.createBindingTeamWithNMembers 1 Util.getAllTeamFeatures member tid !!! do statusCode === const 200 - responseJsonMaybe === const (Just (expected TeamFeatureEnabled defLockStatus {- determined by default in galley -})) + responseJsonMaybe === const (Just (expected TeamFeatureEnabled {- determined by default in galley -})) Util.getAllTeamFeaturesPersonal member !!! do statusCode === const 200 - responseJsonMaybe === const (Just (expected TeamFeatureEnabled defLockStatus {- determined by default in galley -})) + responseJsonMaybe === const (Just (expected TeamFeatureEnabled {- determined by default in galley -})) randomPersonalUser <- Util.randomUser Util.getAllTeamFeaturesPersonal randomPersonalUser !!! do statusCode === const 200 - responseJsonMaybe === const (Just (expected TeamFeatureEnabled defLockStatus {- determined by 'getAfcConferenceCallingDefNew' in brig -})) + responseJsonMaybe === const (Just (expected TeamFeatureEnabled {- determined by 'getAfcConferenceCallingDefNew' in brig -})) where - expected confCalling lockState = + expected confCalling = object [ toS TeamFeatureLegalHold .= Public.TeamFeatureStatusNoConfig TeamFeatureDisabled, toS TeamFeatureSSO .= Public.TeamFeatureStatusNoConfig TeamFeatureDisabled, @@ -509,10 +455,10 @@ testAllFeatures = do toS TeamFeatureConferenceCalling .= Public.TeamFeatureStatusNoConfig confCalling, toS TeamFeatureSelfDeletingMessages - .= Public.TeamFeatureStatusWithConfigAndLockStatus @Public.TeamFeatureSelfDeletingMessagesConfig - TeamFeatureEnabled - (Public.TeamFeatureSelfDeletingMessagesConfig 0) - lockState + .= ( Public.TeamFeatureStatusWithConfig @Public.TeamFeatureSelfDeletingMessagesConfig + TeamFeatureEnabled + (Public.TeamFeatureSelfDeletingMessagesConfig 0) + ) ] toS :: TeamFeatureName -> Text toS = TE.decodeUtf8 . toByteString' @@ -532,6 +478,8 @@ testFeatureConfigConsistency = do unless (allTeamFeaturesRes `Set.isSubsetOf` allFeaturesRes) $ liftIO $ expectationFailure (show allTeamFeaturesRes <> " is not a subset of " <> show allFeaturesRes) + + pure () where parseObjectKeys :: ResponseLBS -> TestM (Set.Set Text) parseObjectKeys res = do @@ -552,11 +500,11 @@ assertFlagForbidden res = do fmap label . responseJsonMaybe === const (Just "no-team-member") assertFlagNoConfig :: - forall (ps :: Public.IncludeLockStatus) (a :: Public.TeamFeatureName). + forall (a :: Public.TeamFeatureName). ( HasCallStack, Typeable a, - Public.FeatureHasNoConfig ps a, - FromJSON (Public.TeamFeatureStatus 'Public.WithoutLockStatus a), + Public.FeatureHasNoConfig a, + FromJSON (Public.TeamFeatureStatus a), Public.KnownTeamFeatureName a ) => TestM ResponseLBS -> @@ -566,7 +514,7 @@ assertFlagNoConfig res expected = do res !!! do statusCode === const 200 ( fmap Public.tfwoStatus - . responseJsonEither @(Public.TeamFeatureStatus ps a) + . responseJsonEither @(Public.TeamFeatureStatus a) ) === const (Right expected) diff --git a/services/galley/test/integration/API/Teams/LegalHold.hs b/services/galley/test/integration/API/Teams/LegalHold.hs index d44974b5f73..7ccefd4ea6a 100644 --- a/services/galley/test/integration/API/Teams/LegalHold.hs +++ b/services/galley/test/integration/API/Teams/LegalHold.hs @@ -566,14 +566,14 @@ testEnablePerTeam = withTeam $ \owner tid -> do addTeamMemberInternal tid member (rolePermissions RoleMember) Nothing ensureQueueEmpty do - status :: Public.TeamFeatureStatus 'Public.WithoutLockStatus 'Public.TeamFeatureLegalHold <- responseJsonUnsafe <$> (getEnabled tid (getEnabled tid (getEnabled tid (getEnabled tid do @@ -585,7 +585,7 @@ testEnablePerTeam = withTeam $ \owner tid -> do liftIO $ assertEqual "User legal hold status should be enabled" UserLegalHoldEnabled status do putEnabled' id tid Public.TeamFeatureDisabled !!! testResponse 403 (Just "legalhold-whitelisted-only") - status :: Public.TeamFeatureStatus 'Public.WithoutLockStatus 'Public.TeamFeatureLegalHold <- responseJsonUnsafe <$> (getEnabled tid (getEnabled tid (getEnabled tid (getEnabled tid (getEnabled tid (getEnabled tid do @@ -554,7 +554,7 @@ testEnablePerTeam = do liftIO $ assertEqual "User legal hold status should be enabled" UserLegalHoldEnabled status do putEnabled tid Public.TeamFeatureDisabled -- disable again - status :: Public.TeamFeatureStatus 'Public.WithoutLockStatus 'Public.TeamFeatureLegalHold <- responseJsonUnsafe <$> (getEnabled tid (getEnabled tid (getEnabled tid (getEnabled tid (getEnabled tid (getEnabled tid (MonadIO m, MonadHttp m) => m () putTeamSearchVisibilityAvailableInternal g tid statusValue = - void $ - putTeamFeatureFlagInternalWithGalleyAndMod - @'Public.WithoutLockStatus - @'Public.TeamFeatureSearchVisibility - g - expect2xx - tid - (Public.TeamFeatureStatusNoConfig statusValue) + putTeamFeatureFlagInternalWithGalleyAndMod + @'Public.TeamFeatureSearchVisibility + g + expect2xx + tid + (Public.TeamFeatureStatusNoConfig statusValue) putLegalHoldEnabledInternal' :: HasCallStack => @@ -67,7 +65,7 @@ putLegalHoldEnabledInternal' :: Public.TeamFeatureStatusValue -> TestM () putLegalHoldEnabledInternal' g tid statusValue = - void $ putTeamFeatureFlagInternal @'Public.WithoutLockStatus @'Public.TeamFeatureLegalHold g tid (Public.TeamFeatureStatusNoConfig statusValue) + putTeamFeatureFlagInternal @'Public.TeamFeatureLegalHold g tid (Public.TeamFeatureStatusNoConfig statusValue) -------------------------------------------------------------------------------- @@ -151,52 +149,35 @@ getAllFeatureConfigsWithGalley galley uid = do . zUser uid putTeamFeatureFlagInternal :: - forall (ps :: Public.IncludeLockStatus) (a :: Public.TeamFeatureName). + forall (a :: Public.TeamFeatureName). ( HasCallStack, Public.KnownTeamFeatureName a, - ToJSON (Public.TeamFeatureStatus ps a) + ToJSON (Public.TeamFeatureStatus a) ) => (Request -> Request) -> TeamId -> - Public.TeamFeatureStatus ps a -> - TestM ResponseLBS + (Public.TeamFeatureStatus a) -> + TestM () putTeamFeatureFlagInternal reqmod tid status = do g <- view tsGalley - putTeamFeatureFlagInternalWithGalleyAndMod @ps @a g reqmod tid status + putTeamFeatureFlagInternalWithGalleyAndMod @a g reqmod tid status putTeamFeatureFlagInternalWithGalleyAndMod :: - forall (ps :: Public.IncludeLockStatus) (a :: Public.TeamFeatureName) m. + forall (a :: Public.TeamFeatureName) m. ( MonadIO m, MonadHttp m, HasCallStack, Public.KnownTeamFeatureName a, - ToJSON (Public.TeamFeatureStatus ps a) + ToJSON (Public.TeamFeatureStatus a) ) => (Request -> Request) -> (Request -> Request) -> TeamId -> - Public.TeamFeatureStatus ps a -> - m ResponseLBS + (Public.TeamFeatureStatus a) -> + m () putTeamFeatureFlagInternalWithGalleyAndMod galley reqmod tid status = - put $ + void . put $ galley . paths ["i", "teams", toByteString' tid, "features", toByteString' (Public.knownTeamFeatureName @a)] . json status . reqmod - -setLockStatusInternal :: - forall (a :: Public.TeamFeatureName). - ( HasCallStack, - Public.KnownTeamFeatureName a, - ToJSON Public.LockStatusValue - ) => - (Request -> Request) -> - TeamId -> - Public.LockStatusValue -> - TestM ResponseLBS -setLockStatusInternal reqmod tid lockStatus = do - galley <- view tsGalley - put $ - galley - . paths ["i", "teams", toByteString' tid, "features", toByteString' (Public.knownTeamFeatureName @a), toByteString' lockStatus] - . reqmod diff --git a/services/spar/src/Spar/Intra/Galley.hs b/services/spar/src/Spar/Intra/Galley.hs index f4984b2b059..d8a0bc6291c 100644 --- a/services/spar/src/Spar/Intra/Galley.hs +++ b/services/spar/src/Spar/Intra/Galley.hs @@ -31,13 +31,7 @@ import Imports import Network.HTTP.Types.Method import Spar.Error import qualified System.Logger.Class as Log -import Wire.API.Team.Feature - ( IncludeLockStatus (..), - TeamFeatureName (..), - TeamFeatureStatus, - TeamFeatureStatusNoConfig (..), - TeamFeatureStatusValue (..), - ) +import Wire.API.Team.Feature (TeamFeatureName (..), TeamFeatureStatus, TeamFeatureStatusNoConfig (..), TeamFeatureStatusValue (..)) ---------------------------------------------------------------------- @@ -94,7 +88,7 @@ isEmailValidationEnabledTeam tid = do resp <- call $ method GET . paths ["i", "teams", toByteString' tid, "features", "validateSAMLemails"] pure ( (statusCode resp == 200) - && ( responseJsonMaybe @(TeamFeatureStatus 'WithoutLockStatus 'TeamFeatureValidateSAMLEmails) resp + && ( responseJsonMaybe @(TeamFeatureStatus 'TeamFeatureValidateSAMLEmails) resp == Just (TeamFeatureStatusNoConfig TeamFeatureEnabled) ) ) diff --git a/tools/stern/src/Stern/API.hs b/tools/stern/src/Stern/API.hs index ead623edff2..27e8e727098 100644 --- a/tools/stern/src/Stern/API.hs +++ b/tools/stern/src/Stern/API.hs @@ -594,25 +594,25 @@ getTeamAdminInfo = liftM (json . toAdminInfo) . Intra.getTeamInfo getTeamFeatureFlagH :: forall (a :: Public.TeamFeatureName). ( Public.KnownTeamFeatureName a, - FromJSON (Public.TeamFeatureStatus 'Public.WithoutLockStatus a), - ToJSON (Public.TeamFeatureStatus 'Public.WithoutLockStatus a), - Typeable (Public.TeamFeatureStatus 'Public.WithoutLockStatus a) + FromJSON (Public.TeamFeatureStatus a), + ToJSON (Public.TeamFeatureStatus a), + Typeable (Public.TeamFeatureStatus a) ) => TeamId -> Handler Response getTeamFeatureFlagH tid = - json <$> Intra.getTeamFeatureFlag @'Public.WithoutLockStatus @a tid + json <$> Intra.getTeamFeatureFlag @a tid setTeamFeatureFlagH :: forall (a :: Public.TeamFeatureName). ( Public.KnownTeamFeatureName a, - FromJSON (Public.TeamFeatureStatus 'Public.WithoutLockStatus a), - ToJSON (Public.TeamFeatureStatus 'Public.WithoutLockStatus a) + FromJSON (Public.TeamFeatureStatus a), + ToJSON (Public.TeamFeatureStatus a) ) => - TeamId ::: JsonRequest (Public.TeamFeatureStatus 'Public.WithoutLockStatus a) ::: JSON -> + TeamId ::: JsonRequest (Public.TeamFeatureStatus a) ::: JSON -> Handler Response setTeamFeatureFlagH (tid ::: req ::: _) = do - status :: Public.TeamFeatureStatus 'Public.WithoutLockStatus a <- parseBody req !>> mkError status400 "client-error" + status :: Public.TeamFeatureStatus a <- parseBody req !>> mkError status400 "client-error" empty <$ Intra.setTeamFeatureFlag @a tid status getTeamFeatureFlagNoConfigH :: @@ -755,9 +755,9 @@ noSuchUser = ifNothing (mkError status404 "no-user" "No such user") mkFeaturePutGetRoute :: forall (a :: Public.TeamFeatureName). ( Public.KnownTeamFeatureName a, - FromJSON (Public.TeamFeatureStatus 'Public.WithoutLockStatus a), - ToJSON (Public.TeamFeatureStatus 'Public.WithoutLockStatus a), - Typeable (Public.TeamFeatureStatus 'Public.WithoutLockStatus a) + FromJSON (Public.TeamFeatureStatus a), + ToJSON (Public.TeamFeatureStatus a), + Typeable (Public.TeamFeatureStatus a) ) => Routes Doc.ApiBuilder Handler () mkFeaturePutGetRoute = do @@ -774,7 +774,7 @@ mkFeaturePutGetRoute = do put ("/teams/:tid/features/" <> toByteString' featureName) (continue (setTeamFeatureFlagH @a)) $ capture "tid" - .&. jsonRequest @(Public.TeamFeatureStatus 'Public.WithoutLockStatus a) + .&. jsonRequest @(Public.TeamFeatureStatus a) .&. accept "application" "json" document "PUT" "setTeamFeatureFlag" $ do summary "Disable / enable feature flag for a given team" diff --git a/tools/stern/src/Stern/Intra.hs b/tools/stern/src/Stern/Intra.hs index 2139f16750e..e930aa76e03 100644 --- a/tools/stern/src/Stern/Intra.hs +++ b/tools/stern/src/Stern/Intra.hs @@ -452,13 +452,13 @@ setBlacklistStatus status emailOrPhone = do statusToMethod True = POST getTeamFeatureFlag :: - forall (ps :: Public.IncludeLockStatus) (a :: Public.TeamFeatureName). + forall (a :: Public.TeamFeatureName). ( Public.KnownTeamFeatureName a, - Typeable (Public.TeamFeatureStatus ps a), - FromJSON (Public.TeamFeatureStatus ps a) + Typeable (Public.TeamFeatureStatus a), + FromJSON (Public.TeamFeatureStatus a) ) => TeamId -> - Handler (Public.TeamFeatureStatus ps a) + Handler (Public.TeamFeatureStatus a) getTeamFeatureFlag tid = do info $ msg "Getting team feature status" gly <- view galley @@ -467,17 +467,17 @@ getTeamFeatureFlag tid = do . paths ["/i/teams", toByteString' tid, "features", toByteString' (Public.knownTeamFeatureName @a)] resp <- catchRpcErrors $ rpc' "galley" gly req case Bilge.statusCode resp of - 200 -> pure $ responseJsonUnsafe @(Public.TeamFeatureStatus ps a) resp + 200 -> pure $ responseJsonUnsafe @(Public.TeamFeatureStatus a) resp 404 -> throwE (mkError status404 "bad-upstream" "team doesnt exist") _ -> throwE (mkError status502 "bad-upstream" "bad response") setTeamFeatureFlag :: forall (a :: Public.TeamFeatureName). ( Public.KnownTeamFeatureName a, - ToJSON (Public.TeamFeatureStatus 'Public.WithoutLockStatus a) + ToJSON (Public.TeamFeatureStatus a) ) => TeamId -> - Public.TeamFeatureStatus 'Public.WithoutLockStatus a -> + Public.TeamFeatureStatus a -> Handler () setTeamFeatureFlag tid status = do info $ msg "Setting team feature status"