module Hasura.Server.Types
  ( ExperimentalFeature (..),
    InstanceId (..),
    generateInstanceId,
    MetadataDbId (..),
    DbUid (..),
    mdDbIdToDbUid,
    MaintenanceMode (..),
    EventingMode (..),
    ReadOnlyMode (..),
    DbVersion (DbVersion),
    PGVersion (PGVersion),
    pgToDbVersion,
    RequestId (..),
    ServerConfigCtx (..),
    HasServerConfigCtx (..),
    getRequestId,
  )
where

import Data.Aeson
import Data.HashSet qualified as Set
import Database.PG.Query qualified as Q
import Hasura.GraphQL.Schema.NamingCase
import Hasura.GraphQL.Schema.Options qualified as Options
import Hasura.Prelude
import Hasura.RQL.Types.Common
import Hasura.Server.Utils
import Network.HTTP.Types qualified as HTTP

newtype RequestId = RequestId {RequestId -> Text
unRequestId :: Text}
  deriving (Int -> RequestId -> ShowS
[RequestId] -> ShowS
RequestId -> String
(Int -> RequestId -> ShowS)
-> (RequestId -> String)
-> ([RequestId] -> ShowS)
-> Show RequestId
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [RequestId] -> ShowS
$cshowList :: [RequestId] -> ShowS
show :: RequestId -> String
$cshow :: RequestId -> String
showsPrec :: Int -> RequestId -> ShowS
$cshowsPrec :: Int -> RequestId -> ShowS
Show, RequestId -> RequestId -> Bool
(RequestId -> RequestId -> Bool)
-> (RequestId -> RequestId -> Bool) -> Eq RequestId
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: RequestId -> RequestId -> Bool
$c/= :: RequestId -> RequestId -> Bool
== :: RequestId -> RequestId -> Bool
$c== :: RequestId -> RequestId -> Bool
Eq, [RequestId] -> Value
[RequestId] -> Encoding
RequestId -> Value
RequestId -> Encoding
(RequestId -> Value)
-> (RequestId -> Encoding)
-> ([RequestId] -> Value)
-> ([RequestId] -> Encoding)
-> ToJSON RequestId
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [RequestId] -> Encoding
$ctoEncodingList :: [RequestId] -> Encoding
toJSONList :: [RequestId] -> Value
$ctoJSONList :: [RequestId] -> Value
toEncoding :: RequestId -> Encoding
$ctoEncoding :: RequestId -> Encoding
toJSON :: RequestId -> Value
$ctoJSON :: RequestId -> Value
ToJSON, Value -> Parser [RequestId]
Value -> Parser RequestId
(Value -> Parser RequestId)
-> (Value -> Parser [RequestId]) -> FromJSON RequestId
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
parseJSONList :: Value -> Parser [RequestId]
$cparseJSONList :: Value -> Parser [RequestId]
parseJSON :: Value -> Parser RequestId
$cparseJSON :: Value -> Parser RequestId
FromJSON, Int -> RequestId -> Int
RequestId -> Int
(Int -> RequestId -> Int)
-> (RequestId -> Int) -> Hashable RequestId
forall a. (Int -> a -> Int) -> (a -> Int) -> Hashable a
hash :: RequestId -> Int
$chash :: RequestId -> Int
hashWithSalt :: Int -> RequestId -> Int
$chashWithSalt :: Int -> RequestId -> Int
Hashable)

getRequestId :: (MonadIO m) => [HTTP.Header] -> m (RequestId, [HTTP.Header])
getRequestId :: [Header] -> m (RequestId, [Header])
getRequestId [Header]
headers = do
  -- generate a request id for every request if the client has not sent it
  let mkHeader :: t -> (HeaderName, t)
mkHeader = (HeaderName
forall a. IsString a => a
requestIdHeader,)
  case HeaderName -> [Header] -> Maybe ByteString
getRequestHeader HeaderName
forall a. IsString a => a
requestIdHeader [Header]
headers of
    Maybe ByteString
Nothing -> do
      Text
