68 lines
1.7 KiB
Haskell
68 lines
1.7 KiB
Haskell
{-# LANGUAGE EmptyDataDecls #-}
|
|
{-# LANGUAGE FlexibleContexts #-}
|
|
{-# LANGUAGE GADTs #-}
|
|
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
|
|
{-# LANGUAGE MultiParamTypeClasses #-}
|
|
{-# LANGUAGE OverloadedStrings #-}
|
|
{-# LANGUAGE QuasiQuotes #-}
|
|
{-# LANGUAGE TemplateHaskell #-}
|
|
{-# LANGUAGE TypeFamilies #-}
|
|
--------------------------------------------------------------------------------
|
|
module Types where
|
|
--------------------------------------------------------------------------------
|
|
import Data.Aeson
|
|
import Data.Text
|
|
import Database.Persist.TH
|
|
--------------------------------------------------------------------------------
|
|
|
|
share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|
|
|
Account
|
|
name Text
|
|
age Int
|
|
UniqueName name
|
|
deriving Eq Read Show
|
|
|]
|
|
|
|
instance FromJSON Account where
|
|
parseJSON = withObject "User" $ \ v ->
|
|
Account <$> v .: "name"
|
|
<*> v .: "age"
|
|
|
|
instance ToJSON Account where
|
|
toJSON (Account name age) =
|
|
object [ "name" .= name
|
|
, "age" .= age
|
|
]
|
|
|
|
newtype Username = Username Text
|
|
deriving (Eq, Show)
|
|
|
|
instance ToJSON Username where
|
|
toJSON (Username x) = toJSON x
|
|
|
|
newtype Password = Password Text
|
|
deriving (Eq, Show)
|
|
|
|
instance ToJSON Password where
|
|
toJSON (Password x) = toJSON x
|
|
|
|
data Role = RegularUser | Manager | Admin
|
|
deriving (Eq, Show)
|
|
|
|
instance ToJSON Role where
|
|
toJSON RegularUser = "user"
|
|
toJSON Manager = "manager"
|
|
toJSON Admin = "admin"
|
|
|
|
data Session = Session
|
|
{ username :: Username
|
|
, password :: Password
|
|
, role :: Role
|
|
} deriving (Eq, Show)
|
|
|
|
instance ToJSON Session where
|
|
toJSON (Session username password role) =
|
|
object [ "username" .= username
|
|
, "password" .= password
|
|
, "role" .= role
|
|
]
|