{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}

-- | Definition for a default Entity to use with a SQL event store.
module Eventium.Store.Sql.DefaultEntity
  ( SqlEvent (..),
    SqlEventId,
    migrateSqlEvent,
    defaultSqlEventStoreConfig,
  )
where

import Database.Persist (Key)
import Database.Persist.Sql (fromSqlKey, toSqlKey)
import Database.Persist.TH
import Eventium.Store.Class
import Eventium.Store.Sql.JSONString
import Eventium.Store.Sql.Operations
import Eventium.Store.Sql.Orphans ()
import Eventium.UUID

share
  [mkPersist sqlSettings, mkMigrate "migrateSqlEvent"]
  [persistLowerCase|
SqlEvent sql=events
    uuid UUID
    version EventVersion
    event JSONString
    UniqueUuidVersion uuid version
    deriving Show
|]

sqlEventMakeKey :: SequenceNumber -> Key SqlEvent
sqlEventMakeKey :: SequenceNumber -> Key SqlEvent
sqlEventMakeKey SequenceNumber
sequenceNumber =
  Int64 -> Key SqlEvent
forall record.
ToBackendKey SqlBackend record =>
Int64 -> Key record
toSqlKey (Int -> Int64
forall a b. (Integral a, Num b) => a -> b
fromIntegral (SequenceNumber -> Int
unSequenceNumber SequenceNumber
sequenceNumber))

sqlEventUnKey :: Key SqlEvent -> SequenceNumber
sqlEventUnKey :: Key SqlEvent -> SequenceNumber
sqlEventUnKey Key SqlEvent
key =
  Int -> SequenceNumber
SequenceNumber (Int64 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Key SqlEvent -> Int64
forall record.
ToBackendKey SqlBackend record =>
Key record -> Int64
fromSqlKey Key SqlEvent
key))

defaultSqlEventStoreConfig :: SqlEventStoreConfig SqlEvent JSONString
defaultSqlEventStoreConfig :: SqlEventStoreConfig SqlEvent JSONString
defaultSqlEventStoreConfig =
  (UUID -> EventVersion -> JSONString -> SqlEvent)
-> (SequenceNumber -> Key SqlEvent)
-> (Key SqlEvent -> SequenceNumber)
-> (SqlEvent -> UUID)
-> (SqlEvent -> EventVersion)
-> (SqlEvent -> JSONString)
-> EntityField SqlEvent (Key SqlEvent)
-> EntityField SqlEvent UUID
-> EntityField SqlEvent EventVersion
-> EntityField SqlEvent JSONString
-> SqlEventStoreConfig SqlEvent JSONString
forall entity serialized.
(UUID -> EventVersion -> serialized -> entity)
-> (SequenceNumber -> Key entity)
-> (Key entity -> SequenceNumber)
-> (entity -> UUID)
-> (entity -> EventVersion)
-> (entity -> serialized)
-> EntityField entity (Key entity)
-> EntityField entity UUID
-> EntityField entity EventVersion
-> EntityField entity serialized
-> SqlEventStoreConfig entity serialized
SqlEventStoreConfig
    UUID -> EventVersion -> JSONString -> SqlEvent
SqlEvent
    SequenceNumber -> Key SqlEvent
sqlEventMakeKey
    Key SqlEvent -> SequenceNumber
sqlEventUnKey
    SqlEvent -> UUID
sqlEventUuid
    SqlEvent -> EventVersion
sqlEventVersion
    SqlEvent -> JSONString
sqlEventEvent
    EntityField SqlEvent (Key SqlEvent)
forall typ. (typ ~ Key SqlEvent) => EntityField SqlEvent typ
SqlEventId
    EntityField SqlEvent UUID
forall typ. (typ ~ UUID) => EntityField SqlEvent typ
SqlEventUuid
    EntityField SqlEvent EventVersion
forall typ. (typ ~ EventVersion) => EntityField SqlEvent typ
SqlEventVersion
    EntityField SqlEvent JSONString
forall typ. (typ ~ JSONString) => EntityField SqlEvent typ
SqlEventEvent