reqId <- IO Text -> m Text
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO IO Text
generateFingerprint
      let r :: RequestId
r = Text -> RequestId
RequestId Text
reqId
      (RequestId, [Header]) -> m (RequestId, [Header])
forall (f :: * -> *) a. Applicative f => a -> f a
pure (RequestId
r, ByteString -> Header
forall t. t -> (HeaderName, t)
mkHeader (Text -> ByteString
txtToBs Text
reqId) Header -> [Header] -> [Header]
forall a. a -> [a] -> [a]
: [Header]
headers)
    Just ByteString
reqId -> (RequestId, [Header]) -> m (RequestId, [Header])
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Text -> RequestId
RequestId (Text -> RequestId) -> Text -> RequestId
forall a b. (a -> b) -> a -> b
$ ByteString -> Text
bsToTxt ByteString
reqId, [Header]
headers)

-- | A uuid of a source database.
newtype DbUid = DbUid {DbUid -> Text
getDbUid :: Text}
  deriving (Int -> DbUid -> ShowS
[DbUid] -> ShowS
DbUid -> String
(Int -> DbUid -> ShowS)
-> (DbUid -> String) -> ([DbUid] -> ShowS) -> Show DbUid
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [DbUid] -> ShowS
$cshowList :: [DbUid] -> ShowS
show :: DbUid -> String
$cshow :: DbUid -> String
showsPrec :: Int -> DbUid -> ShowS
$cshowsPrec :: Int -> DbUid -> ShowS
Show, DbUid -> DbUid -> Bool
(DbUid -> DbUid -> Bool) -> (DbUid -> DbUid -> Bool) -> Eq DbUid
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: DbUid -> DbUid -> Bool
$c/= :: DbUid -> DbUid -> Bool
== :: DbUid -> DbUid -> Bool
$c== :: DbUid -> DbUid -> Bool
Eq, [DbUid] -> Value
[DbUid] -> Encoding
DbUid -> Value
DbUid -> Encoding
(DbUid -> Value)
-> (DbUid -> Encoding)
-> ([DbUid] -> Value)
-> ([DbUid] -> Encoding)
-> ToJSON DbUid
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [DbUid] -> Encoding
$ctoEncodingList :: [DbUid] -> Encoding
toJSONList :: [DbUid] -> Value
$ctoJSONList :: [DbUid] -> Value
toEncoding :: DbUid -> Encoding
$ctoEncoding :: DbUid -> Encoding
toJSON :: DbUid -> Value
$ctoJSON :: DbUid -> Value
ToJSON, Value -> Parser [DbUid]
Value -> Parser DbUid
(Value -> Parser DbUid)
-> (Value -> Parser [DbUid]) -> FromJSON DbUid
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
parseJSONList :: Value -> Parser [DbUid]
$cparseJSONList :: Value -> Parser [DbUid]
parseJSON :: Value -> Parser DbUid
$cparseJSON :: Value -> Parser DbUid
FromJSON)

newtype DbVersion = DbVersion {DbVersion -> Text
unDbVersion :: Text}
  deriving (Int -> DbVersion -> ShowS
[DbVersion] -> ShowS
DbVersion -> String
(Int -> DbVersion -> ShowS)
-> (DbVersion -> String)
-> ([DbVersion] -> ShowS)
-> Show DbVersion
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [DbVersion] -> ShowS
$cshowList :: [DbVersion] -> ShowS
show :: DbVersion -> String
$cshow :: DbVersion -> String
showsPrec :: Int -> DbVersion -> ShowS
$cshowsPrec :: Int -> DbVersion -> ShowS
Show, DbVersion -> DbVersion -> Bool
(DbVersion -> DbVersion -> Bool)
-> (DbVersion -> DbVersion -> Bool) -> Eq DbVersion
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: DbVersion -> DbVersion -> Bool
$c/= :: DbVersion -> DbVersion -> Bool
== :: DbVersion -> DbVersion -> Bool
$c== :: DbVersion -> DbVersion -> Bool
Eq, [DbVersion] -> Value
[DbVersion] -> Encoding
DbVersion -> Value
DbVersion -> Encoding
(DbVersion -> Value)
-> (DbVersion -> Encoding)
-> ([DbVersion] -> Value)
-> ([DbVersion] -> Encoding)
-> ToJSON DbVersion
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [DbVersion] -> Encoding
$ctoEncodingList :: [DbVersion] -> Encoding
toJSONList :: [DbVersion] -> Value
$ctoJSONList :: [DbVersion] -> Value
toEncoding :: DbVersion -> Encoding
$ctoEncoding :: DbVersion -> Encoding
toJSON :: DbVersion -> Value
$ctoJSON :: DbVersion -> Value
ToJSON)

