From 4ce9751c9e645916fdde71874c2cdadd252f32a0 Mon Sep 17 00:00:00 2001 From: Joris Guyonvarch Date: Mon, 6 Jul 2015 00:16:45 +0200 Subject: Setting up Scotty, Persistent, Clay, Blaze, Esqueleto, Elm --- src/server/Model/Database.hs | 44 ++++++++++++++++++++++++++++++++++++++++ src/server/Model/Json/Payment.hs | 21 +++++++++++++++++++ src/server/Model/Payment.hs | 36 ++++++++++++++++++++++++++++++++ src/server/Model/User.hs | 30 +++++++++++++++++++++++++++ 4 files changed, 131 insertions(+) create mode 100644 src/server/Model/Database.hs create mode 100644 src/server/Model/Json/Payment.hs create mode 100644 src/server/Model/Payment.hs create mode 100644 src/server/Model/User.hs (limited to 'src/server/Model') diff --git a/src/server/Model/Database.hs b/src/server/Model/Database.hs new file mode 100644 index 0000000..abf235d --- /dev/null +++ b/src/server/Model/Database.hs @@ -0,0 +1,44 @@ +{-# LANGUAGE EmptyDataDecls #-} +{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE GADTs #-} +{-# LANGUAGE GeneralizedNewtypeDeriving #-} +{-# LANGUAGE MultiParamTypeClasses #-} +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE QuasiQuotes #-} +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TypeFamilies #-} + +module Model.Database where + +import Control.Monad.Logger (NoLoggingT, runNoLoggingT) +import Control.Monad.Trans.Resource (runResourceT, ResourceT) + +import Data.Text +import Data.Time.Clock (UTCTime) + +import Database.Persist.Sqlite +import Database.Persist.TH + +share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase| +User + creation UTCTime + email Text + name Text + EmailKey email + deriving Show +Payment + userId UserId + creation UTCTime + name Text + cost Int + deriving Show +|] + +type Persist a = SqlPersistT (ResourceT (NoLoggingT IO)) a + +runDb :: Persist a -> IO a +runDb = runNoLoggingT . runResourceT . withSqliteConn "database" . runSqlConn + +runMigrations :: IO () +runMigrations = runDb $ runMigration migrateAll diff --git a/src/server/Model/Json/Payment.hs b/src/server/Model/Json/Payment.hs new file mode 100644 index 0000000..de6beb9 --- /dev/null +++ b/src/server/Model/Json/Payment.hs @@ -0,0 +1,21 @@ +{-# LANGUAGE DeriveGeneric #-} + +module Model.Json.Payment + ( Payment(..) + ) where + +import GHC.Generics + +import Data.Time +import Data.Text (Text) +import Data.Aeson + +data Payment = Payment + { creation :: UTCTime + , name :: Text + , cost :: Int + , userName :: Text + } deriving (Show, Generic) + +instance FromJSON Payment +instance ToJSON Payment diff --git a/src/server/Model/Payment.hs b/src/server/Model/Payment.hs new file mode 100644 index 0000000..b35e13c --- /dev/null +++ b/src/server/Model/Payment.hs @@ -0,0 +1,36 @@ +module Model.Payment + ( getPayments + , insertPayment + ) where + +import Data.Text (Text) +import Data.Time.Clock (getCurrentTime) + +import Control.Monad.IO.Class (liftIO) + +import Database.Persist +import Database.Esqueleto +import qualified Database.Esqueleto as E + +import Model.Database +import qualified Model.Json.Payment as P + +getPayments :: Persist [P.Payment] +getPayments = do + xs <- select $ + from $ \(payment `InnerJoin` user) -> do + on (payment ^. PaymentUserId E.==. user ^. UserId) + return (payment, user) + return (map getJsonPayment xs) + +getJsonPayment :: (Entity Payment, Entity User) -> P.Payment +getJsonPayment (paymentEntity, userEntity) = + let payment = entityVal paymentEntity + user = entityVal userEntity + in P.Payment (paymentCreation payment) (paymentName payment) (paymentCost payment) (userName user) + + +insertPayment :: UserId -> Text -> Int -> Persist PaymentId +insertPayment userId name cost = do + now <- liftIO getCurrentTime + insert $ Payment userId now name cost diff --git a/src/server/Model/User.hs b/src/server/Model/User.hs new file mode 100644 index 0000000..ddca0fb --- /dev/null +++ b/src/server/Model/User.hs @@ -0,0 +1,30 @@ +module Model.User + ( getUsers + , getUser + , insertUser + , deleteUser + ) where + +import Data.Text (Text) +import Data.Time.Clock (getCurrentTime) + +import Control.Monad.IO.Class (liftIO) + +import Database.Persist + +import Model.Database + +getUsers :: Persist [User] +getUsers = map entityVal <$> selectList [] [Desc UserCreation] + +getUser :: Text -> Persist (Maybe (Entity User)) +getUser email = selectFirst [UserEmail ==. email] [] + +insertUser :: Text -> Text -> Persist UserId +insertUser email name = do + now <- liftIO getCurrentTime + insert $ User now email name + +deleteUser :: Text -> Persist () +deleteUser email = + deleteWhere [UserEmail ==. email] -- cgit v1.2.3