Safe Haskell | Safe-Inferred |
---|---|
Language | GHC2021 |
Synopsis
- data FeatureStatus
- featureName :: forall cfg. IsFeatureConfig cfg => Text
- featureNameBS :: forall cfg. IsFeatureConfig cfg => ByteString
- data LockStatus
- newtype DbFeature cfg = DbFeature {
- applyDbFeature :: LockableFeature cfg -> LockableFeature cfg
- dbFeatureLockStatus :: LockStatus -> DbFeature cfg
- dbFeatureStatus :: FeatureStatus -> DbFeature cfg
- dbFeatureConfig :: cfg -> DbFeature cfg
- dbFeatureModConfig :: (cfg -> cfg) -> DbFeature cfg
- data LockableFeature cfg = LockableFeature {
- status :: FeatureStatus
- lockStatus :: LockStatus
- config :: cfg
- defUnlockedFeature :: Default cfg => LockableFeature cfg
- defLockedFeature :: Default cfg => LockableFeature cfg
- data LockableFeaturePatch (cfg :: Type) = LockableFeaturePatch {
- status :: Maybe FeatureStatus
- lockStatus :: Maybe LockStatus
- config :: Maybe cfg
- data Feature (cfg :: Type) = Feature {
- status :: FeatureStatus
- config :: cfg
- forgetLock :: LockableFeature a -> Feature a
- withLockStatus :: LockStatus -> Feature a -> LockableFeature a
- type FeatureTTL = FeatureTTL' 'FeatureTTLUnitSeconds
- type FeatureTTLDays = FeatureTTL' 'FeatureTTLUnitDays
- data FeatureTTL' (u :: FeatureTTLUnit)
- data FeatureTTLUnit
- newtype EnforceAppLock = EnforceAppLock Bool
- genericComputeFeature :: forall cfg. LockableFeature cfg -> DbFeature cfg -> LockableFeature cfg
- class (Default cfg, ToSchema cfg, Default (LockableFeature cfg), KnownSymbol (FeatureSymbol cfg), NpProject cfg Features) => IsFeatureConfig cfg where
- type FeatureSymbol cfg :: Symbol
- featureSingleton :: FeatureSingleton cfg
- objectSchema :: ObjectSchema SwaggerDoc cfg
- data FeatureSingleton cfg where
- FeatureSingletonGuestLinksConfig :: FeatureSingleton GuestLinksConfig
- FeatureSingletonLegalholdConfig :: FeatureSingleton LegalholdConfig
- FeatureSingletonSSOConfig :: FeatureSingleton SSOConfig
- FeatureSingletonSearchVisibilityAvailableConfig :: FeatureSingleton SearchVisibilityAvailableConfig
- FeatureSingletonValidateSAMLEmailsConfig :: FeatureSingleton ValidateSAMLEmailsConfig
- FeatureSingletonDigitalSignaturesConfig :: FeatureSingleton DigitalSignaturesConfig
- FeatureSingletonConferenceCallingConfig :: FeatureSingleton ConferenceCallingConfig
- FeatureSingletonSndFactorPasswordChallengeConfig :: FeatureSingleton SndFactorPasswordChallengeConfig
- FeatureSingletonSearchVisibilityInboundConfig :: FeatureSingleton SearchVisibilityInboundConfig
- FeatureSingletonClassifiedDomainsConfig :: FeatureSingleton ClassifiedDomainsConfig
- FeatureSingletonAppLockConfig :: FeatureSingleton AppLockConfig
- FeatureSingletonSelfDeletingMessagesConfig :: FeatureSingleton SelfDeletingMessagesConfig
- FeatureSingletonFileSharingConfig :: FeatureSingleton FileSharingConfig
- FeatureSingletonMLSConfig :: FeatureSingleton MLSConfig
- FeatureSingletonExposeInvitationURLsToTeamAdminConfig :: FeatureSingleton ExposeInvitationURLsToTeamAdminConfig
- FeatureSingletonOutlookCalIntegrationConfig :: FeatureSingleton OutlookCalIntegrationConfig
- FeatureSingletonMlsE2EIdConfig :: FeatureSingleton MlsE2EIdConfig
- FeatureSingletonMlsMigrationConfig :: FeatureSingleton MlsMigrationConfig
- FeatureSingletonEnforceFileDownloadLocationConfig :: FeatureSingleton EnforceFileDownloadLocationConfig
- FeatureSingletonLimitedEventFanoutConfig :: FeatureSingleton LimitedEventFanoutConfig
- type family DeprecatedFeatureName cfg :: Symbol
- newtype LockStatusResponse = LockStatusResponse {}
- data One2OneCalls
- data LegalholdConfig = LegalholdConfig
- data SSOConfig = SSOConfig
- data SearchVisibilityAvailableConfig = SearchVisibilityAvailableConfig
- newtype SelfDeletingMessagesConfig = SelfDeletingMessagesConfig {}
- data ValidateSAMLEmailsConfig = ValidateSAMLEmailsConfig
- data DigitalSignaturesConfig = DigitalSignaturesConfig
- data ConferenceCallingConfig = ConferenceCallingConfig {}
- data GuestLinksConfig = GuestLinksConfig
- data ExposeInvitationURLsToTeamAdminConfig = ExposeInvitationURLsToTeamAdminConfig
- data SndFactorPasswordChallengeConfig = SndFactorPasswordChallengeConfig
- data SearchVisibilityInboundConfig = SearchVisibilityInboundConfig
- data ClassifiedDomainsConfig = ClassifiedDomainsConfig {}
- data AppLockConfig = AppLockConfig {}
- data FileSharingConfig = FileSharingConfig
- data MLSConfig = MLSConfig {}
- data OutlookCalIntegrationConfig = OutlookCalIntegrationConfig
- data MlsE2EIdConfig = MlsE2EIdConfig {}
- data MlsMigrationConfig = MlsMigrationConfig {}
- data EnforceFileDownloadLocationConfig = EnforceFileDownloadLocationConfig {}
- data LimitedEventFanoutConfig = LimitedEventFanoutConfig
- type Features = [LegalholdConfig, SSOConfig, SearchVisibilityAvailableConfig, SearchVisibilityInboundConfig, ValidateSAMLEmailsConfig, DigitalSignaturesConfig, AppLockConfig, FileSharingConfig, ClassifiedDomainsConfig, ConferenceCallingConfig, SelfDeletingMessagesConfig, GuestLinksConfig, SndFactorPasswordChallengeConfig, MLSConfig, ExposeInvitationURLsToTeamAdminConfig, OutlookCalIntegrationConfig, MlsE2EIdConfig, MlsMigrationConfig, EnforceFileDownloadLocationConfig, LimitedEventFanoutConfig]
- type AllFeatures f = NP f Features
- class NpProject x xs where
- npProject' :: Proxy x -> NP f xs -> f x
- npProject :: forall x f xs. NpProject x xs => NP f xs -> f x
- class NpUpdate x xs where
- npUpdate :: forall x f xs. NpUpdate x xs => f x -> NP f xs -> NP f xs
- type AllTeamFeatures = AllFeatures LockableFeature
Documentation
data FeatureStatus Source #
Instances
featureName :: forall cfg. IsFeatureConfig cfg => Text Source #
featureNameBS :: forall cfg. IsFeatureConfig cfg => ByteString Source #
data LockStatus Source #
Instances
newtype DbFeature cfg Source #
Feature data stored in the database, as a function of its default values.
DbFeature | |
|
dbFeatureLockStatus :: LockStatus -> DbFeature cfg Source #
dbFeatureStatus :: FeatureStatus -> DbFeature cfg Source #
dbFeatureConfig :: cfg -> DbFeature cfg Source #
dbFeatureModConfig :: (cfg -> cfg) -> DbFeature cfg Source #
data LockableFeature cfg Source #
LockableFeature | |
|
Instances
defUnlockedFeature :: Default cfg => LockableFeature cfg Source #
A feature that is enabled and unlocked.
defLockedFeature :: Default cfg => LockableFeature cfg Source #
A feature that is disabled and locked.
data LockableFeaturePatch (cfg :: Type) Source #
LockableFeaturePatch | |
|
Instances
data Feature (cfg :: Type) Source #
Feature | |
|
Instances
forgetLock :: LockableFeature a -> Feature a Source #
withLockStatus :: LockStatus -> Feature a -> LockableFeature a Source #
data FeatureTTL' (u :: FeatureTTLUnit) Source #
FeatureTTLSeconds Word | actually, unit depends on phantom type. |
FeatureTTLUnlimited |
Instances
newtype EnforceAppLock Source #
Instances
genericComputeFeature :: forall cfg. LockableFeature cfg -> DbFeature cfg -> LockableFeature cfg Source #
Convert a feature coming from the database to its public form. This can be
overridden on a feature basis by implementing the computeFeature
method of
the GetFeatureConfig
class.
class (Default cfg, ToSchema cfg, Default (LockableFeature cfg), KnownSymbol (FeatureSymbol cfg), NpProject cfg Features) => IsFeatureConfig cfg where Source #
Checklist for adding a new feature
Assume we want to add a new feature called dummy
. Every appearance of
dummy
or Dummy
in the following has to be replaced with the actual name
of the feature being added.
- Create a new type in this module for the feature configuration, called
DummyConfig
. If your feature doesn't have a config besides beingLockableFeature
andLockableFeature
, then the config should be a unit type, e.g.data DummyConfig = DummyConfig
. DeriveEq
,Show
,Generic
,Arbitrary
,RenderableSymbol
,FromJSON
,ToJSON
andToSchema
. Implement aToSchema
instance. Add a singleton. Add the config type toFeatures
. - Create a schema migration in galley, adding a column for each configurable value of the feature. The new columns must contain all the information needed to reconstruct a value of type 'LockableFeature DummyConfig'.
- In
MakeFeature
, implement theMakeFeature
type class: setFeatureRow
to the list of types of the rows added by the migration. If the lock status is configurable (it should be in most cases), it must be the first in the list. SetfeatureColumns
to the names of the columns, in the same order. ImplementrowToFeature
andfeatureToRow
. - Implement
GetFeatureConfig
andSetFeatureConfig
inFeatures
. Empty instances will work fine unless this feature requires custom logic. - Add a public route to
Feature
and the corresponding implementation inFeature
. - Add an internal route in
Galley
and the corresponding implementation inInternal
. - If the feature should be configurable via Stern add routes to Stern.API. Manually check that the swagger looks okay and works.
- In
Team
, add a new data instanceDummyDefaults
to represent the server-wide feature defaults read from the configuration file. In most cases, this should be a newtype over 'LockableFeature DummyConfig'. Then derive all the instances like for the other features in that module. Note thatParseFeatureDefaults
can be derived either viaOptionalField
orRequiredField
, depending on whether the feature configuration should be optional or required. - If necessary, add configuration for the feature in 'galley.integration.yaml', update the config map in 'chartsgalleytemplates/configmap.yaml' and set defaults in 'chartsgalleyvalues.yaml'. Make sure that the configuration for CI matches the local one, or adjust 'hackhelm_varswire-server/values.yaml' accordingly.
- Add the default values of this feature in
testAllFeatures
(FeatureFlags
). Add feature-specific integration tests. - Add a section to the documentation at an appropriate place (e.g. 'docssrcdeveloperreferenceconfig-options.md' (if applicable) or 'docssrcunderstand/team-feature-settings.md')
type FeatureSymbol cfg :: Symbol Source #
featureSingleton :: FeatureSingleton cfg Source #
:: ObjectSchema SwaggerDoc cfg | Should be "pure MyFeatureConfig" if the feature doesn't have config, which results in a trivial empty schema and the "config" field being omittedignored in the JSON encoder parser. |
Instances
data FeatureSingleton cfg where Source #
type family DeprecatedFeatureName cfg :: Symbol Source #
Instances
type DeprecatedFeatureName DigitalSignaturesConfig Source # | |
Defined in Wire.API.Team.Feature | |
type DeprecatedFeatureName SearchVisibilityAvailableConfig Source # | |
Defined in Wire.API.Team.Feature | |
type DeprecatedFeatureName ValidateSAMLEmailsConfig Source # | |
Defined in Wire.API.Team.Feature |
newtype LockStatusResponse Source #
Instances
data One2OneCalls Source #
Instances
Arbitrary One2OneCalls Source # | |
Defined in Wire.API.Team.Feature arbitrary :: Gen One2OneCalls Source # shrink :: One2OneCalls -> [One2OneCalls] Source # | |
Generic One2OneCalls Source # | |
Defined in Wire.API.Team.Feature type Rep One2OneCalls :: Type -> Type # from :: One2OneCalls -> Rep One2OneCalls x # to :: Rep One2OneCalls x -> One2OneCalls # | |
Show One2OneCalls Source # | |
Defined in Wire.API.Team.Feature showsPrec :: Int -> One2OneCalls -> ShowS # show :: One2OneCalls -> String # showList :: [One2OneCalls] -> ShowS # | |
Cql One2OneCalls Source # | |
Defined in Wire.API.Team.Feature ctype :: Tagged One2OneCalls ColumnType Source # toCql :: One2OneCalls -> Value Source # | |
Default One2OneCalls Source # | |
Defined in Wire.API.Team.Feature def :: One2OneCalls Source # | |
Eq One2OneCalls Source # | |
Defined in Wire.API.Team.Feature (==) :: One2OneCalls -> One2OneCalls -> Bool # (/=) :: One2OneCalls -> One2OneCalls -> Bool # | |
type Rep One2OneCalls Source # | |
Defined in Wire.API.Team.Feature |
data LegalholdConfig Source #
Instances
This feature does not have a PUT endpoint. See [Note: unsettable features].
Instances
data SearchVisibilityAvailableConfig Source #
Wether a team is allowed to change search visibility See the handle of PUT teams:tid/search-visibility
Instances
newtype SelfDeletingMessagesConfig Source #
Instances
data ValidateSAMLEmailsConfig Source #
This feature does not have a PUT endpoint. See [Note: unsettable features].
Instances
data DigitalSignaturesConfig Source #
This feature does not have a PUT endpoint. See [Note: unsettable features].
Instances
data ConferenceCallingConfig Source #
Instances
data GuestLinksConfig Source #
Instances
data ExposeInvitationURLsToTeamAdminConfig Source #
Instances
data SndFactorPasswordChallengeConfig Source #
Instances
data SearchVisibilityInboundConfig Source #
Instances
data ClassifiedDomainsConfig Source #
This feature is quite special, in that it does not have any database state. Its value cannot be updated dynamically, and is always set to the server default taken from the backend configuration.
Instances
data AppLockConfig Source #
Instances
data FileSharingConfig Source #
Instances
Instances
data OutlookCalIntegrationConfig Source #
This feature setting only applies to the Outlook Calendar extension for Wire. As it is an external service, it should only be configured through this feature flag and otherwise ignored by the backend.
Instances
data MlsE2EIdConfig Source #
Instances
data MlsMigrationConfig Source #
Instances
data EnforceFileDownloadLocationConfig Source #
Instances
data LimitedEventFanoutConfig Source #
This feature does not have a PUT endpoint. See [Note: unsettable features].
Instances
type Features = [LegalholdConfig, SSOConfig, SearchVisibilityAvailableConfig, SearchVisibilityInboundConfig, ValidateSAMLEmailsConfig, DigitalSignaturesConfig, AppLockConfig, FileSharingConfig, ClassifiedDomainsConfig, ConferenceCallingConfig, SelfDeletingMessagesConfig, GuestLinksConfig, SndFactorPasswordChallengeConfig, MLSConfig, ExposeInvitationURLsToTeamAdminConfig, OutlookCalIntegrationConfig, MlsE2EIdConfig, MlsMigrationConfig, EnforceFileDownloadLocationConfig, LimitedEventFanoutConfig] Source #
list of available features config types
type AllFeatures f = NP f Features Source #
list of available features as a record
class NpProject x xs where Source #
FUTUREWORK: NpProject
and NpUpdate
can be useful for more than
features. Maybe they should be moved somewhere else.
npProject' :: Proxy x -> NP f xs -> f x Source #
Instances
(TypeError ('ShowType x ':<>: 'Text " not found") :: Constraint) => NpProject (x :: k) ('[] :: [k]) Source # | |
Defined in Wire.API.Team.Feature npProject' :: Proxy x -> NP f '[] -> f x Source # | |
NpProject (x :: a) (x ': xs :: [a]) Source # | |
Defined in Wire.API.Team.Feature npProject' :: Proxy x -> NP f (x ': xs) -> f x Source # | |
NpProject x xs => NpProject (x :: a) (y ': xs :: [a]) Source # | |
Defined in Wire.API.Team.Feature npProject' :: Proxy x -> NP f (y ': xs) -> f x Source # |
npProject :: forall x f xs. NpProject x xs => NP f xs -> f x Source #
Get the first field of a given type out of an
.NP
f xs
npUpdate :: forall x f xs. NpUpdate x xs => f x -> NP f xs -> NP f xs Source #
Update the first field of a given type in an
.NP
f xs
type AllTeamFeatures = AllFeatures LockableFeature Source #
AllFeatures
specialised to the LockableFeature
functor