newtype PGVersion = PGVersion {PGVersion -> Int
unPGVersion :: Int}
  deriving (Int -> PGVersion -> ShowS
[PGVersion] -> ShowS
PGVersion -> String
(Int -> PGVersion -> ShowS)
-> (PGVersion -> String)
-> ([PGVersion] -> ShowS)
-> Show PGVersion
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [PGVersion] -> ShowS
$cshowList :: [PGVersion] -> ShowS
show :: PGVersion -> String
$cshow :: PGVersion -> String
showsPrec :: Int -> PGVersion -> ShowS
$cshowsPrec :: Int -> PGVersion -> ShowS
Show, PGVersion -> PGVersion -> Bool
(PGVersion -> PGVersion -> Bool)
-> (PGVersion -> PGVersion -> Bool) -> Eq PGVersion
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PGVersion -> PGVersion -> Bool
$c/= :: PGVersion -> PGVersion -> Bool
== :: PGVersion -> PGVersion -> Bool
$c== :: PGVersion -> PGVersion -> Bool
Eq, [PGVersion] -> Value
[PGVersion] -> Encoding
PGVersion -> Value
PGVersion -> Encoding
(PGVersion -> Value)
-> (PGVersion -> Encoding)
-> ([PGVersion] -> Value)
-> ([PGVersion] -> Encoding)
-> ToJSON PGVersion
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [PGVersion] -> Encoding
$ctoEncodingList :: [PGVersion] -> Encoding
toJSONList :: [PGVersion] -> Value
$ctoJSONList :: [PGVersion] -> Value
toEncoding :: PGVersion -> Encoding
$ctoEncoding :: PGVersion -> Encoding
toJSON :: PGVersion -> Value
$ctoJSON :: PGVersion -> Value
ToJSON)

pgToDbVersion :: PGVersion -> DbVersion
pgToDbVersion :: PGVersion -> DbVersion
pgToDbVersion = Text -> DbVersion
DbVersion (Text -> DbVersion)
-> (PGVersion -> Text) -> PGVersion -> DbVersion
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Text
forall a. Show a => a -> Text
tshow (Int -> Text) -> (PGVersion -> Int) -> PGVersion -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PGVersion -> Int
unPGVersion

