{-# LANGUAGE QuasiQuotes #-}

-- | Definition for a default Entity to use with a SQL event store.

module Eventful.Store.Sql.DefaultEntity
  ( SqlEvent (..)
  , SqlEventId
  , migrateSqlEvent
  , defaultSqlEventStoreConfig
  ) where

import Database.Persist.TH

import Eventful.Store.Class
import Eventful.UUID

import Eventful.Store.Sql.Operations
import Eventful.Store.Sql.JSONString
import Eventful.Store.Sql.Orphans ()

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

defaultSqlEventStoreConfig :: SqlEventStoreConfig SqlEvent JSONString
defaultSqlEventStoreConfig =
  SqlEventStoreConfig
  SqlEvent
  SqlEventKey
  (\(SqlEventKey seqNum) -> seqNum)
  sqlEventUuid
  sqlEventVersion
  sqlEventEvent
  SqlEventId
  SqlEventUuid
  SqlEventVersion
  SqlEventEvent