tmp-proc-example-0.5.0.0: src/TmpProc/Example1/Schema.hs
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
{-|
Copyright : (c) 2020-2021 Tim Emiola
SPDX-License-Identifier: BSD3
Maintainer : Tim Emiola <adetokunbo@users.noreply.github.com>
Specifies the schema of the data accessed by the demo service.
-}
module TmpProc.Example1.Schema
where
import Data.Int (Int64)
import Data.Aeson
import Data.Aeson.Types
import Data.Text (Text)
import qualified Database.Persist.TH as P
type ContactID = Int64
P.share [P.mkPersist P.sqlSettings, P.mkMigrate "migrateAll"] [P.persistLowerCase|
Contact sql=contacts
email Text
name Text
age Int
title Text
UniqueEmail email
deriving Show Read
|]
instance ToJSON Contact where
toJSON Contact {contactEmail, contactName, contactAge, contactTitle } = object
[ "email" .= contactEmail
, "name" .= contactName
, "age" .= contactAge
, "title" .= contactTitle
]
instance FromJSON Contact where
parseJSON = withObject "Contact" parseContact
parseContact :: Object -> Parser Contact
parseContact o = do
contactName <- o .: "name"
contactEmail <- o .: "email"
contactAge <- o .: "age"
contactTitle <- o .: "title"
return Contact
{ contactName
, contactEmail
, contactAge
, contactTitle
}