packages feed

ory-kratos-0.0.7.0: lib/OryKratos/Types/SelfService.hs

{-# OPTIONS_GHC -fno-warn-unused-binds -fno-warn-unused-imports #-}

module OryKratos.Types.SelfService
  ( SelfServiceBrowserLocationChangeRequiredError (..),
    SelfServiceError (..),
    SelfServiceFlowExpiredError (..),
    SelfServiceLoginFlow (..),
    SelfServiceLogoutUrl (..),
    SelfServiceRecoveryFlow (..),
    SelfServiceRecoveryFlowState (..),
    SelfServiceRecoveryLink (..),
    SelfServiceRegistrationFlow (..),
    SelfServiceSettingsFlow (..),
    SelfServiceSettingsFlowState (..),
    SelfServiceVerificationFlow (..),
    SelfServiceVerificationFlowState (..),
  )
where

import Data.Aeson (FromJSON (..), ToJSON (..), Value, genericParseJSON, genericToEncoding, genericToJSON)
import qualified Data.Aeson as Aeson
import Data.Aeson.Types (Options (..), defaultOptions)
import qualified Data.Char as Char
import Data.Data (Data)
import Data.Function ((&))
import Data.List (stripPrefix)
import qualified Data.Map as Map
import Data.Maybe (fromMaybe)
import Data.Set (Set)
import Data.Swagger (ToSchema, declareNamedSchema)
import qualified Data.Swagger as Swagger
import Data.Text (Text)
import qualified Data.Text as T
import Data.Time
import Data.UUID (UUID)
import GHC.Generics (Generic)
import OryKratos.Types.Helper (customOptions, removeFieldLabelPrefix)
import OryKratos.Types.Identity (Identity, IdentityCredentialsType)
import OryKratos.Types.Types (AuthenticatorAssuranceLevel)
import OryKratos.Types.Ui (UiContainer)

data SelfServiceBrowserLocationChangeRequiredError = SelfServiceBrowserLocationChangeRequiredError
  { -- | The status code
    code :: Maybe Integer,
    -- | Debug information  This field is often not exposed to protect against leaking sensitive information.
    debug :: Maybe Text,
    -- | Further error details
    details :: Maybe (Map.Map String Value),
    -- | The error ID  Useful when trying to identify various errors in application logic.
    id :: Maybe Text,
    -- | Error message  The error's message.
    message :: Text,
    -- | A human-readable reason for the error
    reason :: Maybe Text,
    -- | Since when the flow has expired
    redirect_browser_to :: Maybe Text,
    -- | The request ID  The request ID is often exposed internally in order to trace errors across service architectures. This is often a UUID.
    request :: Maybe Text,
    -- | The status description
    status :: Maybe Text
  }
  deriving stock (Show, Eq, Generic, Data)

instance FromJSON SelfServiceBrowserLocationChangeRequiredError

instance ToJSON SelfServiceBrowserLocationChangeRequiredError where
  toEncoding = genericToEncoding defaultOptions

data SelfServiceError = SelfServiceError
  { -- | CreatedAt is a helper struct field for gobuffalo.pop.
    created_at :: Maybe UTCTime,
    error :: Maybe Value,
    id :: Text,
    -- | UpdatedAt is a helper struct field for gobuffalo.pop.
    updated_at :: Maybe UTCTime
  }
  deriving stock (Show, Eq, Generic, Data)

instance FromJSON SelfServiceError

instance ToJSON SelfServiceError where
  toEncoding = genericToEncoding defaultOptions

-- | Is sent when a flow is expired
data SelfServiceFlowExpiredError = SelfServiceFlowExpiredError
  { -- | The status code
    code :: Maybe Integer,
    -- | Debug information  This field is often not exposed to protect against leaking sensitive information.
    debug :: Maybe Text,
    -- | Further error details
    details :: Maybe (Map.Map String Value),
    -- | The error ID  Useful when trying to identify various errors in application logic.
    id :: Maybe Text,
    -- | Error message  The error's message.
    message :: Text,
    -- | A human-readable reason for the error
    reason :: Maybe Text,
    -- | The request ID  The request ID is often exposed internally in order to trace errors across service architectures. This is often a UUID.
    request :: Maybe Text,
    -- | A Duration represents the elapsed time between two instants as an int64 nanosecond count. The representation limits the largest representable duration to approximately 290 years.
    since :: Maybe Integer,
    -- | The status description
    status :: Maybe Text,
    use_flow_id :: Maybe Text
  }
  deriving stock (Show, Eq, Generic, Data)

instance FromJSON SelfServiceFlowExpiredError

instance ToJSON SelfServiceFlowExpiredError where
  toEncoding = genericToEncoding defaultOptions

-- | This object represents a login flow. A login flow is initiated at the \"Initiate Login API / Browser Flow\" endpoint by a client.  Once a login flow is completed successfully, a session cookie or session token will be issued.
data SelfServiceLoginFlow = SelfServiceLoginFlow
  { active :: Maybe IdentityCredentialsType,
    -- | CreatedAt is a helper struct field for gobuffalo.pop.
    created_at :: Maybe UTCTime,
    -- | ExpiresAt is the time (UTC) when the flow expires. If the user still wishes to log in, a new flow has to be initiated.
    expires_at :: UTCTime,
    id :: Text,
    -- | IssuedAt is the time (UTC) when the flow started.
    issued_at :: UTCTime,
    -- | Refresh stores whether this login flow should enforce re-authentication.
    refresh :: Maybe Bool,
    -- | RequestURL is the initial URL that was requested from Ory Kratos. It can be used to forward information contained in the URL's path or query for example.
    request_url :: Text,
    requested_aal :: Maybe AuthenticatorAssuranceLevel,
    -- | ReturnTo contains the requested return_to URL.
    return_to :: Maybe Text,
    -- | The flow type can either be `api` or `browser`.
    _type :: Text,
    ui :: UiContainer,
    -- | UpdatedAt is a helper struct field for gobuffalo.pop.
    updated_at :: Maybe UTCTime
  }
  deriving stock (Show, Eq, Generic, Data)

instance FromJSON SelfServiceLoginFlow where
  parseJSON = genericParseJSON customOptions

instance ToJSON SelfServiceLoginFlow where
  toJSON = genericToJSON customOptions
  toEncoding = genericToEncoding customOptions

data SelfServiceLogoutUrl = SelfServiceLogoutUrl
  { -- | LogoutToken can be used to perform logout using AJAX.
    logout_token :: Text,
    -- | LogoutURL can be opened in a browser to sign the user out.  format: uri
    logout_url :: Text
  }
  deriving stock (Show, Eq, Generic, Data)

instance FromJSON SelfServiceLogoutUrl

instance ToJSON SelfServiceLogoutUrl where
  toEncoding = genericToEncoding defaultOptions

-- | This request is used when an identity wants to recover their account.  We recommend reading the [Account Recovery Documentation](../self-service/flows/password-reset-account-recovery)
data SelfServiceRecoveryFlow = SelfServiceRecoveryFlow
  { -- | Active, if set, contains the registration method that is being used. It is initially not set.
    active :: Maybe Text,
    -- | ExpiresAt is the time (UTC) when the request expires. If the user still wishes to update the setting, a new request has to be initiated.
    expires_at :: UTCTime,
    id :: Text,
    -- | IssuedAt is the time (UTC) when the request occurred.
    issued_at :: UTCTime,
    -- | RequestURL is the initial URL that was requested from Ory Kratos. It can be used to forward information contained in the URL's path or query for example.
    request_url :: Text,
    -- | ReturnTo contains the requested return_to URL.
    return_to :: Maybe Text,
    state :: SelfServiceRecoveryFlowState,
    -- | The flow type can either be `api` or `browser`.
    _type :: Text,
    ui :: UiContainer
  }
  deriving stock (Show, Eq, Generic, Data)

instance FromJSON SelfServiceRecoveryFlow where
  parseJSON = genericParseJSON customOptions

instance ToJSON SelfServiceRecoveryFlow where
  toJSON = genericToJSON customOptions
  toEncoding = genericToEncoding customOptions

-- | The state represents the state of the recovery flow.  choose_method: ask the user to choose a method (e.g. recover account via email) sent_email: the email has been sent to the user passed_challenge: the request was successful and the recovery challenge was passed.
data SelfServiceRecoveryFlowState
  = SelfServiceRecoveryFlowStateChooseMethod
  | SelfServiceRecoveryFlowStateSentEmail
  | SelfServiceRecoveryFlowStatePassedChallenge
  deriving stock (Show, Eq, Generic, Data)

instance FromJSON SelfServiceRecoveryFlowState where
  parseJSON (Aeson.String s) = case T.unpack s of
    "choose_method" -> return SelfServiceRecoveryFlowStateChooseMethod
    "sent_email" -> return SelfServiceRecoveryFlowStateSentEmail
    "passed_challenge" -> return SelfServiceRecoveryFlowStatePassedChallenge
    _ -> Prelude.error "Invalid SelfServiceRecoveryFlowState"
  parseJSON _ = Prelude.error "Invalid SelfServiceRecoveryFlowState"

instance ToJSON SelfServiceRecoveryFlowState where
  toJSON (SelfServiceRecoveryFlowStateChooseMethod) = Aeson.String "choose_method"
  toJSON (SelfServiceRecoveryFlowStateSentEmail) = Aeson.String "sent_email"
  toJSON (SelfServiceRecoveryFlowStatePassedChallenge) = Aeson.String "passed_challenge"

data SelfServiceRecoveryLink = SelfServiceRecoveryLink
  { -- | Recovery Link Expires At  The timestamp when the recovery link expires.
    expires_at :: Maybe UTCTime,
    -- | Recovery Link  This link can be used to recover the account.
    recovery_link :: Text
  }
  deriving stock (Show, Eq, Generic, Data)

instance FromJSON SelfServiceRecoveryLink

instance ToJSON SelfServiceRecoveryLink where
  toEncoding = genericToEncoding defaultOptions

data SelfServiceRegistrationFlow = SelfServiceRegistrationFlow
  { active :: Maybe IdentityCredentialsType,
    -- | ExpiresAt is the time (UTC) when the flow expires. If the user still wishes to log in, a new flow has to be initiated.
    expires_at :: UTCTime,
    id :: Text,
    -- | IssuedAt is the time (UTC) when the flow occurred.
    issued_at :: UTCTime,
    -- | RequestURL is the initial URL that was requested from Ory Kratos. It can be used to forward information contained in the URL's path or query for example.
    request_url :: Text,
    -- | ReturnTo contains the requested return_to URL.
    return_to :: Maybe Text,
    -- | The flow type can either be `api` or `browser`.
    _type :: Text,
    ui :: UiContainer
  }
  deriving stock (Show, Eq, Generic, Data)

instance FromJSON SelfServiceRegistrationFlow where
  parseJSON = genericParseJSON customOptions

instance ToJSON SelfServiceRegistrationFlow where
  toJSON = genericToJSON customOptions
  toEncoding = genericToEncoding customOptions

-- | This flow is used when an identity wants to update settings (e.g. profile data, passwords, ...) in a selfservice manner.  We recommend reading the [User Settings Documentation](../self-service/flows/user-settings)
data SelfServiceSettingsFlow = SelfServiceSettingsFlow
  { -- | Active, if set, contains the registration method that is being used. It is initially not set.
    active :: Maybe Text,
    -- | ExpiresAt is the time (UTC) when the flow expires. If the user still wishes to update the setting, a new flow has to be initiated.
    expires_at :: UTCTime,
    id :: Text,
    identity :: Identity,
    -- | IssuedAt is the time (UTC) when the flow occurred.
    issued_at :: UTCTime,
    -- | RequestURL is the initial URL that was requested from Ory Kratos. It can be used to forward information contained in the URL's path or query for example.
    request_url :: Text,
    -- | ReturnTo contains the requested return_to URL.
    return_to :: Maybe Text,
    state :: SelfServiceSettingsFlowState,
    -- | The flow type can either be `api` or `browser`.
    _type :: Text,
    ui :: UiContainer
  }
  deriving stock (Show, Eq, Generic, Data)

instance FromJSON SelfServiceSettingsFlow where
  parseJSON = genericParseJSON customOptions

instance ToJSON SelfServiceSettingsFlow where
  toJSON = genericToJSON customOptions
  toEncoding = genericToEncoding customOptions

-- | show_form: No user data has been collected, or it is invalid, and thus the form should be shown. success: Indicates that the settings flow has been updated successfully with the provided data. Done will stay true when repeatedly checking. If set to true, done will revert back to false only when a flow with invalid (e.g. \"please use a valid phone number\") data was sent.
data SelfServiceSettingsFlowState = SelfServiceSettingsFlowStateShowForm | SelfServiceSettingsFlowStateSuccess deriving stock (Show, Eq, Generic, Data)

instance FromJSON SelfServiceSettingsFlowState where
  parseJSON (Aeson.String s) = case T.unpack s of
    "show_form" -> return SelfServiceSettingsFlowStateShowForm
    "success" -> return SelfServiceSettingsFlowStateSuccess
    _ -> Prelude.error "Invalid SelfServiceSettingsFlowState"
  parseJSON _ = Prelude.error "Invalid SelfServiceSettingsFlowState"

instance ToJSON SelfServiceSettingsFlowState where
  toJSON (SelfServiceSettingsFlowStateShowForm) = Aeson.String "show_form"
  toJSON (SelfServiceSettingsFlowStateSuccess) = Aeson.String "success"

-- | Used to verify an out-of-band communication channel such as an email address or a phone number.  For more information head over to: https://www.ory.sh/docs/kratos/selfservice/flows/verify-email-account-activation
data SelfServiceVerificationFlow = SelfServiceVerificationFlow
  { -- | Active, if set, contains the registration method that is being used. It is initially not set.
    active :: Maybe Text,
    -- | ExpiresAt is the time (UTC) when the request expires. If the user still wishes to verify the address, a new request has to be initiated.
    expires_at :: Maybe UTCTime,
    id :: Text,
    -- | IssuedAt is the time (UTC) when the request occurred.
    issued_at :: Maybe UTCTime,
    -- | RequestURL is the initial URL that was requested from Ory Kratos. It can be used to forward information contained in the URL's path or query for example.
    request_url :: Maybe Text,
    -- | ReturnTo contains the requested return_to URL.
    return_to :: Maybe Text,
    state :: SelfServiceVerificationFlowState,
    -- | The flow type can either be `api` or `browser`.
    _type :: Text,
    ui :: UiContainer
  }
  deriving stock (Show, Eq, Generic, Data)

instance FromJSON SelfServiceVerificationFlow where
  parseJSON = genericParseJSON customOptions

instance ToJSON SelfServiceVerificationFlow where
  toJSON = genericToJSON customOptions
  toEncoding = genericToEncoding customOptions

-- | The state represents the state of the verification flow.  choose_method: ask the user to choose a method (e.g. recover account via email) sent_email: the email has been sent to the user passed_challenge: the request was successful and the recovery challenge was passed.
data SelfServiceVerificationFlowState
  = SelfServiceVerificationFlowStateChooseMethod
  | SelfServiceVerificationFlowStateSentEmail
  | SelfServiceVerificationFlowStatePassedChallenge
  deriving stock (Show, Eq, Generic, Data)

instance FromJSON SelfServiceVerificationFlowState where
  parseJSON (Aeson.String s) = case T.unpack s of
    "choose_method" -> return SelfServiceVerificationFlowStateChooseMethod
    "sent_email" -> return SelfServiceVerificationFlowStateSentEmail
    "passed_challenge" -> return SelfServiceVerificationFlowStatePassedChallenge
    _ -> Prelude.error "Invalid SelfServiceRecoveryFlowState"
  parseJSON _ = Prelude.error "Invalid SelfServiceRecoveryFlowState"

instance ToJSON SelfServiceVerificationFlowState where
  toJSON (SelfServiceVerificationFlowStateChooseMethod) = Aeson.String "choose_method"
  toJSON (SelfServiceVerificationFlowStateSentEmail) = Aeson.String "sent_email"
  toJSON (SelfServiceVerificationFlowStatePassedChallenge) = Aeson.String "passed_challenge"