aboutsummaryrefslogtreecommitdiff
path: root/src/server/Model/Income.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/Model/Income.hs')
-rw-r--r--src/server/Model/Income.hs148
1 files changed, 93 insertions, 55 deletions
diff --git a/src/server/Model/Income.hs b/src/server/Model/Income.hs
index ff6accd..c6cdb55 100644
--- a/src/server/Model/Income.hs
+++ b/src/server/Model/Income.hs
@@ -1,73 +1,111 @@
+{-# LANGUAGE OverloadedStrings #-}
+
module Model.Income
- ( list
+ ( IncomeId
+ , Income(..)
+ , list
, create
, editOwn
, deleteOwn
, modifiedDuring
) where
-import Data.Time.Clock (UTCTime, getCurrentTime)
+import Data.Int (Int64)
+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 qualified Database.SQLite.Simple as SQLite
+
+import Model.Query (Query(Query))
+import Model.User (User, UserId)
+import qualified Model.User as User
+import Resource (Resource, resourceCreatedAt, resourceEditedAt, resourceDeletedAt)
-import Control.Monad.IO.Class (liftIO)
+type IncomeId = Int64
-import Database.Persist
+data Income = Income
+ { id :: IncomeId
+ , userId :: UserId
+ , date :: Day
+ , amount :: Int
+ , createdAt :: UTCTime
+ , editedAt :: Maybe UTCTime
+ , deletedAt :: Maybe UTCTime
+ } deriving Show
-import Model.Database
-import qualified Model.Json.Income as Json
+instance Resource Income where
+ resourceCreatedAt = createdAt
+ resourceEditedAt = editedAt
+ resourceDeletedAt = deletedAt
-list :: Persist [Json.Income]
-list = map getJsonIncome <$> selectList [IncomeDeletedAt ==. Nothing] []
+instance FromRow Income where
+ fromRow = Income <$>
+ SQLite.field <*>
+ SQLite.field <*>
+ SQLite.field <*>
+ SQLite.field <*>
+ SQLite.field <*>
+ SQLite.field <*>
+ SQLite.field
-getJsonIncome :: Entity Income -> Json.Income
-getJsonIncome incomeEntity =
- Json.Income (entityKey incomeEntity) (incomeUserId income) (incomeDate income) (incomeAmount income)
- where income = entityVal incomeEntity
+list :: Query [Income]
+list = Query (\conn -> SQLite.query_ conn "SELECT * FROM income WHERE deleted_at IS NULL")
-create :: UserId -> Day -> Int -> Persist IncomeId
-create userId date amount = do
- now <- liftIO getCurrentTime
- insert (Income userId date amount now Nothing Nothing)
+create :: UserId -> Day -> Int -> Query IncomeId
+create incomeUserId incomeDate incomeAmount =
+ Query (\conn -> do
+ now <- getCurrentTime
+ SQLite.execute
+ conn
+ "INSERT INTO income (user_id, date, amount, created_at) VALUES (?, ?, ?, ?)"
+ (incomeUserId, incomeDate, incomeAmount, now)
+ SQLite.lastInsertRowId conn
+ )
-editOwn :: UserId -> IncomeId -> Day -> Int -> Persist Bool
-editOwn userId incomeId date amount = do
- mbIncome <- get incomeId
- case mbIncome of
- Just income ->
- if incomeUserId income == userId
- then do
- now <- liftIO getCurrentTime
- update incomeId
- [ IncomeEditedAt =. Just now
- , IncomeDate =. date
- , IncomeAmount =. amount
- ]
- return True
- else
- return False
- Nothing ->
- return False
+editOwn :: UserId -> IncomeId -> Day -> Int -> Query Bool
+editOwn incomeUserId incomeId incomeDate incomeAmount =
+ Query (\conn -> do
+ mbIncome <- listToMaybe <$> SQLite.query conn "SELECT * FROM income WHERE id = ?" (Only incomeId)
+ case mbIncome of
+ Just income ->
+ if userId income == incomeUserId
+ then do
+ now <- getCurrentTime
+ SQLite.execute
+ conn
+ "UPDATE income SET edited_at = ?, date = ?, amount = ? WHERE id = ?"
+ (now, incomeDate, incomeAmount, incomeId)
+ return True
+ else
+ return False
+ Nothing ->
+ return False
+ )
-deleteOwn :: Entity User -> IncomeId -> Persist Bool
-deleteOwn user incomeId = do
- mbIncome <- get incomeId
- case mbIncome of
- Just income ->
- if incomeUserId income == entityKey user
- then do
- now <- liftIO getCurrentTime
- update incomeId [IncomeDeletedAt =. Just now]
- return True
- else
- return False
- Nothing ->
- return False
+deleteOwn :: User -> IncomeId -> Query Bool
+deleteOwn user incomeId =
+ Query (\conn -> do
+ mbIncome <- listToMaybe <$> SQLite.query conn "SELECT * FROM income WHERE id = ?" (Only incomeId)
+ case mbIncome of
+ Just income ->
+ if userId income == User.id user
+ then do
+ now <- getCurrentTime
+ SQLite.execute conn "UPDATE income SET deleted_at = ? WHERE id = ?" (now, incomeId)
+ return True
+ else
+ return False
+ Nothing ->
+ return False
+ )
-modifiedDuring :: UTCTime -> UTCTime -> Persist [Income]
+modifiedDuring :: UTCTime -> UTCTime -> Query [Income]
modifiedDuring start end =
- map entityVal <$> selectList
- ( [IncomeCreatedAt >=. start, IncomeCreatedAt <. end]
- ||. [IncomeEditedAt >=. Just start, IncomeEditedAt <. Just end]
- ||. [IncomeDeletedAt >=. Just start, IncomeDeletedAt <. Just end]
- )
- []
+ Query (\conn ->
+ SQLite.query
+ conn
+ "SELECT * FROM income WHERE (created_at >= ? AND created_at <= ?) OR (edited_at >= ? AND edited_at <= ?) OR (deleted_at >= ? AND deleted_at <= ?)"
+ (start, end, start, end, start, end)
+ )