-- | A uuid of the postgres metadata db.
newtype MetadataDbId = MetadataDbId {MetadataDbId -> Text
getMetadataDbId :: Text}
  deriving (Int -> MetadataDbId -> ShowS
[MetadataDbId] -> ShowS
MetadataDbId -> String
(Int -> MetadataDbId -> ShowS)
-> (MetadataDbId -> String)
-> ([MetadataDbId] -> ShowS)
-> Show MetadataDbId
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MetadataDbId] -> ShowS
$cshowList :: [MetadataDbId] -> ShowS
show :: MetadataDbId -> String
$cshow :: MetadataDbId -> String
showsPrec :: Int -> MetadataDbId -> ShowS
$cshowsPrec :: Int -> MetadataDbId -> ShowS
Show, MetadataDbId -> MetadataDbId -> Bool
(MetadataDbId -> MetadataDbId -> Bool)
-> (MetadataDbId -> MetadataDbId -> Bool) -> Eq MetadataDbId
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: MetadataDbId -> MetadataDbId -> Bool
$c/= :: MetadataDbId -> MetadataDbId -> Bool
== :: MetadataDbId -> MetadataDbId -> Bool
$c== :: MetadataDbId -> MetadataDbId -> Bool
Eq, [MetadataDbId] -> Value
[MetadataDbId] -> Encoding
MetadataDbId -> Value
MetadataDbId -> Encoding
(MetadataDbId -> Value)
-> (MetadataDbId -> Encoding)
-> ([MetadataDbId] -> Value)
-> ([MetadataDbId] -> Encoding)
-> ToJSON MetadataDbId
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [MetadataDbId] -> Encoding
$ctoEncodingList :: [MetadataDbId] -> Encoding
toJSONList :: [MetadataDbId] -> Value
$ctoJSONList :: [MetadataDbId] -> Value
toEncoding :: MetadataDbId -> Encoding
$ctoEncoding :: MetadataDbId -> Encoding
toJSON :: MetadataDbId -> Value
$ctoJSON :: MetadataDbId -> Value
ToJSON, Value -> Parser [MetadataDbId]
Value -> Parser MetadataDbId
(Value -> Parser MetadataDbId)
-> (Value -> Parser [MetadataDbId]) -> FromJSON MetadataDbId
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
parseJSONList :: Value -> Parser [MetadataDbId]
$cparseJSONList :: Value -> Parser [MetadataDbId]
parseJSON :: Value -> Parser MetadataDbId
$cparseJSON :: Value -> Parser MetadataDbId
FromJSON, Maybe ByteString -> Either Text MetadataDbId
(Maybe ByteString -> Either Text MetadataDbId)
-> FromCol MetadataDbId
forall a. (Maybe ByteString -> Either Text a) -> FromCol a
fromCol :: Maybe ByteString -> Either Text MetadataDbId
$cfromCol :: Maybe ByteString -> Either Text MetadataDbId
Q.FromCol, MetadataDbId -> PrepArg
(MetadataDbId -> PrepArg) -> ToPrepArg MetadataDbId
forall a. (a -> PrepArg) -> ToPrepArg a
toPrepVal :: MetadataDbId -> PrepArg
$ctoPrepVal :: MetadataDbId -> PrepArg
Q.ToPrepArg)

mdDbIdToDbUid :: MetadataDbId -> DbUid
mdDbIdToDbUid :: MetadataDbId -> DbUid
mdDbIdToDbUid = Text -> DbUid
DbUid (Text -> DbUid) -> (MetadataDbId -> Text) -> MetadataDbId -> DbUid
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MetadataDbId -> Text
getMetadataDbId

