1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
{-# LANGUAGE OverloadedStrings #-}
module Model.Category
( CategoryId
, Category(..)
, list
, create
, edit
, delete
) where
import Data.Int (Int64)
import Data.Maybe (isJust, listToMaybe)
import Data.Text (Text)
import Data.Time (UTCTime)
import Data.Time.Clock (getCurrentTime)
import Database.SQLite.Simple (Only(Only), FromRow(fromRow))
import qualified Database.SQLite.Simple as SQLite
import Model.Query (Query(Query))
type CategoryId = Int64
data Category = Category
{ id :: CategoryId
, name :: Text
, color :: Text
, createdAt :: UTCTime
, editedAt :: Maybe UTCTime
, deletedAt :: Maybe UTCTime
} deriving Show
instance FromRow Category where
fromRow = Category <$>
SQLite.field <*>
SQLite.field <*>
SQLite.field <*>
SQLite.field <*>
SQLite.field <*>
SQLite.field
list :: Query [Category]
list =
Query (\conn ->
SQLite.query_ conn "SELECT * FROM category WHERE deleted_at IS NULL"
)
create :: Text -> Text -> Query CategoryId
create categoryName categoryColor =
Query (\conn -> do
now <- getCurrentTime
SQLite.execute
conn
"INSERT INTO category (name, color, created_at) VALUES (?, ?, ?)"
(categoryName, categoryColor, now)
SQLite.lastInsertRowId conn
)
edit :: CategoryId -> Text -> Text -> Query Bool
edit categoryId categoryName categoryColor =
Query (\conn -> do
mbCategory <- listToMaybe <$>
(SQLite.query conn "SELECT * FROM category WHERE id = ?" (Only categoryId) :: IO [Category])
if isJust mbCategory
then do
now <- getCurrentTime
SQLite.execute
conn
"UPDATE category SET edited_at = ?, name = ?, color = ? WHERE id = ?"
(now, categoryName, categoryColor, categoryId)
return True
else
return False
)
delete :: CategoryId -> Query Bool
delete categoryId =
Query (\conn -> do
mbCategory <- listToMaybe <$>
(SQLite.query conn "SELECT * FROM category WHERE id = ?" (Only categoryId) :: IO [Category])
if isJust mbCategory
then do
now <- getCurrentTime
SQLite.execute
conn
"UPDATE category SET deleted_at = ? WHERE id = ?" (now, categoryId)
return True
else
return False
)
|