ihp-1.4.0: IHP/DataSync/Types.hs
module IHP.DataSync.Types where
import IHP.Prelude
import Data.Aeson
import IHP.DataSync.DynamicQuery
import qualified Database.PostgreSQL.Simple as PG
import Control.Concurrent.MVar as MVar
data DataSyncMessage
= DataSyncQuery { query :: !DynamicSQLQuery, requestId :: !Int, transactionId :: !(Maybe UUID) }
| CreateDataSubscription { query :: !DynamicSQLQuery, requestId :: !Int }
| CreateCountSubscription { query :: !DynamicSQLQuery, requestId :: !Int }
| DeleteDataSubscription { subscriptionId :: !UUID, requestId :: !Int }
| CreateRecordMessage { table :: !Text, record :: !(HashMap Text Value), requestId :: !Int, transactionId :: !(Maybe UUID) }
| CreateRecordsMessage { table :: !Text, records :: ![HashMap Text Value], requestId :: !Int, transactionId :: !(Maybe UUID) }
| UpdateRecordMessage { table :: !Text, id :: !UUID, patch :: !(HashMap Text Value), requestId :: !Int, transactionId :: !(Maybe UUID) }
| UpdateRecordsMessage { table :: !Text, ids :: ![UUID], patch :: !(HashMap Text Value), requestId :: !Int, transactionId :: !(Maybe UUID) }
| DeleteRecordMessage { table :: !Text, id :: !UUID, requestId :: !Int, transactionId :: !(Maybe UUID) }
| DeleteRecordsMessage { table :: !Text, ids :: ![UUID], requestId :: !Int, transactionId :: !(Maybe UUID) }
| StartTransaction { requestId :: !Int }
| RollbackTransaction { requestId :: !Int, id :: !UUID }
| CommitTransaction { requestId :: !Int, id :: !UUID }
| LoginWithEmailAndPassword { requestId :: !Int, email :: !Text, password :: !Text }
| LoginWithJWT { requestId :: !Int, jwt :: !Text }
| CreateUser { requestId :: !Int, email :: !Text, password :: !Text }
| ConfirmUser { requestId :: !Int, userId :: !UUID, token :: !Text }
deriving (Eq, Show)
data DataSyncResponse
= DataSyncResult { result :: ![[Field]], requestId :: !Int }
| DataSyncError { requestId :: !Int, errorMessage :: !Text }
| FailedToDecodeMessageError { errorMessage :: !Text }
| DidCreateDataSubscription { requestId :: !Int, subscriptionId :: !UUID, result :: ![[Field]] }
| DidCreateCountSubscription { requestId :: !Int, subscriptionId :: !UUID, count :: !Int }
| DidDeleteDataSubscription { requestId :: !Int, subscriptionId :: !UUID }
| DidInsert { subscriptionId :: !UUID, record :: ![Field] }
| DidUpdate { subscriptionId :: !UUID, id :: UUID, changeSet :: !Value }
| DidDelete { subscriptionId :: !UUID, id :: !UUID }
| DidChangeCount { subscriptionId :: !UUID, count :: !Int }
| DidCreateRecord { requestId :: !Int, record :: ![Field] } -- ^ Response to 'CreateRecordMessage'
| DidCreateRecords { requestId :: !Int, records :: ![[Field]] } -- ^ Response to 'CreateRecordsMessage'
| DidUpdateRecord { requestId :: !Int, record :: ![Field] } -- ^ Response to 'UpdateRecordMessage'
| DidUpdateRecords { requestId :: !Int, records :: ![[Field]] } -- ^ Response to 'UpdateRecordsMessage'
| DidDeleteRecord { requestId :: !Int }
| DidDeleteRecords { requestId :: !Int }
| DidStartTransaction { requestId :: !Int, transactionId :: !UUID }
| DidRollbackTransaction { requestId :: !Int, transactionId :: !UUID }
| DidCommitTransaction { requestId :: !Int, transactionId :: !UUID }
| LoginSuccessful { requestId :: !Int, userId :: !UUID, jwt :: !Text }
| UserLocked { requestId :: !Int }
| UserUnconfirmed { requestId :: !Int }
| InvalidCredentials { requestId :: !Int }
| DidCreateUser { requestId :: !Int, userId :: !UUID, emailConfirmationRequired :: !Bool, jwt :: !Text }
| CreateUserFailed { requestId :: !Int, validationFailures :: [(Text, Text)] }
| DidConfirmUser { requestId :: !Int, jwt :: !Text }
| DidConfirmUserAlready { requestId :: !Int }
| ConfirmUserFailed { requestId :: !Int }
data GraphQLResult = GraphQLResult { graphQLResult :: !UndecodedJSON, requestId :: !Int }
data DataSyncTransaction
= DataSyncTransaction
{ id :: !UUID
, connection :: !PG.Connection
, close :: MVar ()
}
data DataSyncController
= DataSyncController
| DataSyncReady
{ subscriptions :: !(HashMap UUID (MVar.MVar ()))
, transactions :: !(HashMap UUID DataSyncTransaction)
, asyncs :: ![Async ()]
}