newtype InstanceId = InstanceId {InstanceId -> Text
getInstanceId :: Text}
  deriving (Int -> InstanceId -> ShowS
[InstanceId] -> ShowS
InstanceId -> String
(Int -> InstanceId -> ShowS)
-> (InstanceId -> String)
-> ([InstanceId] -> ShowS)
-> Show InstanceId
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [InstanceId] -> ShowS
$cshowList :: [InstanceId] -> ShowS
show :: InstanceId -> String
$cshow :: InstanceId -> String
showsPrec :: Int -> InstanceId -> ShowS
$cshowsPrec :: Int -> InstanceId -> ShowS
Show, InstanceId -> InstanceId -> Bool
(InstanceId -> InstanceId -> Bool)
-> (InstanceId -> InstanceId -> Bool) -> Eq InstanceId
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: InstanceId -> InstanceId -> Bool
$c/= :: InstanceId -> InstanceId -> Bool
== :: InstanceId -> InstanceId -> Bool
$c== :: InstanceId -> InstanceId -> Bool
Eq, [InstanceId] -> Value
[InstanceId] -> Encoding
InstanceId -> Value
InstanceId -> Encoding
(InstanceId -> Value)
-> (InstanceId -> Encoding)
-> ([InstanceId] -> Value)
-> ([InstanceId] -> Encoding)
-> ToJSON InstanceId
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [InstanceId] -> Encoding
$ctoEncodingList :: [InstanceId] -> Encoding
toJSONList :: [InstanceId] -> Value
$ctoJSONList :: [InstanceId] -> Value
toEncoding :: InstanceId -> Encoding
$ctoEncoding :: InstanceId -> Encoding
toJSON :: InstanceId -> Value
$ctoJSON :: InstanceId -> Value
ToJSON, Value -> Parser [InstanceId]
Value -> Parser InstanceId
(Value -> Parser InstanceId)
-> (Value -> Parser [InstanceId]) -> FromJSON InstanceId
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
parseJSONList :: Value -> Parser [InstanceId]
$cparseJSONList :: Value -> Parser [InstanceId]
parseJSON :: Value -> Parser InstanceId
$cparseJSON :: Value -> Parser InstanceId
FromJSON, Maybe ByteString -> Either Text InstanceId
(Maybe ByteString -> Either Text InstanceId) -> FromCol InstanceId
forall a. (Maybe ByteString -> Either Text a) -> FromCol a
fromCol :: Maybe ByteString -> Either Text InstanceId
$cfromCol :: Maybe ByteString -> Either Text InstanceId
Q.FromCol, InstanceId -> PrepArg
(InstanceId -> PrepArg) -> ToPrepArg InstanceId
forall a. (a -> PrepArg) -> ToPrepArg a
toPrepVal :: InstanceId -> PrepArg
$ctoPrepVal :: InstanceId -> PrepArg
Q.ToPrepArg)

-- | Generate an 'InstanceId' from a 'UUID'
generateInstanceId :: IO InstanceId
generateInstanceId :: IO InstanceId
generateInstanceId = Text -> InstanceId
InstanceId (Text -> InstanceId) -> IO Text -> IO InstanceId
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IO Text
generateFingerprint

data ExperimentalFeature
  = EFInheritedRoles
  | EFOptimizePermissionFilters
  | EFNamingConventions
  | EFStreamingSubscriptions
  | EFApolloFederation
  deriving (Int -> ExperimentalFeature -> ShowS
[ExperimentalFeature] -> ShowS
ExperimentalFeature -> String
(Int -> ExperimentalFeature -> ShowS)
-> (ExperimentalFeature -> String)
-> ([ExperimentalFeature] -> ShowS)
-> Show ExperimentalFeature
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ExperimentalFeature] -> ShowS
$cshowList :: [ExperimentalFeature] -> ShowS
show :: ExperimentalFeature -> String
$cshow :: ExperimentalFeature -> String
showsPrec :: Int -> ExperimentalFeature -> ShowS
$cshowsPrec :: Int -> ExperimentalFeature -> ShowS
Show, ExperimentalFeature -> ExperimentalFeature -> Bool
(ExperimentalFeature -> ExperimentalFeature -> Bool)
-> (ExperimentalFeature -> ExperimentalFeature -> Bool)
-> Eq ExperimentalFeature
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ExperimentalFeature -> ExperimentalFeature -> Bool
$c/= :: ExperimentalFeature -> ExperimentalFeature -> Bool
== :: ExperimentalFeature -> ExperimentalFeature -> Bool
$c== :: ExperimentalFeature -> ExperimentalFeature -> Bool
Eq, (forall x. ExperimentalFeature -> Rep ExperimentalFeature x)
-> (forall x. Rep ExperimentalFeature x -> ExperimentalFeature)
-> Generic ExperimentalFeature
forall x. Rep ExperimentalFeature x -> ExperimentalFeature
forall x. ExperimentalFeature -> Rep ExperimentalFeature x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep ExperimentalFeature x -> ExperimentalFeature
$cfrom :: forall x. ExperimentalFeature -> Rep ExperimentalFeature x
Generic)

instance Hashable ExperimentalFeature

instance FromJSON ExperimentalFeature where
  parseJSON :: Value -> Parser ExperimentalFeature
