{-# LANGUAGE DeriveDataTypeable, DeriveGeneric, TemplateHaskell, TypeFamilies #-}
module Clckwrks.ProfileData.Types
( DisplayName(..)
, ProfileData(..)
, Role(..)
, defaultProfileDataFor
, emptyProfileData
, Username(..)
) where
import Data.Data (Data, Typeable)
import Data.IxSet (Indexable(..), ixSet, ixFun)
import Data.IxSet.Ix (Ix)
import Data.Map (Map, empty)
import Data.SafeCopy (Migrate(..), base, deriveSafeCopy, extension)
import Data.Set (Set, empty, singleton)
import Data.Text (Text, empty)
import Data.Typeable (Typeable)
import Data.UserId (UserId(..))
import GHC.Generics (Generic)
data Role_001
= Administrator_001
| Visitor_001
deriving (Eq, Ord, Read, Show, Data, Typeable, Enum, Bounded, Generic)
$(deriveSafeCopy 1 'base ''Role_001)
data Role
= Administrator
| Visitor
| Moderator
| Editor
deriving (Eq, Ord, Read, Show, Data, Typeable, Enum, Bounded, Generic)
$(deriveSafeCopy 2 'extension ''Role)
instance Migrate Role where
type MigrateFrom Role = Role_001
migrate Administrator_001 = Administrator
migrate Visitor_001 = Visitor
newtype Username = Username { unUsername :: Text }
deriving (Eq, Ord, Read, Show, Data, Typeable, Generic)
newtype DisplayName = DisplayName { unDisplayName :: Text }
deriving (Eq, Ord, Read, Show, Data, Typeable, Generic)
$(deriveSafeCopy 1 'base ''DisplayName)
data ProfileData_1 = ProfileData_1
{ dataFor_1 :: UserId
, username_1 :: Text
, email_1 :: Maybe Text
, roles_1 :: Set Role
, attributes_1 :: Map Text Text
}
deriving (Eq, Ord, Read, Show, Data, Typeable, Generic)
$(deriveSafeCopy 1 'base ''ProfileData_1)
data ProfileData_2 = ProfileData_2
{ dataFor_2 :: UserId
, roles_2 :: Set Role
, attributes_2 :: Map Text Text
}
deriving (Eq, Ord, Read, Show, Data, Typeable, Generic)
$(deriveSafeCopy 2 'extension ''ProfileData_2)
instance Migrate ProfileData_2 where
type MigrateFrom ProfileData_2 = ProfileData_1
migrate (ProfileData_1 df _ _ rs attrs) = ProfileData_2 df rs attrs
data ProfileData = ProfileData
{ dataFor :: UserId
, displayName :: Maybe DisplayName
, roles :: Set Role
, attributes :: Map Text Text
}
deriving (Eq, Ord, Read, Show, Data, Typeable, Generic)
$(deriveSafeCopy 3 'extension ''ProfileData)
instance Migrate ProfileData where
type MigrateFrom ProfileData = ProfileData_2
migrate (ProfileData_2 df rs attrs) = ProfileData df Nothing rs attrs
emptyProfileData :: ProfileData
emptyProfileData = ProfileData
{ dataFor = UserId 0
, displayName = Nothing
, roles = Data.Set.empty
, attributes = Data.Map.empty
}
defaultProfileDataFor :: UserId -> ProfileData
defaultProfileDataFor uid =
emptyProfileData { dataFor = uid
, roles = singleton Visitor
}
instance Indexable ProfileData where
empty = ixSet [ ixFunS dataFor
]
where
ixFunS :: (Ord b, Typeable b) => (a -> b) -> Ix a
ixFunS f = ixFun $ \a -> [f a]