diff options
Diffstat (limited to 'server')
57 files changed, 554 insertions, 529 deletions
| diff --git a/server/Setup.hs b/server/Setup.hs index 9a994af..4467109 100644 --- a/server/Setup.hs +++ b/server/Setup.hs @@ -1,2 +1,2 @@ -import Distribution.Simple +import           Distribution.Simple  main = defaultMain diff --git a/server/server.cabal b/server/server.cabal index 41b2fd6..d30060b 100644 --- a/server/server.cabal +++ b/server/server.cabal @@ -1,103 +1,110 @@ -name:                server -version:             0.0.1 -license:             GPL-3 -license-file:        LICENSE -author:              Joris Guyonvarch -maintainer:          joris@guyonvarch.me -category:            Web -build-type:          Simple -cabal-version:       >=1.10 +Name:                server +Version:             0.0.1 +License:             GPL-3 +License-file:        LICENSE +Author:              Joris Guyonvarch +Maintainer:          joris@guyonvarch.me +Category:            Web +Build-type:          Simple +Cabal-version:       >=1.10 -executable server -  main-is:             Main.hs -  ghc-options:         -Wall -Werror -  build-depends:       aeson -                     , base >=4.9 && <4.11 -                     , base64-bytestring -                     , blaze-builder -                     , blaze-html -                     , bytestring -                     , clay -                     , clientsession -                     , common -                     , config-manager -                     , containers -                     , cookie -                     , email-validate -                     , filepath -                     , http-conduit -                     , http-types -                     , lens -                     , monad-logger -                     , mtl -                     , parsec -                     , process -                     , random -                     , resourcet -                     , scotty -                     , sqlite-simple -                     , text -                     , time -                     , transformers -                     , unordered-containers -                     , uuid -                     , wai -                     , wai-extra -                     , wai-middleware-static -  hs-source-dirs:      src -  default-language:    Haskell2010 -  other-modules:       Conf -                     , Controller.Category -                     , Controller.Income -                     , Controller.Index -                     , Controller.Payment -                     , Controller.SignIn -                     , Cookie -                     , Design.Color -                     , Design.Constants -                     , Design.Dialog -                     , Design.Errors -                     , Design.Form -                     , Design.Global -                     , Design.Helper -                     , Design.Media -                     , Design.Tooltip -                     , Design.View.Header -                     , Design.View.Payment -                     , Design.View.Payment.Header -                     , Design.View.Payment.Pages -                     , Design.View.Payment.Table -                     , Design.View.SignIn -                     , Design.View.Stat -                     , Design.View.Table -                     , Design.Views -                     , Job.Daemon -                     , Job.Frequency -                     , Job.Kind -                     , Job.Model -                     , Job.MonthlyPayment -                     , Job.WeeklyReport -                     , Json -                     , LoginSession -                     , Main -                     , MimeMail -                     , Model.Category -                     , Model.Frequency -                     , Model.Income -                     , Model.Init -                     , Model.Mail -                     , Model.Payer -                     , Model.Payment -                     , Model.PaymentCategory -                     , Model.Query -                     , Model.SignIn -                     , Model.UUID -                     , Model.User -                     , Resource -                     , Secure -                     , SendMail -                     , Utils.Time -                     , Validation -                     , View.Mail.SignIn -                     , View.Mail.WeeklyReport -                     , View.Page +Executable server +  Main-is:           Main.hs +  Ghc-options:       -Wall -Werror +  Hs-source-dirs:    src +  Default-language:  Haskell2010 +  Extensions: +    ExistentialQuantification +    MultiParamTypeClasses + +  Build-depends: +    aeson +    , base >=4.9 && <4.11 +    , base64-bytestring +    , blaze-builder +    , blaze-html +    , bytestring +    , clay +    , clientsession +    , common +    , config-manager +    , containers +    , cookie +    , email-validate +    , filepath +    , http-conduit +    , http-types +    , lens +    , monad-logger +    , mtl +    , parsec +    , process +    , random +    , resourcet +    , scotty +    , sqlite-simple +    , text +    , time +    , transformers +    , unordered-containers +    , uuid +    , wai +    , wai-extra +    , wai-middleware-static + +  other-modules: +    Conf +    Controller.Category +    Controller.Income +    Controller.Index +    Controller.Payment +    Controller.SignIn +    Cookie +    Design.Color +    Design.Constants +    Design.Dialog +    Design.Errors +    Design.Form +    Design.Global +    Design.Helper +    Design.Media +    Design.Tooltip +    Design.View.Header +    Design.View.Payment +    Design.View.Payment.Header +    Design.View.Payment.Pages +    Design.View.Payment.Table +    Design.View.SignIn +    Design.View.Stat +    Design.View.Table +    Design.Views +    Job.Daemon +    Job.Frequency +    Job.Kind +    Job.Model +    Job.MonthlyPayment +    Job.WeeklyReport +    Json +    LoginSession +    Main +    MimeMail +    Model.Category +    Model.Frequency +    Model.Income +    Model.Init +    Model.Mail +    Model.Payer +    Model.Payment +    Model.PaymentCategory +    Model.Query +    Model.SignIn +    Model.UUID +    Model.User +    Resource +    Secure +    SendMail +    Utils.Time +    Validation +    View.Mail.SignIn +    View.Mail.WeeklyReport +    View.Page diff --git a/server/src/Conf.hs b/server/src/Conf.hs index 26c5c28..299f071 100644 --- a/server/src/Conf.hs +++ b/server/src/Conf.hs @@ -5,20 +5,20 @@ module Conf    , Conf(..)    ) where -import Data.Text (Text) -import qualified Data.Text as T  import qualified Data.ConfigManager as Conf -import Data.Time.Clock (NominalDiffTime) +import           Data.Text          (Text) +import qualified Data.Text          as T +import           Data.Time.Clock    (NominalDiffTime) -import Common.Model (Currency(..)) +import           Common.Model       (Currency (..))  data Conf = Conf -  { hostname :: Text -  , port :: Int +  { hostname         :: Text +  , port             :: Int    , signInExpiration :: NominalDiffTime -  , currency :: Currency -  , noReplyMail :: Text -  , https :: Bool +  , currency         :: Currency +  , noReplyMail      :: Text +  , https            :: Bool    } deriving Show  get :: FilePath -> IO Conf @@ -36,4 +36,4 @@ get path = do      )    case conf of      Left msg -> error (T.unpack msg) -    Right c -> return c +    Right c  -> return c diff --git a/server/src/Controller/Category.hs b/server/src/Controller/Category.hs index d6ed2f2..a646496 100644 --- a/server/src/Controller/Category.hs +++ b/server/src/Controller/Category.hs @@ -6,19 +6,20 @@ module Controller.Category    , delete    ) where -import Control.Monad.IO.Class (liftIO) -import Network.HTTP.Types.Status (ok200, badRequest400) -import qualified Data.Text.Lazy as TL -import Web.Scotty hiding (delete) +import           Control.Monad.IO.Class    (liftIO) +import qualified Data.Text.Lazy            as TL +import           Network.HTTP.Types.Status (badRequest400, ok200) +import           Web.Scotty                hiding (delete) -import qualified Common.Message as Message -import qualified Common.Message.Key as Key -import Common.Model (CategoryId, CreateCategory(..), EditCategory(..)) +import qualified Common.Message            as Message +import qualified Common.Message.Key        as Key +import           Common.Model              (CategoryId, CreateCategory (..), +                                            EditCategory (..)) -import Json (jsonId) -import qualified Model.Category as Category -import qualified Model.PaymentCategory as PaymentCategory -import qualified Model.Query as Query +import           Json                      (jsonId) +import qualified Model.Category            as Category +import qualified Model.PaymentCategory     as PaymentCategory +import qualified Model.Query               as Query  import qualified Secure  create :: CreateCategory -> ActionM () diff --git a/server/src/Controller/Income.hs b/server/src/Controller/Income.hs index 148b713..c42f6a7 100644 --- a/server/src/Controller/Income.hs +++ b/server/src/Controller/Income.hs @@ -6,18 +6,19 @@ module Controller.Income    , deleteOwn    ) where -import Control.Monad.IO.Class (liftIO) -import Network.HTTP.Types.Status (ok200, badRequest400) -import qualified Data.Text.Lazy as TL -import Web.Scotty +import           Control.Monad.IO.Class    (liftIO) +import qualified Data.Text.Lazy            as TL +import           Network.HTTP.Types.Status (badRequest400, ok200) +import           Web.Scotty -import qualified Common.Message as Message -import qualified Common.Message.Key as Key -import Common.Model (CreateIncome(..), EditIncome(..), IncomeId, User(..)) +import qualified Common.Message            as Message +import qualified Common.Message.Key        as Key +import           Common.Model              (CreateIncome (..), EditIncome (..), +                                            IncomeId, User (..)) -import Json (jsonId) -import qualified Model.Income as Income -import qualified Model.Query as Query +import           Json                      (jsonId) +import qualified Model.Income              as Income +import qualified Model.Query               as Query  import qualified Secure  create :: CreateIncome -> ActionM () diff --git a/server/src/Controller/Index.hs b/server/src/Controller/Index.hs index 8473c5c..bf4859d 100644 --- a/server/src/Controller/Index.hs +++ b/server/src/Controller/Index.hs @@ -3,26 +3,26 @@ module Controller.Index    , signOut    ) where -import Control.Monad.IO.Class (liftIO) -import Data.Text (Text) -import Data.Time.Clock (getCurrentTime, diffUTCTime) -import Network.HTTP.Types.Status (ok200) -import Prelude hiding (error) -import Web.Scotty hiding (get) +import           Control.Monad.IO.Class    (liftIO) +import           Data.Text                 (Text) +import           Data.Time.Clock           (diffUTCTime, getCurrentTime) +import           Network.HTTP.Types.Status (ok200) +import           Prelude                   hiding (error) +import           Web.Scotty                hiding (get) -import qualified Common.Message as Message -import Common.Message.Key (Key) -import qualified Common.Message.Key as Key -import Common.Model (InitResult(..), User(..)) +import qualified Common.Message            as Message +import           Common.Message.Key        (Key) +import qualified Common.Message.Key        as Key +import           Common.Model              (InitResult (..), User (..)) -import Conf (Conf(..)) -import Model.Init (getInit) +import           Conf                      (Conf (..))  import qualified LoginSession -import qualified Model.Query as Query -import qualified Model.SignIn as SignIn -import qualified Model.User as User -import Secure (getUserFromToken) -import View.Page (page) +import           Model.Init                (getInit) +import qualified Model.Query               as Query +import qualified Model.SignIn              as SignIn +import qualified Model.User                as User +import           Secure                    (getUserFromToken) +import           View.Page                 (page)  get :: Conf -> Maybe Text -> ActionM ()  get conf mbToken = do @@ -70,7 +70,7 @@ validateSignIn conf textToken = do                          SignIn.signInTokenToUsed . SignIn.id $ signIn                          User.get . SignIn.email $ signIn                        return $ case mbUser of -                        Nothing -> Left Key.Secure_Unauthorized +                        Nothing   -> Left Key.Secure_Unauthorized                          Just user -> Right user  getLoggedUser :: ActionM (Maybe User) diff --git a/server/src/Controller/Payment.hs b/server/src/Controller/Payment.hs index dc10311..e4104eb 100644 --- a/server/src/Controller/Payment.hs +++ b/server/src/Controller/Payment.hs @@ -7,16 +7,18 @@ module Controller.Payment    , deleteOwn    ) where -import Control.Monad.IO.Class (liftIO) -import Network.HTTP.Types.Status (ok200, badRequest400) -import Web.Scotty - -import Common.Model (PaymentId, User(..), CreatePayment(..), EditPayment(..)) - -import Json (jsonId) -import qualified Model.Payment as Payment -import qualified Model.PaymentCategory as PaymentCategory -import qualified Model.Query as Query +import           Control.Monad.IO.Class    (liftIO) +import           Network.HTTP.Types.Status (badRequest400, ok200) +import           Web.Scotty + +import           Common.Model              (CreatePayment (..), +                                            EditPayment (..), PaymentId, +                                            User (..)) + +import           Json                      (jsonId) +import qualified Model.Payment             as Payment +import qualified Model.PaymentCategory     as PaymentCategory +import qualified Model.Query               as Query  import qualified Secure  list :: ActionM () diff --git a/server/src/Controller/SignIn.hs b/server/src/Controller/SignIn.hs index 0086fa5..5552781 100644 --- a/server/src/Controller/SignIn.hs +++ b/server/src/Controller/SignIn.hs @@ -4,25 +4,25 @@ module Controller.SignIn    ( signIn    ) where -import Control.Monad.IO.Class (liftIO) -import Network.HTTP.Types.Status (ok200, badRequest400) -import qualified Data.Text as T -import qualified Data.Text.Encoding as TE -import qualified Data.Text.Lazy as TL -import Web.Scotty +import           Control.Monad.IO.Class    (liftIO) +import qualified Data.Text                 as T +import qualified Data.Text.Encoding        as TE +import qualified Data.Text.Lazy            as TL +import           Network.HTTP.Types.Status (badRequest400, ok200) +import           Web.Scotty -import qualified Common.Message as Message -import qualified Common.Message.Key as Key -import Common.Model (SignIn(..)) +import qualified Common.Message            as Message +import qualified Common.Message.Key        as Key +import           Common.Model              (SignIn (..)) -import Conf (Conf) +import           Conf                      (Conf)  import qualified Conf -import qualified Model.Query as Query -import qualified Model.SignIn as SignIn -import qualified Model.User as User +import qualified Model.Query               as Query +import qualified Model.SignIn              as SignIn +import qualified Model.User                as User  import qualified SendMail -import qualified Text.Email.Validate as Email -import qualified View.Mail.SignIn as SignIn +import qualified Text.Email.Validate       as Email +import qualified View.Mail.SignIn          as SignIn  signIn :: Conf -> SignIn -> ActionM ()  signIn conf (SignIn email) = @@ -41,7 +41,7 @@ signIn conf (SignIn email) =            maybeSentMail <- liftIO . SendMail.sendMail $ SignIn.mail conf user url [email]            case maybeSentMail of              Right _ -> textKey ok200 Key.SignIn_EmailSent -            Left _ -> textKey badRequest400 Key.SignIn_EmailSendFail +            Left _  -> textKey badRequest400 Key.SignIn_EmailSendFail          Nothing -> textKey badRequest400 Key.Secure_Unauthorized      else textKey badRequest400 Key.SignIn_EmailInvalid    where textKey st key = status st >> (text . TL.fromStrict $ Message.get key) diff --git a/server/src/Cookie.hs b/server/src/Cookie.hs index 96d45da..511dd42 100644 --- a/server/src/Cookie.hs +++ b/server/src/Cookie.hs @@ -9,25 +9,25 @@ module Cookie    , deleteCookie    ) where -import Control.Monad ( liftM ) +import           Control.Monad            (liftM) -import qualified Data.Text as TS -import qualified Data.Text.Encoding as TS -import qualified Data.Text.Lazy.Encoding as TL +import qualified Data.Text                as TS +import qualified Data.Text.Encoding       as TS +import qualified Data.Text.Lazy.Encoding  as TL -import Conf (Conf) +import           Conf                     (Conf)  import qualified Conf -import qualified Data.Map as Map +import qualified Data.Map                 as Map -import qualified Data.ByteString.Lazy as BSL +import qualified Data.ByteString.Lazy     as BSL -import Data.Time.Clock.POSIX ( posixSecondsToUTCTime ) +import           Data.Time.Clock.POSIX    (posixSecondsToUTCTime) -import Blaze.ByteString.Builder ( toLazyByteString ) +import           Blaze.ByteString.Builder (toLazyByteString) -import Web.Scotty.Trans -import Web.Cookie +import           Web.Cookie +import           Web.Scotty.Trans  makeSimpleCookie :: Conf -> TS.Text -> TS.Text -> SetCookie  makeSimpleCookie conf name value = diff --git a/server/src/Design/Color.hs b/server/src/Design/Color.hs index 9a5797f..e7f5aec 100644 --- a/server/src/Design/Color.hs +++ b/server/src/Design/Color.hs @@ -1,8 +1,8 @@  module Design.Color where -import Clay +import           Clay  import qualified Clay.Color as C -import Data.Text (Text) +import           Data.Text  (Text)  -- http://chir.ag/projects/name-that-color/#969696 diff --git a/server/src/Design/Constants.hs b/server/src/Design/Constants.hs index 4e2b8cc..a3123d9 100644 --- a/server/src/Design/Constants.hs +++ b/server/src/Design/Constants.hs @@ -1,6 +1,6 @@  module Design.Constants where -import Clay +import           Clay  iconFontSize :: Size LengthUnit  iconFontSize = px 32 diff --git a/server/src/Design/Dialog.hs b/server/src/Design/Dialog.hs index 4678633..6759606 100644 --- a/server/src/Design/Dialog.hs +++ b/server/src/Design/Dialog.hs @@ -4,9 +4,9 @@ module Design.Dialog    ( design    ) where -import Data.Monoid ((<>)) +import           Data.Monoid ((<>)) -import Clay +import           Clay  design :: Css  design = do diff --git a/server/src/Design/Errors.hs b/server/src/Design/Errors.hs index 57aaeee..2c6c16b 100644 --- a/server/src/Design/Errors.hs +++ b/server/src/Design/Errors.hs @@ -4,9 +4,9 @@ module Design.Errors    ( design    ) where -import Clay +import           Clay -import Design.Color as Color +import           Design.Color as Color  design :: Css  design = do diff --git a/server/src/Design/Form.hs b/server/src/Design/Form.hs index ebb8ac8..a4a1de0 100644 --- a/server/src/Design/Form.hs +++ b/server/src/Design/Form.hs @@ -4,11 +4,11 @@ module Design.Form    ( design    ) where -import Data.Monoid ((<>)) +import           Data.Monoid  ((<>)) -import Clay +import           Clay -import Design.Color as Color +import           Design.Color as Color  design :: Css  design = do diff --git a/server/src/Design/Global.hs b/server/src/Design/Global.hs index 47ea4a9..1fe6a80 100644 --- a/server/src/Design/Global.hs +++ b/server/src/Design/Global.hs @@ -4,20 +4,20 @@ module Design.Global    ( globalDesign    ) where -import Clay +import           Clay -import Data.Text.Lazy (Text) +import           Data.Text.Lazy   (Text) -import qualified Design.Views as Views -import qualified Design.Form as Form -import qualified Design.Errors as Errors -import qualified Design.Dialog as Dialog -import qualified Design.Tooltip as Tooltip +import qualified Design.Dialog    as Dialog +import qualified Design.Errors    as Errors +import qualified Design.Form      as Form +import qualified Design.Tooltip   as Tooltip +import qualified Design.Views     as Views -import qualified Design.Color as Color -import qualified Design.Helper as Helper +import qualified Design.Color     as Color  import qualified Design.Constants as Constants -import qualified Design.Media as Media +import qualified Design.Helper    as Helper +import qualified Design.Media     as Media  globalDesign :: Text  globalDesign = renderWith compact [] global diff --git a/server/src/Design/Helper.hs b/server/src/Design/Helper.hs index 41528ed..0913511 100644 --- a/server/src/Design/Helper.hs +++ b/server/src/Design/Helper.hs @@ -9,12 +9,12 @@ module Design.Helper    , verticalCentering    ) where -import Prelude hiding (span) +import           Prelude          hiding (span) -import Clay hiding (button, input) +import           Clay             hiding (button, input) -import Design.Constants -import Design.Color as Color +import           Design.Color     as Color +import           Design.Constants  clearFix :: Css  clearFix = diff --git a/server/src/Design/Media.hs b/server/src/Design/Media.hs index 77220ee..19a3b8c 100644 --- a/server/src/Design/Media.hs +++ b/server/src/Design/Media.hs @@ -6,10 +6,10 @@ module Design.Media    , desktop    ) where -import Clay hiding (query) +import           Clay            hiding (query)  import qualified Clay -import Clay.Stylesheet (Feature) -import qualified Clay.Media as Media +import qualified Clay.Media      as Media +import           Clay.Stylesheet (Feature)  mobile :: Css -> Css  mobile = query [Media.maxWidth mobileTabletLimit] diff --git a/server/src/Design/Tooltip.hs b/server/src/Design/Tooltip.hs index 1da8764..57aec33 100644 --- a/server/src/Design/Tooltip.hs +++ b/server/src/Design/Tooltip.hs @@ -4,9 +4,9 @@ module Design.Tooltip    ( design    ) where -import Clay +import           Clay -import Design.Color as Color +import           Design.Color as Color  design :: Css  design = do diff --git a/server/src/Design/View/Header.hs b/server/src/Design/View/Header.hs index 20627e6..d05f748 100644 --- a/server/src/Design/View/Header.hs +++ b/server/src/Design/View/Header.hs @@ -4,13 +4,13 @@ module Design.View.Header    ( design    ) where -import Data.Monoid ((<>)) +import           Data.Monoid   ((<>)) -import Clay +import           Clay -import Design.Color as Color +import           Design.Color  as Color  import qualified Design.Helper as Helper -import qualified Design.Media as Media +import qualified Design.Media  as Media  design :: Css  design = do diff --git a/server/src/Design/View/Payment.hs b/server/src/Design/View/Payment.hs index d3c7650..62f7061 100644 --- a/server/src/Design/View/Payment.hs +++ b/server/src/Design/View/Payment.hs @@ -4,11 +4,11 @@ module Design.View.Payment    ( design    ) where -import Clay +import           Clay  import qualified Design.View.Payment.Header as Header -import qualified Design.View.Payment.Table as Table -import qualified Design.View.Payment.Pages as Pages +import qualified Design.View.Payment.Pages  as Pages +import qualified Design.View.Payment.Table  as Table  design :: Css  design = do diff --git a/server/src/Design/View/Payment/Header.hs b/server/src/Design/View/Payment/Header.hs index f02da8a..d87e95b 100644 --- a/server/src/Design/View/Payment/Header.hs +++ b/server/src/Design/View/Payment/Header.hs @@ -4,16 +4,16 @@ module Design.View.Payment.Header    ( design    ) where -import Data.Monoid ((<>)) +import           Data.Monoid      ((<>)) -import Clay +import           Clay -import Design.Constants +import           Design.Constants -import qualified Design.Helper as Helper -import qualified Design.Color as Color +import qualified Design.Color     as Color  import qualified Design.Constants as Constants -import qualified Design.Media as Media +import qualified Design.Helper    as Helper +import qualified Design.Media     as Media  design :: Css  design = do diff --git a/server/src/Design/View/Payment/Pages.hs b/server/src/Design/View/Payment/Pages.hs index 5fc13f0..f6660a1 100644 --- a/server/src/Design/View/Payment/Pages.hs +++ b/server/src/Design/View/Payment/Pages.hs @@ -4,12 +4,12 @@ module Design.View.Payment.Pages    ( design    ) where -import Clay +import           Clay -import qualified Design.Color as Color -import qualified Design.Helper as Helper +import qualified Design.Color     as Color  import qualified Design.Constants as Constants -import qualified Design.Media as Media +import qualified Design.Helper    as Helper +import qualified Design.Media     as Media  design :: Css  design = do diff --git a/server/src/Design/View/Payment/Table.hs b/server/src/Design/View/Payment/Table.hs index f8326e4..243d7f4 100644 --- a/server/src/Design/View/Payment/Table.hs +++ b/server/src/Design/View/Payment/Table.hs @@ -4,7 +4,7 @@ module Design.View.Payment.Table    ( design    ) where -import Clay +import           Clay  import qualified Design.Color as Color  import qualified Design.Media as Media diff --git a/server/src/Design/View/SignIn.hs b/server/src/Design/View/SignIn.hs index 214e663..2b1252f 100644 --- a/server/src/Design/View/SignIn.hs +++ b/server/src/Design/View/SignIn.hs @@ -4,12 +4,12 @@ module Design.View.SignIn    ( design    ) where -import Clay -import Data.Monoid ((<>)) +import           Clay +import           Data.Monoid      ((<>)) -import qualified Design.Color as Color -import qualified Design.Helper as Helper +import qualified Design.Color     as Color  import qualified Design.Constants as Constants +import qualified Design.Helper    as Helper  design :: Css  design = do diff --git a/server/src/Design/View/Stat.hs b/server/src/Design/View/Stat.hs index 0a5b258..b10dd7b 100644 --- a/server/src/Design/View/Stat.hs +++ b/server/src/Design/View/Stat.hs @@ -4,7 +4,7 @@ module Design.View.Stat    ( design    ) where -import Clay +import           Clay  design :: Css  design = do diff --git a/server/src/Design/View/Table.hs b/server/src/Design/View/Table.hs index 95abf90..fd55656 100644 --- a/server/src/Design/View/Table.hs +++ b/server/src/Design/View/Table.hs @@ -4,11 +4,11 @@ module Design.View.Table    ( design    ) where -import Data.Monoid ((<>)) +import           Data.Monoid  ((<>)) -import Clay +import           Clay -import Design.Color as Color +import           Design.Color as Color  import qualified Design.Media as Media  design :: Css diff --git a/server/src/Design/Views.hs b/server/src/Design/Views.hs index bc6ac83..1157b68 100644 --- a/server/src/Design/Views.hs +++ b/server/src/Design/Views.hs @@ -4,18 +4,18 @@ module Design.Views    ( design    ) where -import Clay +import           Clay -import qualified Design.View.Header as Header +import qualified Design.View.Header  as Header  import qualified Design.View.Payment as Payment -import qualified Design.View.SignIn as SignIn -import qualified Design.View.Stat as Stat -import qualified Design.View.Table as Table - -import qualified Design.Helper as Helper -import qualified Design.Constants as Constants -import qualified Design.Color as Color -import qualified Design.Media as Media +import qualified Design.View.SignIn  as SignIn +import qualified Design.View.Stat    as Stat +import qualified Design.View.Table   as Table + +import qualified Design.Color        as Color +import qualified Design.Constants    as Constants +import qualified Design.Helper       as Helper +import qualified Design.Media        as Media  design :: Css  design = do diff --git a/server/src/Job/Daemon.hs b/server/src/Job/Daemon.hs index 0bc6f6e..26977d1 100644 --- a/server/src/Job/Daemon.hs +++ b/server/src/Job/Daemon.hs @@ -2,18 +2,19 @@ module Job.Daemon    ( runDaemons    ) where -import Control.Concurrent (threadDelay, forkIO, ThreadId) -import Control.Monad (forever) -import Data.Time.Clock (UTCTime) +import           Control.Concurrent (ThreadId, forkIO, threadDelay) +import           Control.Monad      (forever) +import           Data.Time.Clock    (UTCTime) -import Conf (Conf) -import Job.Frequency (Frequency(..), microSeconds) -import Job.Kind (Kind(..)) -import Job.Model (getLastExecution, actualizeLastCheck, actualizeLastExecution) -import Job.MonthlyPayment (monthlyPayment) -import Job.WeeklyReport (weeklyReport) -import qualified Model.Query as Query -import Utils.Time (belongToCurrentMonth, belongToCurrentWeek) +import           Conf               (Conf) +import           Job.Frequency      (Frequency (..), microSeconds) +import           Job.Kind           (Kind (..)) +import           Job.Model          (actualizeLastCheck, actualizeLastExecution, +                                     getLastExecution) +import           Job.MonthlyPayment (monthlyPayment) +import           Job.WeeklyReport   (weeklyReport) +import qualified Model.Query        as Query +import           Utils.Time         (belongToCurrentMonth, belongToCurrentWeek)  runDaemons :: Conf -> IO ()  runDaemons conf = do @@ -29,7 +30,7 @@ runDaemon kind frequency isLastExecutionTooOld runJob =        getLastExecution kind      hasToRun <- case mbLastExecution of        Just lastExecution -> isLastExecutionTooOld lastExecution -      Nothing -> return True +      Nothing            -> return True      if hasToRun        then runJob mbLastExecution >>= (Query.run . actualizeLastExecution kind)        else return () diff --git a/server/src/Job/Frequency.hs b/server/src/Job/Frequency.hs index 263f6e6..c5bef42 100644 --- a/server/src/Job/Frequency.hs +++ b/server/src/Job/Frequency.hs @@ -10,4 +10,4 @@ data Frequency =  microSeconds :: Frequency -> Int  microSeconds EveryHour = 1000000 * 60 * 60 -microSeconds EveryDay = (microSeconds EveryHour) * 24 +microSeconds EveryDay  = (microSeconds EveryHour) * 24 diff --git a/server/src/Job/Kind.hs b/server/src/Job/Kind.hs index af5d4f8..17997f7 100644 --- a/server/src/Job/Kind.hs +++ b/server/src/Job/Kind.hs @@ -2,11 +2,12 @@ module Job.Kind    ( Kind(..)    ) where -import Database.SQLite.Simple (SQLData(SQLText)) -import Database.SQLite.Simple.FromField (fieldData, FromField(fromField)) -import Database.SQLite.Simple.Ok (Ok(Ok, Errors)) -import Database.SQLite.Simple.ToField (ToField(toField)) -import qualified Data.Text as T +import qualified Data.Text                        as T +import           Database.SQLite.Simple           (SQLData (SQLText)) +import           Database.SQLite.Simple.FromField (FromField (fromField), +                                                   fieldData) +import           Database.SQLite.Simple.Ok        (Ok (Errors, Ok)) +import           Database.SQLite.Simple.ToField   (ToField (toField))  data Kind =    MonthlyPayment @@ -16,7 +17,7 @@ data Kind =  instance FromField Kind where    fromField field = case fieldData field of      SQLText text -> Ok (read (T.unpack text) :: Kind) -    _ -> Errors [error "SQLText field required for job kind"] +    _            -> Errors [error "SQLText field required for job kind"]  instance ToField Kind where    toField kind = SQLText . T.pack . show $ kind diff --git a/server/src/Job/Model.hs b/server/src/Job/Model.hs index e1a3c77..b90dca0 100644 --- a/server/src/Job/Model.hs +++ b/server/src/Job/Model.hs @@ -7,20 +7,20 @@ module Job.Model    , actualizeLastCheck    ) where -import Data.Maybe (isJust) -import Data.Time.Clock (UTCTime, getCurrentTime) -import Database.SQLite.Simple (Only(Only)) +import           Data.Maybe             (isJust) +import           Data.Time.Clock        (UTCTime, getCurrentTime) +import           Database.SQLite.Simple (Only (Only))  import qualified Database.SQLite.Simple as SQLite -import Prelude hiding (id) +import           Prelude                hiding (id) -import Job.Kind -import Model.Query (Query(Query)) +import           Job.Kind +import           Model.Query            (Query (Query))  data Job = Job -  { id :: String -  , kind :: Kind +  { id            :: String +  , kind          :: Kind    , lastExecution :: Maybe UTCTime -  , lastCheck :: Maybe UTCTime +  , lastCheck     :: Maybe UTCTime    } deriving (Show)  getLastExecution :: Kind -> Query (Maybe UTCTime) diff --git a/server/src/Job/MonthlyPayment.hs b/server/src/Job/MonthlyPayment.hs index ba24cca..8cb1c27 100644 --- a/server/src/Job/MonthlyPayment.hs +++ b/server/src/Job/MonthlyPayment.hs @@ -2,13 +2,13 @@ module Job.MonthlyPayment    ( monthlyPayment    ) where -import Data.Time.Clock (UTCTime, getCurrentTime) +import           Data.Time.Clock (UTCTime, getCurrentTime) -import Common.Model (Frequency(..), Payment(..)) +import           Common.Model    (Frequency (..), Payment (..)) -import qualified Model.Payment as Payment -import Utils.Time (timeToDay) -import qualified Model.Query as Query +import qualified Model.Payment   as Payment +import qualified Model.Query     as Query +import           Utils.Time      (timeToDay)  monthlyPayment :: Maybe UTCTime -> IO UTCTime  monthlyPayment _ = do diff --git a/server/src/Job/WeeklyReport.hs b/server/src/Job/WeeklyReport.hs index 5737c75..74180df 100644 --- a/server/src/Job/WeeklyReport.hs +++ b/server/src/Job/WeeklyReport.hs @@ -2,13 +2,13 @@ module Job.WeeklyReport    ( weeklyReport    ) where -import Data.Time.Clock (UTCTime, getCurrentTime) +import           Data.Time.Clock        (UTCTime, getCurrentTime) -import Conf (Conf) -import qualified Model.Income as Income -import qualified Model.Payment as Payment -import qualified Model.Query as Query -import qualified Model.User as User +import           Conf                   (Conf) +import qualified Model.Income           as Income +import qualified Model.Payment          as Payment +import qualified Model.Query            as Query +import qualified Model.User             as User  import qualified SendMail  import qualified View.Mail.WeeklyReport as WeeklyReport diff --git a/server/src/Json.hs b/server/src/Json.hs index cc6327a..eb5c572 100644 --- a/server/src/Json.hs +++ b/server/src/Json.hs @@ -1,16 +1,16 @@ +{-# LANGUAGE FlexibleContexts  #-}  {-# LANGUAGE OverloadedStrings #-} -{-# LANGUAGE FlexibleContexts           #-}  module Json    ( jsonObject    , jsonId    ) where -import Data.Int (Int64) -import Data.Text (Text) -import qualified Data.Aeson.Types as Json +import qualified Data.Aeson.Types    as Json  import qualified Data.HashMap.Strict as M -import Web.Scotty +import           Data.Int            (Int64) +import           Data.Text           (Text) +import           Web.Scotty  jsonObject :: [(Text, Json.Value)] -> ActionM ()  jsonObject = json . Json.Object . M.fromList diff --git a/server/src/LoginSession.hs b/server/src/LoginSession.hs index 6f6d620..beca697 100644 --- a/server/src/LoginSession.hs +++ b/server/src/LoginSession.hs @@ -6,16 +6,17 @@ module LoginSession    , delete    ) where -import Web.Scotty (ActionM) -import Cookie (setSimpleCookie, getCookie, deleteCookie) -import qualified Web.ClientSession as CS +import           Cookie                 (deleteCookie, getCookie, +                                         setSimpleCookie) +import qualified Web.ClientSession      as CS +import           Web.Scotty             (ActionM) -import Control.Monad.IO.Class (liftIO) +import           Control.Monad.IO.Class (liftIO) -import Data.Text (Text) -import qualified Data.Text.Encoding as TE +import           Data.Text              (Text) +import qualified Data.Text.Encoding     as TE -import Conf (Conf) +import           Conf                   (Conf)  sessionName :: Text  sessionName = "SESSION" diff --git a/server/src/Main.hs b/server/src/Main.hs index 96c13ee..5ac68db 100644 --- a/server/src/Main.hs +++ b/server/src/Main.hs @@ -1,27 +1,27 @@  {-# LANGUAGE OverloadedStrings #-} -import Control.Applicative (liftA3) -import Control.Monad.IO.Class (liftIO) +import           Control.Applicative           (liftA3) +import           Control.Monad.IO.Class        (liftIO) -import qualified Data.Text.Lazy as LT -import Network.Wai.Middleware.Gzip (GzipFiles(GzipCompress)) -import qualified Network.Wai.Middleware.Gzip as W -import Network.Wai.Middleware.Static -import Web.Scotty +import qualified Data.Text.Lazy                as LT +import           Network.Wai.Middleware.Gzip   (GzipFiles (GzipCompress)) +import qualified Network.Wai.Middleware.Gzip   as W +import           Network.Wai.Middleware.Static +import           Web.Scotty  import qualified Conf -import qualified Controller.Category as Category -import qualified Controller.Income as Income -import qualified Controller.Index as Index -import qualified Controller.Payment as Payment -import qualified Controller.SignIn as SignIn -import Job.Daemon (runDaemons) -import Model.Payer (getOrderedExceedingPayers) -import qualified Data.Time as Time -import qualified Model.User as UserM -import qualified Model.Income as IncomeM -import qualified Model.Payment as PaymentM -import qualified Model.Query as Query +import qualified Controller.Category           as Category +import qualified Controller.Income             as Income +import qualified Controller.Index              as Index +import qualified Controller.Payment            as Payment +import qualified Controller.SignIn             as SignIn +import qualified Data.Time                     as Time +import           Job.Daemon                    (runDaemons) +import qualified Model.Income                  as IncomeM +import           Model.Payer                   (getOrderedExceedingPayers) +import qualified Model.Payment                 as PaymentM +import qualified Model.Query                   as Query +import qualified Model.User                    as UserM  main :: IO ()  main = do diff --git a/server/src/MimeMail.hs b/server/src/MimeMail.hs index 0faaf98..7fe98ed 100644 --- a/server/src/MimeMail.hs +++ b/server/src/MimeMail.hs @@ -38,31 +38,33 @@ module MimeMail      , quotedPrintable      ) where -import qualified Data.ByteString.Lazy as L -import Blaze.ByteString.Builder.Char.Utf8 -import Blaze.ByteString.Builder -import Control.Concurrent (forkIO, putMVar, takeMVar, newEmptyMVar) -import Data.Monoid -import System.Random -import Control.Arrow -import System.Process -import System.IO -import System.Exit -import System.FilePath (takeFileName) -import qualified Data.ByteString.Base64 as Base64 -import Control.Monad ((<=<), foldM, void) -import Control.Exception (throwIO, ErrorCall (ErrorCall)) -import Data.List (intersperse) -import qualified Data.Text.Lazy as LT -import qualified Data.Text.Lazy.Encoding as LT -import Data.ByteString.Char8 () -import Data.Bits ((.&.), shiftR) -import Data.Char (isAscii, isControl) -import Data.Word (Word8) -import qualified Data.ByteString as S -import Data.Text (Text) -import qualified Data.Text as T -import qualified Data.Text.Encoding as TE +import           Blaze.ByteString.Builder +import           Blaze.ByteString.Builder.Char.Utf8 +import           Control.Arrow +import           Control.Concurrent                 (forkIO, newEmptyMVar, +                                                     putMVar, takeMVar) +import           Control.Exception                  (ErrorCall (ErrorCall), +                                                     throwIO) +import           Control.Monad                      (foldM, void, (<=<)) +import           Data.Bits                          (shiftR, (.&.)) +import qualified Data.ByteString                    as S +import qualified Data.ByteString.Base64             as Base64 +import           Data.ByteString.Char8              () +import qualified Data.ByteString.Lazy               as L +import           Data.Char                          (isAscii, isControl) +import           Data.List                          (intersperse) +import           Data.Monoid +import           Data.Text                          (Text) +import qualified Data.Text                          as T +import qualified Data.Text.Encoding                 as TE +import qualified Data.Text.Lazy                     as LT +import qualified Data.Text.Lazy.Encoding            as LT +import           Data.Word                          (Word8) +import           System.Exit +import           System.FilePath                    (takeFileName) +import           System.IO +import           System.Process +import           System.Random  -- | Generates a random sequence of alphanumerics of the given length.  randomString :: RandomGen d => Int -> d -> (String, d) @@ -88,10 +90,10 @@ instance Random Boundary where  -- | An entire mail message.  data Mail = Mail -    { mailFrom :: Address -    , mailTo   :: [Address] -    , mailCc   :: [Address] -    , mailBcc  :: [Address] +    { mailFrom    :: Address +    , mailTo      :: [Address] +    , mailCc      :: [Address] +    , mailBcc     :: [Address]      -- | Other headers, excluding from, to, cc and bcc.      , mailHeaders :: Headers      -- | A list of different sets of alternatives. As a concrete example: @@ -100,7 +102,7 @@ data Mail = Mail      --      -- Make sure when specifying alternatives to place the most preferred      -- version last. -    , mailParts :: [Alternatives] +    , mailParts   :: [Alternatives]      }    deriving Show @@ -132,13 +134,13 @@ type Alternatives = [Part]  -- | A single part of a multipart message.  data Part = Part -    { partType :: Text -- ^ content type +    { partType     :: Text -- ^ content type      , partEncoding :: Encoding      -- | The filename for this part, if it is to be sent with an attachemnt      -- disposition.      , partFilename :: Maybe Text -    , partHeaders :: Headers -    , partContent :: L.ByteString +    , partHeaders  :: Headers +    , partContent  :: L.ByteString      }    deriving (Eq, Show) diff --git a/server/src/Model/Category.hs b/server/src/Model/Category.hs index 6b7a488..b972ebd 100644 --- a/server/src/Model/Category.hs +++ b/server/src/Model/Category.hs @@ -1,4 +1,4 @@ -{-# LANGUAGE OverloadedStrings    #-} +{-# LANGUAGE OverloadedStrings #-}  {-# OPTIONS_GHC -fno-warn-orphans #-}  module Model.Category @@ -8,16 +8,16 @@ module Model.Category    , delete    ) where -import Data.Maybe (isJust, listToMaybe) -import Data.Text (Text) -import Data.Time.Clock (getCurrentTime) -import Database.SQLite.Simple (Only(Only), FromRow(fromRow)) +import           Data.Maybe             (isJust, listToMaybe) +import           Data.Text              (Text) +import           Data.Time.Clock        (getCurrentTime) +import           Database.SQLite.Simple (FromRow (fromRow), Only (Only))  import qualified Database.SQLite.Simple as SQLite -import Prelude hiding (id) +import           Prelude                hiding (id) -import Common.Model (Category(..), CategoryId) +import           Common.Model           (Category (..), CategoryId) -import Model.Query (Query(Query)) +import           Model.Query            (Query (Query))  instance FromRow Category where    fromRow = Category <$> diff --git a/server/src/Model/Frequency.hs b/server/src/Model/Frequency.hs index b334a40..41a325d 100644 --- a/server/src/Model/Frequency.hs +++ b/server/src/Model/Frequency.hs @@ -1,22 +1,23 @@ -{-# LANGUAGE DeriveGeneric        #-} -{-# LANGUAGE OverloadedStrings    #-} -{-# LANGUAGE TemplateHaskell      #-} +{-# LANGUAGE DeriveGeneric     #-} +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE TemplateHaskell   #-}  {-# OPTIONS_GHC -fno-warn-orphans #-}  module Model.Frequency () where -import Database.SQLite.Simple (SQLData(SQLText)) -import Database.SQLite.Simple.FromField (fieldData, FromField(fromField)) -import Database.SQLite.Simple.Ok (Ok(Ok, Errors)) -import Database.SQLite.Simple.ToField (ToField(toField)) -import qualified Data.Text as T +import qualified Data.Text                        as T +import           Database.SQLite.Simple           (SQLData (SQLText)) +import           Database.SQLite.Simple.FromField (FromField (fromField), +                                                   fieldData) +import           Database.SQLite.Simple.Ok        (Ok (Errors, Ok)) +import           Database.SQLite.Simple.ToField   (ToField (toField)) -import Common.Model (Frequency) +import           Common.Model                     (Frequency)  instance FromField Frequency where    fromField field = case fieldData field of      SQLText text -> Ok (read (T.unpack text) :: Frequency) -    _ -> Errors [error "SQLText field required for frequency"] +    _            -> Errors [error "SQLText field required for frequency"]  instance ToField Frequency where    toField frequency = SQLText . T.pack . show $ frequency diff --git a/server/src/Model/Income.hs b/server/src/Model/Income.hs index bbe7657..a69112a 100644 --- a/server/src/Model/Income.hs +++ b/server/src/Model/Income.hs @@ -9,17 +9,19 @@ module Model.Income    , modifiedDuring    ) where -import Data.Maybe (listToMaybe) -import Data.Time.Calendar (Day) -import Data.Time.Clock (UTCTime, getCurrentTime) -import Database.SQLite.Simple (Only(Only), FromRow(fromRow)) -import Prelude hiding (id) +import           Data.Maybe             (listToMaybe) +import           Data.Time.Calendar     (Day) +import           Data.Time.Clock        (UTCTime, getCurrentTime) +import           Database.SQLite.Simple (FromRow (fromRow), Only (Only))  import qualified Database.SQLite.Simple as SQLite +import           Prelude                hiding (id) -import Common.Model (Income(..), IncomeId, User(..), UserId) +import           Common.Model           (Income (..), IncomeId, User (..), +                                         UserId) -import Model.Query (Query(Query)) -import Resource (Resource, resourceCreatedAt, resourceEditedAt, resourceDeletedAt) +import           Model.Query            (Query (Query)) +import           Resource               (Resource, resourceCreatedAt, +                                         resourceDeletedAt, resourceEditedAt)  instance Resource Income where    resourceCreatedAt = _income_createdAt diff --git a/server/src/Model/Init.hs b/server/src/Model/Init.hs index 8c6a961..c030c58 100644 --- a/server/src/Model/Init.hs +++ b/server/src/Model/Init.hs @@ -4,16 +4,16 @@ module Model.Init    ( getInit    ) where -import Common.Model (Init(Init), User(..)) +import           Common.Model          (Init (Init), User (..)) -import Conf (Conf) +import           Conf                  (Conf)  import qualified Conf -import Model.Query (Query) -import qualified Model.Category as Category -import qualified Model.Income as Income -import qualified Model.Payment as Payment +import qualified Model.Category        as Category +import qualified Model.Income          as Income +import qualified Model.Payment         as Payment  import qualified Model.PaymentCategory as PaymentCategory -import qualified Model.User as User +import           Model.Query           (Query) +import qualified Model.User            as User  getInit :: User -> Conf -> Query Init  getInit user conf = diff --git a/server/src/Model/Mail.hs b/server/src/Model/Mail.hs index 9a4db73..a19f9ae 100644 --- a/server/src/Model/Mail.hs +++ b/server/src/Model/Mail.hs @@ -2,11 +2,11 @@ module Model.Mail    ( Mail(..)    ) where -import Data.Text (Text) +import           Data.Text (Text)  data Mail = Mail -  { from :: Text -  , to :: [Text] -  , subject :: Text +  { from      :: Text +  , to        :: [Text] +  , subject   :: Text    , plainBody :: Text    } deriving (Eq, Show) diff --git a/server/src/Model/Payer.hs b/server/src/Model/Payer.hs index de4abd1..db3f37c 100644 --- a/server/src/Model/Payer.hs +++ b/server/src/Model/Payer.hs @@ -2,14 +2,15 @@ module Model.Payer    ( getOrderedExceedingPayers    ) where -import Data.Map (Map) -import Data.Time (UTCTime(..), NominalDiffTime) -import qualified Data.List as List -import qualified Data.Map as Map -import qualified Data.Maybe as Maybe -import qualified Data.Time as Time +import qualified Data.List    as List +import           Data.Map     (Map) +import qualified Data.Map     as Map +import qualified Data.Maybe   as Maybe +import           Data.Time    (NominalDiffTime, UTCTime (..)) +import qualified Data.Time    as Time -import Common.Model (User(..), UserId, Income(..), IncomeId, Payment(..)) +import           Common.Model (Income (..), IncomeId, Payment (..), User (..), +                               UserId)  type Users = Map UserId User @@ -20,20 +21,20 @@ type Incomes = Map IncomeId Income  type Payments = [Payment]  data Payer = Payer -  { preIncomePaymentSum :: Int +  { preIncomePaymentSum  :: Int    , postIncomePaymentSum :: Int -  , _incomes :: [Income] +  , _incomes             :: [Income]    }  data PostPaymentPayer = PostPaymentPayer    { _preIncomePaymentSum :: Int -  , _cumulativeIncome :: Int -  , ratio :: Float +  , _cumulativeIncome    :: Int +  , ratio                :: Float    }  data ExceedingPayer = ExceedingPayer    { _userId :: UserId -  , amount :: Int +  , amount  :: Int    } deriving (Show)  getOrderedExceedingPayers :: UTCTime -> [User] -> [Income] -> Payments -> [ExceedingPayer] @@ -72,7 +73,7 @@ useIncomesFrom users incomes payments =        mbIncomeTime = incomeDefinedForAll (Map.keys users) incomes    in  case (firstPaymentTime, mbIncomeTime) of          (Just t1, Just t2) -> Just (max t1 t2) -        _ -> Nothing +        _                  -> Nothing  paymentTime :: Payment -> UTCTime  paymentTime = flip UTCTime (Time.secondsToDiffTime 0) . _payment_date @@ -95,7 +96,7 @@ getPayers currentTime users incomes payments =                        (\p ->                          case incomesDefined of                            Nothing -> False -                          Just t -> paymentTime p >= t +                          Just t  -> paymentTime p >= t                        )                        userId                        payments @@ -197,7 +198,7 @@ nominalDay :: NominalDiffTime  nominalDay = 86400  safeHead :: [a] -> Maybe a -safeHead [] = Nothing +safeHead []      = Nothing  safeHead (x : _) = Just x  safeMinimum :: (Ord a) => [a] -> Maybe a diff --git a/server/src/Model/Payment.hs b/server/src/Model/Payment.hs index 14efe77..c1b109f 100644 --- a/server/src/Model/Payment.hs +++ b/server/src/Model/Payment.hs @@ -1,4 +1,4 @@ -{-# LANGUAGE OverloadedStrings    #-} +{-# LANGUAGE OverloadedStrings #-}  {-# OPTIONS_GHC -fno-warn-orphans #-}  module Model.Payment @@ -13,22 +13,26 @@ module Model.Payment    , modifiedDuring    ) where -import Data.Maybe (listToMaybe) -import Data.Text (Text) -import qualified Data.Text as T -import Data.Time (UTCTime) -import Data.Time.Calendar (Day) -import Data.Time.Clock (getCurrentTime) -import Database.SQLite.Simple (Only(Only), FromRow(fromRow), ToRow) -import Database.SQLite.Simple.ToField (ToField(toField)) -import Prelude hiding (id) -import qualified Database.SQLite.Simple as SQLite +import           Data.Maybe                     (listToMaybe) +import           Data.Text                      (Text) +import qualified Data.Text                      as T +import           Data.Time                      (UTCTime) +import           Data.Time.Calendar             (Day) +import           Data.Time.Clock                (getCurrentTime) +import           Database.SQLite.Simple         (FromRow (fromRow), Only (Only), +                                                 ToRow) +import qualified Database.SQLite.Simple         as SQLite +import           Database.SQLite.Simple.ToField (ToField (toField)) +import           Prelude                        hiding (id) -import Common.Model (Frequency(..), Payment(..), PaymentId, UserId) +import           Common.Model                   (Frequency (..), Payment (..), +                                                 PaymentId, UserId) -import Model.Frequency () -import Model.Query (Query(Query)) -import Resource (Resource, resourceCreatedAt, resourceEditedAt, resourceDeletedAt) +import           Model.Frequency                () +import           Model.Query                    (Query (Query)) +import           Resource                       (Resource, resourceCreatedAt, +                                                 resourceDeletedAt, +                                                 resourceEditedAt)  instance Resource Payment where    resourceCreatedAt = _payment_createdAt diff --git a/server/src/Model/PaymentCategory.hs b/server/src/Model/PaymentCategory.hs index 6e1d304..6d02136 100644 --- a/server/src/Model/PaymentCategory.hs +++ b/server/src/Model/PaymentCategory.hs @@ -1,4 +1,4 @@ -{-# LANGUAGE OverloadedStrings    #-} +{-# LANGUAGE OverloadedStrings #-}  {-# OPTIONS_GHC -fno-warn-orphans #-}  module Model.PaymentCategory @@ -7,17 +7,17 @@ module Model.PaymentCategory    , save    ) where -import Data.Maybe (isJust, listToMaybe) -import Data.Text (Text) -import Data.Time.Clock (getCurrentTime) -import Database.SQLite.Simple (Only(Only), FromRow(fromRow)) -import qualified Data.Text as T +import           Data.Maybe             (isJust, listToMaybe) +import           Data.Text              (Text) +import qualified Data.Text              as T +import           Data.Time.Clock        (getCurrentTime) +import           Database.SQLite.Simple (FromRow (fromRow), Only (Only))  import qualified Database.SQLite.Simple as SQLite -import Common.Model (CategoryId, PaymentCategory(..)) -import qualified Common.Util.Text as T +import           Common.Model           (CategoryId, PaymentCategory (..)) +import qualified Common.Util.Text       as T -import Model.Query (Query(Query)) +import           Model.Query            (Query (Query))  instance FromRow PaymentCategory where    fromRow = PaymentCategory <$> diff --git a/server/src/Model/Query.hs b/server/src/Model/Query.hs index d15fb5f..22ae95b 100644 --- a/server/src/Model/Query.hs +++ b/server/src/Model/Query.hs @@ -3,8 +3,8 @@ module Model.Query    , run    ) where -import Data.Functor (Functor) -import Database.SQLite.Simple (Connection) +import           Data.Functor           (Functor) +import           Database.SQLite.Simple (Connection)  import qualified Database.SQLite.Simple as SQLite  data Query a = Query (Connection -> IO a) diff --git a/server/src/Model/SignIn.hs b/server/src/Model/SignIn.hs index c5182f0..6f38fe7 100644 --- a/server/src/Model/SignIn.hs +++ b/server/src/Model/SignIn.hs @@ -8,25 +8,25 @@ module Model.SignIn    , isLastTokenValid    ) where -import Data.Int (Int64) -import Data.Maybe (listToMaybe) -import Data.Text (Text) -import Data.Time.Clock (getCurrentTime) -import Data.Time.Clock (UTCTime) -import Database.SQLite.Simple (Only(Only), FromRow(fromRow)) +import           Data.Int               (Int64) +import           Data.Maybe             (listToMaybe) +import           Data.Text              (Text) +import           Data.Time.Clock        (getCurrentTime) +import           Data.Time.Clock        (UTCTime) +import           Database.SQLite.Simple (FromRow (fromRow), Only (Only))  import qualified Database.SQLite.Simple as SQLite -import Model.Query (Query(Query)) -import Model.UUID (generateUUID) +import           Model.Query            (Query (Query)) +import           Model.UUID             (generateUUID)  type SignInId = Int64  data SignIn = SignIn -  { id :: SignInId -  , token :: Text +  { id       :: SignInId +  , token    :: Text    , creation :: UTCTime -  , email :: Text -  , isUsed :: Bool +  , email    :: Text +  , isUsed   :: Bool    } deriving Show  instance FromRow SignIn where diff --git a/server/src/Model/UUID.hs b/server/src/Model/UUID.hs index 6cb7ce0..0959a8e 100644 --- a/server/src/Model/UUID.hs +++ b/server/src/Model/UUID.hs @@ -2,9 +2,9 @@ module Model.UUID    ( generateUUID    ) where -import Data.UUID (toString) -import Data.UUID.V4 (nextRandom) -import Data.Text (Text, pack) +import           Data.Text    (Text, pack) +import           Data.UUID    (toString) +import           Data.UUID.V4 (nextRandom)  generateUUID :: IO Text  generateUUID = pack . toString <$> nextRandom diff --git a/server/src/Model/User.hs b/server/src/Model/User.hs index e14fcef..f17f545 100644 --- a/server/src/Model/User.hs +++ b/server/src/Model/User.hs @@ -1,4 +1,4 @@ -{-# LANGUAGE OverloadedStrings    #-} +{-# LANGUAGE OverloadedStrings #-}  {-# OPTIONS_GHC -fno-warn-orphans #-}  module Model.User @@ -8,16 +8,16 @@ module Model.User    , delete    ) where -import Data.Maybe (listToMaybe) -import Data.Text (Text) -import Data.Time.Clock (getCurrentTime) -import Database.SQLite.Simple (Only(Only), FromRow(fromRow)) -import Prelude hiding (id) +import           Data.Maybe             (listToMaybe) +import           Data.Text              (Text) +import           Data.Time.Clock        (getCurrentTime) +import           Database.SQLite.Simple (FromRow (fromRow), Only (Only))  import qualified Database.SQLite.Simple as SQLite +import           Prelude                hiding (id) -import Common.Model (UserId, User(..)) +import           Common.Model           (User (..), UserId) -import Model.Query (Query(Query)) +import           Model.Query            (Query (Query))  instance FromRow User where    fromRow = User <$> SQLite.field <*> SQLite.field <*> SQLite.field <*> SQLite.field diff --git a/server/src/Resource.hs b/server/src/Resource.hs index f52bbfa..a12a0f2 100644 --- a/server/src/Resource.hs +++ b/server/src/Resource.hs @@ -9,10 +9,10 @@ module Resource    , statusDuring    ) where -import Data.Maybe (fromMaybe) -import Data.Map (Map) -import qualified Data.Map as M -import Data.Time.Clock (UTCTime) +import           Data.Map        (Map) +import qualified Data.Map        as M +import           Data.Maybe      (fromMaybe) +import           Data.Time.Clock (UTCTime)  class Resource a where    resourceCreatedAt :: a -> UTCTime @@ -34,7 +34,7 @@ groupByStatus start end resources =      (\m resource ->        case statusDuring start end resource of          Just status -> M.insertWith (++) status [resource] m -        Nothing -> m +        Nothing     -> m      )      M.empty      resources diff --git a/server/src/Secure.hs b/server/src/Secure.hs index f427304..88bdcda 100644 --- a/server/src/Secure.hs +++ b/server/src/Secure.hs @@ -5,21 +5,21 @@ module Secure    , getUserFromToken    ) where -import Control.Monad.IO.Class (liftIO) -import Data.Text (Text) -import Data.Text.Lazy (fromStrict) -import Network.HTTP.Types.Status (forbidden403) -import Web.Scotty +import           Control.Monad.IO.Class    (liftIO) +import           Data.Text                 (Text) +import           Data.Text.Lazy            (fromStrict) +import           Network.HTTP.Types.Status (forbidden403) +import           Web.Scotty -import qualified Common.Message as Message -import qualified Common.Message.Key as Key -import Common.Model (User) +import qualified Common.Message            as Message +import qualified Common.Message.Key        as Key +import           Common.Model              (User) -import Model.Query (Query)  import qualified LoginSession -import qualified Model.Query as Query -import qualified Model.SignIn as SignIn -import qualified Model.User as User +import           Model.Query               (Query) +import qualified Model.Query               as Query +import qualified Model.SignIn              as SignIn +import qualified Model.User                as User  loggedAction :: (User -> ActionM ()) -> ActionM ()  loggedAction action = do diff --git a/server/src/SendMail.hs b/server/src/SendMail.hs index f7ba3fd..959f21d 100644 --- a/server/src/SendMail.hs +++ b/server/src/SendMail.hs @@ -4,17 +4,17 @@ module SendMail    ( sendMail    ) where -import Control.Arrow (left) -import Control.Exception (SomeException, try) -import Data.Either (isLeft) +import           Control.Arrow          (left) +import           Control.Exception      (SomeException, try) +import           Data.Either            (isLeft) -import Data.Text (Text) -import Data.Text.Lazy.Builder (toLazyText, fromText) -import qualified Data.Text as T -import qualified Data.Text.Lazy as LT -import qualified MimeMail as M +import           Data.Text              (Text) +import qualified Data.Text              as T +import qualified Data.Text.Lazy         as LT +import           Data.Text.Lazy.Builder (fromText, toLazyText) +import qualified MimeMail               as M -import Model.Mail (Mail(Mail)) +import           Model.Mail             (Mail (Mail))  sendMail :: Mail -> IO (Either Text ())  sendMail mail = do diff --git a/server/src/Utils/Time.hs b/server/src/Utils/Time.hs index 97457c7..e1a94d3 100644 --- a/server/src/Utils/Time.hs +++ b/server/src/Utils/Time.hs @@ -4,10 +4,10 @@ module Utils.Time    , timeToDay    ) where -import Data.Time.Clock (UTCTime, getCurrentTime) -import Data.Time.LocalTime -import Data.Time.Calendar -import Data.Time.Calendar.WeekDate (toWeekDate) +import           Data.Time.Calendar +import           Data.Time.Calendar.WeekDate (toWeekDate) +import           Data.Time.Clock             (UTCTime, getCurrentTime) +import           Data.Time.LocalTime  belongToCurrentMonth :: UTCTime -> IO Bool  belongToCurrentMonth time = do diff --git a/server/src/Validation.hs b/server/src/Validation.hs index 1f332c9..fd739cd 100644 --- a/server/src/Validation.hs +++ b/server/src/Validation.hs @@ -3,7 +3,7 @@ module Validation    , number    ) where -import Data.Text (Text) +import           Data.Text (Text)  import qualified Data.Text as T  nonEmpty :: Text -> Maybe Text diff --git a/server/src/View/Mail/SignIn.hs b/server/src/View/Mail/SignIn.hs index 1daca1e..d542fd8 100644 --- a/server/src/View/Mail/SignIn.hs +++ b/server/src/View/Mail/SignIn.hs @@ -4,15 +4,15 @@ module View.Mail.SignIn    ( mail    ) where -import Data.Text (Text) +import           Data.Text          (Text) -import qualified Common.Message as Message +import qualified Common.Message     as Message  import qualified Common.Message.Key as Key -import Common.Model (User(..)) +import           Common.Model       (User (..)) -import Conf (Conf) -import qualified Conf as Conf -import qualified Model.Mail as M +import           Conf               (Conf) +import qualified Conf               as Conf +import qualified Model.Mail         as M  mail :: Conf -> User -> Text -> [Text] -> M.Mail  mail conf user url to = diff --git a/server/src/View/Mail/WeeklyReport.hs b/server/src/View/Mail/WeeklyReport.hs index b5f2b67..c0e89d5 100644 --- a/server/src/View/Mail/WeeklyReport.hs +++ b/server/src/View/Mail/WeeklyReport.hs @@ -4,28 +4,29 @@ module View.Mail.WeeklyReport    ( mail    ) where -import Data.List (sortOn) -import Data.Map (Map) -import Data.Maybe (catMaybes, fromMaybe) -import Data.Monoid ((<>)) -import Data.Text (Text) -import Data.Time.Clock (UTCTime) -import qualified Data.Map as M -import qualified Data.Text as T +import           Data.List          (sortOn) +import           Data.Map           (Map) +import qualified Data.Map           as M +import           Data.Maybe         (catMaybes, fromMaybe) +import           Data.Monoid        ((<>)) +import           Data.Text          (Text) +import qualified Data.Text          as T +import           Data.Time.Clock    (UTCTime) -import qualified Common.Message as Message +import qualified Common.Message     as Message  import qualified Common.Message.Key as Key -import Common.Model (Payment(..), User(..), UserId, Income(..)) -import qualified Common.Model as CM +import           Common.Model       (Income (..), Payment (..), User (..), +                                     UserId) +import qualified Common.Model       as CM  import qualified Common.View.Format as Format -import Model.Mail (Mail(Mail)) -import Model.Payment () -import qualified Model.Income () -import qualified Model.Mail as M -import Resource (Status(..), groupByStatus, statuses) -import Conf (Conf) -import qualified Conf as Conf +import           Conf               (Conf) +import qualified Conf               as Conf +import qualified Model.Income       () +import           Model.Mail         (Mail (Mail)) +import qualified Model.Mail         as M +import           Model.Payment      () +import           Resource           (Status (..), groupByStatus, statuses)  mail :: Conf -> [User] -> [Payment] -> [Income] -> UTCTime -> UTCTime -> Mail  mail conf users payments incomes start end = @@ -65,7 +66,7 @@ payedFor :: Status -> Conf -> [User] -> Payment -> Text  payedFor status conf users payment =    case status of      Deleted -> Message.get (Key.WeeklyReport_PayedForNot name amount for at) -    _ -> Message.get (Key.WeeklyReport_PayedFor name amount for at) +    _       -> Message.get (Key.WeeklyReport_PayedFor name amount for at)    where name = formatUserName (_payment_user payment) users          amount = Format.price (Conf.currency conf) . _payment_cost $ payment          for = _payment_name payment @@ -85,7 +86,7 @@ isPayedFrom :: Status -> Conf -> [User] -> Income -> Text  isPayedFrom status conf users income =    case status of      Deleted -> Message.get (Key.WeeklyReport_PayedFromNot name amount for) -    _ -> Message.get (Key.WeeklyReport_PayedFrom name amount for) +    _       -> Message.get (Key.WeeklyReport_PayedFrom name amount for)    where name = formatUserName (_income_userId income) users          amount = Format.price (Conf.currency conf) . _income_amount $ income          for = Format.longDay $ _income_date income diff --git a/server/src/View/Page.hs b/server/src/View/Page.hs index 6bf9527..ff7bdc7 100644 --- a/server/src/View/Page.hs +++ b/server/src/View/Page.hs @@ -4,23 +4,23 @@ module View.Page    ( page    ) where -import Data.Text.Internal.Lazy (Text) -import Data.Text.Lazy.Encoding (decodeUtf8) -import Data.Aeson (encode) -import qualified Data.Aeson.Types as Json +import           Data.Aeson                    (encode) +import qualified Data.Aeson.Types              as Json +import           Data.Text.Internal.Lazy       (Text) +import           Data.Text.Lazy.Encoding       (decodeUtf8) -import Text.Blaze.Html -import Text.Blaze.Html5 -import qualified Text.Blaze.Html5 as H -import Text.Blaze.Html5.Attributes -import qualified Text.Blaze.Html5.Attributes as A -import Text.Blaze.Html.Renderer.Text (renderHtml) +import           Text.Blaze.Html +import           Text.Blaze.Html.Renderer.Text (renderHtml) +import           Text.Blaze.Html5 +import qualified Text.Blaze.Html5              as H +import           Text.Blaze.Html5.Attributes +import qualified Text.Blaze.Html5.Attributes   as A -import qualified Common.Message as Message -import qualified Common.Message.Key as Key -import Common.Model (InitResult) +import qualified Common.Message                as Message +import qualified Common.Message.Key            as Key +import           Common.Model                  (InitResult) -import Design.Global (globalDesign) +import           Design.Global                 (globalDesign)  page :: InitResult -> Text  page initResult = | 