parseJSON = String
-> (Text -> Parser ExperimentalFeature)
-> Value
-> Parser ExperimentalFeature
forall a. String -> (Text -> Parser a) -> Value -> Parser a
withText String
"ExperimentalFeature" ((Text -> Parser ExperimentalFeature)
 -> Value -> Parser ExperimentalFeature)
-> (Text -> Parser ExperimentalFeature)
-> Value
-> Parser ExperimentalFeature
forall a b. (a -> b) -> a -> b
$ \case
    Text
"inherited_roles" -> ExperimentalFeature -> Parser ExperimentalFeature
forall (f :: * -> *) a. Applicative f => a -> f a
pure ExperimentalFeature
EFInheritedRoles
    Text
"optimize_permission_filters" -> ExperimentalFeature -> Parser ExperimentalFeature
forall (f :: * -> *) a. Applicative f => a -> f a
pure ExperimentalFeature
EFOptimizePermissionFilters
    Text
"naming_convention" -> ExperimentalFeature -> Parser ExperimentalFeature
forall (f :: * -> *) a. Applicative f => a -> f a
pure ExperimentalFeature
EFNamingConventions
    Text
"streaming_subscriptions" -> ExperimentalFeature -> Parser ExperimentalFeature
forall (f :: * -> *) a. Applicative f => a -> f a
pure ExperimentalFeature
EFStreamingSubscriptions
    Text
"apollo_federation" -> ExperimentalFeature -> Parser ExperimentalFeature
forall (f :: * -> *) a. Applicative f => a -> f a
pure ExperimentalFeature
EFApolloFederation
    Text
_ -> String -> Parser ExperimentalFeature
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"ExperimentalFeature can only be one of these value: inherited_roles, optimize_permission_filters, naming_convention, streaming_subscriptions or apollo_federation"

instance ToJSON ExperimentalFeature where
  toJSON :: ExperimentalFeature -> Value
toJSON = \case
    ExperimentalFeature
EFInheritedRoles -> Value
"inherited_roles"
    ExperimentalFeature
EFOptimizePermissionFilters -> Value
"optimize_permission_filters"
    ExperimentalFeature
EFNamingConventions -> Value
"naming_convention"
    ExperimentalFeature
EFStreamingSubscriptions -> Value
"streaming_subscriptions"
    ExperimentalFeature
EFApolloFederation -> Value
"apollo_federation"

data MaintenanceMode a = MaintenanceModeEnabled a | MaintenanceModeDisabled
  deriving (Int -> MaintenanceMode a -> ShowS
[MaintenanceMode a] -> ShowS
MaintenanceMode a -> String
(Int -> MaintenanceMode a -> ShowS)
-> (MaintenanceMode a -> String)
-> ([MaintenanceMode a] -> ShowS)
-> Show (MaintenanceMode a)
forall a. Show a => Int -> MaintenanceMode a -> ShowS
forall a. Show a => [MaintenanceMode a] -> ShowS
forall a. Show a => MaintenanceMode a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MaintenanceMode a] -> ShowS
$cshowList :: forall a. Show a => [MaintenanceMode a] -> ShowS
show :: MaintenanceMode a -> String
$cshow :: forall a. Show a => MaintenanceMode a -> String
showsPrec :: Int -> MaintenanceMode a -> ShowS
$cshowsPrec :: forall a. Show a => Int -> MaintenanceMode a -> ShowS
Show, MaintenanceMode a -> MaintenanceMode a -> Bool
(MaintenanceMode a -> MaintenanceMode a -> Bool)
-> (MaintenanceMode a -> MaintenanceMode a -> Bool)
-> Eq (MaintenanceMode a)
forall a. Eq a => MaintenanceMode a -> MaintenanceMode a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: MaintenanceMode a -> MaintenanceMode a -> Bool
$c/= :: forall a. Eq a => MaintenanceMode a -> MaintenanceMode a -> Bool
== :: MaintenanceMode a -> MaintenanceMode a -> Bool
$c== :: forall a. Eq a => MaintenanceMode a -> MaintenanceMode a -> Bool
Eq)

instance FromJSON (MaintenanceMode ()) where
  parseJSON :: Value -> Parser (MaintenanceMode ())
