{-# OPTIONS -fno-warn-orphans #-}
{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances #-}
{-# LANGUAGE DeriveGeneric #-}
module Model where
import GHC.Generics (Generic)
import Database.Record
(PersistableType (..), PersistableWidth (..),
FromSql (..), valueRecordFromSql,
ToSql (..), valueRecordToSql)
import Database.Record.KeyConstraint (HasColumnConstraint (..), NotNull, unsafeSpecifyColumnConstraint)
import Database.Record.Persistable (unsafePersistableSqlTypeFromNull, unsafeValueWidth, )
instance PersistableType String where
persistableType = unsafePersistableSqlTypeFromNull "<null>"
instance PersistableWidth String where
persistableWidth = unsafeValueWidth
instance PersistableWidth Int where
persistableWidth = unsafeValueWidth
instance FromSql String String where
recordFromSql = valueRecordFromSql id
instance FromSql String Int where
recordFromSql = valueRecordFromSql read
instance ToSql String String where
recordToSql = valueRecordToSql id
instance ToSql String Int where
recordToSql = valueRecordToSql show
data User =
User
{ uid :: Int
, uname :: String
, note :: String
} deriving (Eq, Show, Generic)
data Group =
Group
{ gid :: Int
, gname :: String
} deriving (Eq, Show, Generic)
data Membership =
Membership
{ user :: User
, group :: Maybe Group
} deriving (Eq, Show, Generic)
instance HasColumnConstraint NotNull User where
columnConstraint = unsafeSpecifyColumnConstraint 0
instance HasColumnConstraint NotNull Group where
columnConstraint = unsafeSpecifyColumnConstraint 0
instance PersistableWidth User
instance PersistableWidth Group
instance PersistableWidth Membership
instance FromSql String User
instance FromSql String Group
instance FromSql String Membership
instance ToSql String User
instance ToSql String Group
instance ToSql String Membership