{-# LANGUAGE DataKinds #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE Rank2Types #-}
{-# LANGUAGE RecordWildCards #-}
module Database.EventStore.Internal.Operation.DeleteStream
( DeleteResult(..)
, deleteStream
) where
import Data.Maybe
import Data.ProtocolBuffers
import Database.EventStore.Internal.Command
import Database.EventStore.Internal.Communication (Transmit(..))
import Database.EventStore.Internal.Control (publishWith)
import Database.EventStore.Internal.Exec
import Database.EventStore.Internal.Operation
import Database.EventStore.Internal.Operation.DeleteStream.Message
import Database.EventStore.Internal.Prelude
import Database.EventStore.Internal.Settings
import Database.EventStore.Internal.Stream
import Database.EventStore.Internal.Types
newtype DeleteResult = DeleteResult Position deriving (Eq, Show)
deleteStream
:: Settings
-> Exec
-> Text
-> ExpectedVersion
-> Maybe Bool
-> Maybe Credentials
-> IO (Async DeleteResult)
deleteStream setts exec stream version hard creds
= do m <- mailboxNew
async $
do let req = newRequest stream (expVersionInt64 version) (s_requireMaster setts) hard
pkg <- createPkg deleteStreamCmd creds req
keepLooping $ do
publishWith exec (Transmit m OneTime pkg)
outcome <- mailboxReadDecoded m
case outcome of
Left e
-> throw e
Right resp
-> let r = getField $ _result resp
com_pos = getField $ _commitPosition resp
prep_pos = getField $ _preparePosition resp
com_pos_int = fromMaybe (-1) com_pos
prep_pos_int = fromMaybe (-1) prep_pos
pos = Position com_pos_int prep_pos_int
res = DeleteResult pos in
case r of
OP_SUCCESS -> pure $ Break res
OP_PREPARE_TIMEOUT -> pure Loop
OP_FORWARD_TIMEOUT -> pure Loop
OP_COMMIT_TIMEOUT -> pure Loop
OP_WRONG_EXPECTED_VERSION -> throw $ WrongExpectedVersion stream version
OP_STREAM_DELETED -> throw $ StreamDeleted $ StreamName stream
OP_INVALID_TRANSACTION -> throw InvalidTransaction
OP_ACCESS_DENIED -> throw $ AccessDenied (StreamName stream)