parseJSON =
    String
-> (Bool -> Parser (MaintenanceMode ()))
-> Value
-> Parser (MaintenanceMode ())
forall a. String -> (Bool -> Parser a) -> Value -> Parser a
withBool String
"MaintenanceMode" ((Bool -> Parser (MaintenanceMode ()))
 -> Value -> Parser (MaintenanceMode ()))
-> (Bool -> Parser (MaintenanceMode ()))
-> Value
-> Parser (MaintenanceMode ())
forall a b. (a -> b) -> a -> b
$
      MaintenanceMode () -> Parser (MaintenanceMode ())
forall (f :: * -> *) a. Applicative f => a -> f a
pure (MaintenanceMode () -> Parser (MaintenanceMode ()))
-> (Bool -> MaintenanceMode ())
-> Bool
-> Parser (MaintenanceMode ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MaintenanceMode ()
-> MaintenanceMode () -> Bool -> MaintenanceMode ()
forall a. a -> a -> Bool -> a
bool MaintenanceMode ()
forall a. MaintenanceMode a
MaintenanceModeDisabled (() -> MaintenanceMode ()
forall a. a -> MaintenanceMode a
MaintenanceModeEnabled ())

instance ToJSON (MaintenanceMode ()) where
  toJSON :: MaintenanceMode () -> Value
toJSON = Bool -> Value
Bool (Bool -> Value)
-> (MaintenanceMode () -> Bool) -> MaintenanceMode () -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (MaintenanceMode () -> MaintenanceMode () -> Bool
forall a. Eq a => a -> a -> Bool
== () -> MaintenanceMode ()
forall a. a -> MaintenanceMode a
MaintenanceModeEnabled ())

-- | See Note [ReadOnly Mode]
data ReadOnlyMode = ReadOnlyModeEnabled | ReadOnlyModeDisabled
  deriving (Int -> ReadOnlyMode -> ShowS
[ReadOnlyMode] -> ShowS
ReadOnlyMode -> String
(Int -> ReadOnlyMode -> ShowS)
-> (ReadOnlyMode -> String)
-> ([ReadOnlyMode] -> ShowS)
-> Show ReadOnlyMode
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ReadOnlyMode] -> ShowS
$cshowList :: [ReadOnlyMode] -> ShowS
show :: ReadOnlyMode -> String
$cshow :: ReadOnlyMode -> String
showsPrec :: Int -> ReadOnlyMode -> ShowS
$cshowsPrec :: Int -> ReadOnlyMode -> ShowS
Show, ReadOnlyMode -> ReadOnlyMode -> Bool
(ReadOnlyMode -> ReadOnlyMode -> Bool)
-> (ReadOnlyMode -> ReadOnlyMode -> Bool) -> Eq ReadOnlyMode
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ReadOnlyMode -> ReadOnlyMode -> Bool
$c/= :: ReadOnlyMode -> ReadOnlyMode -> Bool
== :: ReadOnlyMode -> ReadOnlyMode -> Bool
$c== :: ReadOnlyMode -> ReadOnlyMode -> Bool
Eq)

-- | EventingMode decides whether the eventing subsystem should be enabled or disabled.
-- `EventDisabled` mode disables Event Triggers, Async Actions, Scheduled Events and source catalaog migrations.
-- This is an internal feature and will not be exposed to users.
data EventingMode = EventingEnabled | EventingDisabled
  deriving (Int -> EventingMode -> ShowS
[EventingMode] -> ShowS
EventingMode -> String
(Int -> EventingMode -> ShowS)
-> (EventingMode -> String)
-> ([EventingMode] -> ShowS)
-> Show EventingMode
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [EventingMode] -> ShowS
$cshowList :: [EventingMode] -> ShowS
show :: EventingMode -> String
$cshow :: EventingMode -> String
showsPrec :: Int -> EventingMode -> ShowS
$cshowsPrec :: Int -> EventingMode -> ShowS
Show, EventingMode -> EventingMode -> Bool
(EventingMode -> EventingMode -> Bool)
-> (EventingMode -> EventingMode -> Bool) -> Eq EventingMode
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: EventingMode -> EventingMode -> Bool
$c/= :: EventingMode -> EventingMode -> Bool
== :: EventingMode -> EventingMode -> Bool
$c== :: EventingMode -> EventingMode -> Bool
Eq)

data ServerConfigCtx = ServerConfigCtx
  { ServerConfigCtx -> InferFunctionPermissions
_sccFunctionPermsCtx :: Options.InferFunctionPermissions,
    ServerConfigCtx -> RemoteSchemaPermissions
_sccRemoteSchemaPermsCtx :: Options.RemoteSchemaPermissions,
    ServerConfigCtx -> SQLGenCtx
_sccSQLGenCtx :: SQLGenCtx,
    ServerConfigCtx -> MaintenanceMode ()
_sccMaintenanceMode :: MaintenanceMode (),
    ServerConfigCtx -> HashSet ExperimentalFeature
_sccExperimentalFeatures :: Set.HashSet ExperimentalFeature,
    ServerConfigCtx -> EventingMode
_sccEventingMode :: EventingMode,
    ServerConfigCtx -> ReadOnlyMode
_sccReadOnlyMode :: ReadOnlyMode,
    -- | stores global default naming convention
    ServerConfigCtx -> Maybe NamingCase
_sccDefaultNamingConvention :: Maybe NamingCase
  }
  deriving (Int -> ServerConfigCtx -> ShowS
[ServerConfigCtx] -> ShowS
ServerConfigCtx -> String
(Int -> ServerConfigCtx -> ShowS)
-> (ServerConfigCtx -> String)
-> ([ServerConfigCtx] -> ShowS)
-> Show ServerConfigCtx
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ServerConfigCtx] -> ShowS
$cshowList :: [ServerConfigCtx] -> ShowS
show :: ServerConfigCtx -> String
$cshow :: ServerConfigCtx -> String
showsPrec :: Int -> ServerConfigCtx -> ShowS
$cshowsPrec :: Int -> ServerConfigCtx -> ShowS
Show, ServerConfigCtx -> ServerConfigCtx -> Bool
(ServerConfigCtx -> ServerConfigCtx -> Bool)
-> (ServerConfigCtx -> ServerConfigCtx -> Bool)
-> Eq ServerConfigCtx
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ServerConfigCtx -> ServerConfigCtx -> Bool
$c/= :: ServerConfigCtx -> ServerConfigCtx -> Bool
== :: ServerConfigCtx -> ServerConfigCtx -> Bool
$c== :: ServerConfigCtx -> ServerConfigCtx -> Bool
Eq)

class (Monad m) => HasServerConfigCtx m where
  askServerConfigCtx :: m ServerConfigCtx

instance HasServerConfigCtx m => HasServerConfigCtx (ReaderT r m) where
  askServerConfigCtx :: ReaderT r m ServerConfigCtx
askServerConfigCtx = m ServerConfigCtx -> ReaderT r m ServerConfigCtx
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m ServerConfigCtx
forall (m :: * -> *). HasServerConfigCtx m => m ServerConfigCtx
askServerConfigCtx

instance HasServerConfigCtx m => HasServerConfigCtx (ExceptT e m) where
  askServerConfigCtx :: ExceptT e m ServerConfigCtx
askServerConfigCtx = m ServerConfigCtx -> ExceptT e m ServerConfigCtx
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m ServerConfigCtx
forall (m :: * -> *). HasServerConfigCtx m => m ServerConfigCtx
askServerConfigCtx

instance HasServerConfigCtx m => HasServerConfigCtx (StateT s m) where
  askServerConfigCtx :: StateT s m ServerConfigCtx
askServerConfigCtx = m ServerConfigCtx -> StateT s m ServerConfigCtx
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m ServerConfigCtx
forall (m :: * -> *). HasServerConfigCtx m => m ServerConfigCtx
askServerConfigCtx