Skip to content

Commit e151aed

Browse files
committed
fixed some database calls to be more generic
1 parent 8ab9e51 commit e151aed

File tree

7 files changed

+54
-87
lines changed

7 files changed

+54
-87
lines changed

app/Api/Api.hs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
module Api.Api where
44

5-
import Database.Database (getGuestbook, getVisits, runDb, uuidExists, validateToken, AdminTable (getData))
5+
import Database.Database (runDb, AdminTable (getData), toList, validateToken)
66
import Pages.Projects.Brainfuck (code)
77
import qualified Tables as T (Credentials (Credentials, EmptyCredentials), GuestbookEntry (EmptyGuestbook, GuestbookEntry), LeaderboardEntry (EmptyLeaderboard, LeaderboardEntry))
88
import Utils (getDefault, unpackBS)
@@ -23,8 +23,8 @@ import Data.ByteString.Lazy (fromStrict, toStrict)
2323
import Data.Password.Bcrypt (PasswordCheck (PasswordCheckFail, PasswordCheckSuccess), PasswordHash (PasswordHash), checkPassword, mkPassword)
2424
import Data.Text (intercalate, pack, unpack, Text)
2525
import Data.Text.Array (Array (ByteArray))
26-
import Database.Persist (Entity (Entity), Filter (Filter), FilterValue (FilterValue), PersistFilter (BackendSpecificFilter), insertEntity, selectList, PersistQueryWrite (deleteWhere), (==.))
27-
import Database.Schema (EntityField (TokenName, UserName, UserIndex, VisitIndex, GuestbookEntryIndex, SnakeIndex, TokenIndex), GuestbookEntry (GuestbookEntry, guestbookEntryContent, guestbookEntryName, guestbookEntryParentId, guestbookEntryIndex, guestbookEntryTimestamp), Snake (Snake), Token (Token, tokenToken), User (User, userName, userPassword), Visit (Visit))
26+
import Database.Persist (Entity (Entity), Filter (Filter), FilterValue (FilterValue), PersistFilter (BackendSpecificFilter), insertEntity, selectList, PersistQueryWrite (deleteWhere), (==.), (=.))
27+
import Database.Schema (EntityField (TokenName, UserName, UserIndex, VisitIndex, GuestbookEntryIndex, SnakeIndex, TokenIndex, VisitUuid, TokenToken), GuestbookEntry (GuestbookEntry, guestbookEntryContent, guestbookEntryName, guestbookEntryParentId, guestbookEntryIndex, guestbookEntryTimestamp), Snake (Snake), Token (Token, tokenToken), User (User, userName, userPassword), Visit (Visit))
2828
import Logger (info)
2929
import Text.StringRandom (stringRandomIO)
3030

@@ -63,7 +63,7 @@ apiMap = [
6363
("POST", [
6464
("^/visits/new(/|)$", \r -> do
6565
body <- getRequestBodyChunk r
66-
result <- uuidExists $ unpackBS body
66+
result <- null <$> getData [VisitUuid ==. unpackBS body] []
6767
res <- if result then do
6868
time <- fmap round getPOSIXTime :: IO Int
6969
uuid <- nextRandom
@@ -79,7 +79,7 @@ apiMap = [
7979
case credentials of
8080
(T.Credentials username password) -> do
8181
let pass = mkPassword $ pack password
82-
rows <- getData [UserName ==. username]
82+
rows <- getData [UserName ==. username] []
8383
case rows of
8484
[user] -> case checkPassword pass (PasswordHash $ pack (userPassword user)) of
8585
PasswordCheckSuccess -> do
@@ -117,12 +117,13 @@ apiMap = [
117117
return (status200, j2s [aesonQQ|#{apiData}|], jsonHeaders)
118118
),
119119
("^/visits/get(/|)$", \_ -> do
120-
visits <- show . length <$> getVisits
120+
visits <- show . length <$> (getData [] [] :: IO [Visit])
121121
return (status200, j2s [aesonQQ|{"visits":#{visits}}|], jsonHeaders)
122122
),
123123
("^/guestbook/get(/|)$", \_ -> do
124-
entries <- getGuestbook
125-
return (status200, j2s [aesonQQ|{"entries":#{unpackBS $ toStrict $ encode $ show entries}}|], jsonHeaders)
124+
entries <- getData [] [] :: IO [GuestbookEntry]
125+
let l = map toList entries
126+
return (status200, j2s [aesonQQ|{"entries":#{l}}|], jsonHeaders)
126127
),
127128
("^/editor/sidebar(/|)$", \_ -> do
128129
editor_root <- getEditorRoot

app/Index.hs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@ import IHP.HSX.QQ (hsx)
44
import Text.Blaze.Html (Html)
55

66
import CodeBlock (hsxIntroCodeBlock, introCodeIndex)
7-
import Database.Database (getVisits, AdminTable (getData))
7+
import Database.Database (AdminTable (getData))
88
import Layout (layout)
99
import Page (Page, PageSetting (Description, EmbedImage, EmbedText, Route))
1010
import Section (section)
1111
import Database.Schema (EntityField(VisitTimestamp), Visit (Visit, visitTimestamp))
12-
import Database.Persist ((>.))
12+
import Database.Persist ((>.), SelectOpt (LimitTo, Asc, Desc))
1313

1414
intro :: Html
1515
intro = section [hsx|
@@ -42,9 +42,10 @@ intro = section [hsx|
4242

4343
page :: IO Html
4444
page = do
45-
visits <- show . length <$> getVisits
46-
lastVisit <- foldr max 0 <$> fmap (map visitTimestamp) (getData [] :: IO [Visit])
47-
visitsToday <- show . length <$> getData [VisitTimestamp >. lastVisit-(24*60*60)]
45+
visits <- show . length <$> (getData [] [] :: IO [Visit])
46+
lastVisit <- visitTimestamp . head <$> getData [] [Desc VisitTimestamp, LimitTo 1]
47+
print lastVisit
48+
visitsToday <- show . length <$> getData [VisitTimestamp >. lastVisit-(24*60*60)] []
4849
return [hsx|
4950
<h1>Skademaskinen</h1>
5051
<img src="/static/icon.png" style="border-radius:50%">

app/Pages/Admin/Admin.hs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ module Pages.Admin.Admin where
22

33
import CodeBlock (codeBlock)
44
import Data.Text (Text, unpack, pack)
5-
import Database.Database (getGuestbookEntries, getLeaderboard, getTokens, getUsers, getVisits, prettyPrintSchema, tokenToUsername, validateToken, runDb, AdminTable (button, toList, getData))
5+
import Database.Database (prettyPrintSchema, validateToken, runDb, AdminTable (button, toList, getData))
66
import Database.Schema (GuestbookEntry (GuestbookEntry, guestbookEntryIndex), Snake (Snake, snakeIndex), Token (Token, tokenIndex), User (User, userIndex), Visit (Visit, visitIndex), defs, EntityField (UserName, TokenToken))
77
import IHP.HSX.QQ (hsx)
88
import Layout (layout)
@@ -16,11 +16,11 @@ import Logger (warning)
1616

1717
panel :: IO Html
1818
panel = do
19-
visits <- getData [] :: IO [Visit]
20-
guestbook <- getData [] :: IO [GuestbookEntry]
21-
snake <- getData [] :: IO [Snake]
22-
users <- getData [] :: IO [User]
23-
valid_tokens <- getData [] :: IO [Token]
19+
visits <- getData [] [] :: IO [Visit]
20+
guestbook <- getData [] [] :: IO [GuestbookEntry]
21+
snake <- getData [] [] :: IO [Snake]
22+
users <- getData [] [] :: IO [User]
23+
valid_tokens <- getData [] [] :: IO [Token]
2424
return [hsx|
2525
Here are actions when logged in
2626
<br>
@@ -89,23 +89,23 @@ browse table = do
8989
where
9090
getTableData :: String -> IO [([String], Html)]
9191
getTableData "visits" = do
92-
tableData <- getData [] :: IO [Visit]
92+
tableData <- getData [] []:: IO [Visit]
9393
let columnNames = getColumnNames "visits"
9494
return $ zip (map toList tableData) (map button tableData)
9595
getTableData "guestbook" = do
96-
tableData <- getData [] :: IO [GuestbookEntry]
96+
tableData <- getData [] [] :: IO [GuestbookEntry]
9797
let columnNames = getColumnNames "guestbook"
9898
return $ zip (map toList tableData) (map button tableData)
9999
getTableData "snake" = do
100-
tableData <- getData [] :: IO [Snake]
100+
tableData <- getData [] [] :: IO [Snake]
101101
let columnNames = getColumnNames "snake"
102102
return $ zip (map toList tableData) (map button tableData)
103103
getTableData "users" = do
104-
tableData <- getData [] :: IO [User]
104+
tableData <- getData [] [] :: IO [User]
105105
let columnNames = getColumnNames "users"
106106
return $ zip (map toList tableData) (map button tableData)
107107
getTableData "valid_tokens" = do
108-
tableData <- getData [] :: IO [Token]
108+
tableData <- getData [] [] :: IO [Token]
109109
let columnNames = getColumnNames "valid_tokens"
110110
return $ zip (map toList tableData) (map button tableData)
111111
getTableData _ = do

app/Pages/Guestbook/Guestbook.hs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ module Pages.Guestbook.Guestbook where
33
import IHP.HSX.QQ (hsx)
44
import Text.Blaze.Html (Html)
55

6-
import Database.Database (getGuestbook)
76
import Section (section)
87

98
import Data.List (filter)
@@ -14,6 +13,7 @@ import Database.Schema (GuestbookEntry (GuestbookEntry))
1413
import Layout (layout)
1514
import Page (Page, PageSetting (Description, Route))
1615
import Tree (Tree (Tree))
16+
import Database.Database (AdminTable(getData))
1717

1818
type Guestbook = [(Int, Int, String, String, Int)]
1919

@@ -60,6 +60,16 @@ guestbookInput parent True = [hsx|
6060
</div>
6161
|]
6262

63+
guestbookToTree :: [GuestbookEntry] -> Int -> [Tree GuestbookEntry]
64+
guestbookToTree entries targetParent = [Tree (GuestbookEntry id timestamp name content parent) $ guestbookToTree entries id | (GuestbookEntry id timestamp name content parent) <- entries, parent == targetParent]
65+
66+
getGuestbook :: IO [Tree GuestbookEntry]
67+
getGuestbook = do
68+
entries <- getData [] [] :: IO [GuestbookEntry]
69+
return $ guestbookToTree entries (-1)
70+
71+
72+
page :: IO Html
6373
page = do
6474
guestbook <- getGuestbook
6575
return [hsx|

app/Pages/Projects/Snake.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ module Pages.Projects.Snake where
33
import IHP.HSX.QQ (hsx)
44
import Text.Blaze.Html (Html)
55

6-
import Database.Database (getLeaderboard)
76
import Database.Schema (Snake (Snake))
87
import Layout (layout)
98
import Page (Page, PageSetting (Description, Route))
109
import Utils (forEach)
10+
import Database.Database (AdminTable(getData))
1111

1212
tile :: Int -> Html
1313
tile id = [hsx|
@@ -98,7 +98,7 @@ leaderboardEntry (Snake id timestamp name score speed fruits) = [hsx|
9898

9999
page :: IO Html
100100
page = do
101-
l <- getLeaderboard
101+
l <- getData [] [] :: IO [Snake]
102102
return [hsx|
103103
<table class="common-table">
104104
<tr>

lib/Database/Database.hs

Lines changed: 10 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ import Settings (getDatabaseName, getDatabaseUser)
88
import Control.Monad.Logger (NoLoggingT (runNoLoggingT))
99
import Data.List (inits, intercalate)
1010
import Data.Text (Text, pack, unpack)
11-
import Database.Persist.MySQL (ConnectInfo (ConnectInfo, connectDatabase, connectUser), Entity (Entity), EntityNameDB (unEntityNameDB), FieldDef (FieldDef), FieldNameHS (unFieldNameHS), Filter (Filter), FilterValue (FilterValue), PersistFilter (BackendSpecificFilter), PersistStoreWrite (insert_), SqlPersistT, defaultConnectInfo, fieldDBName, getEntityDBName, getEntityFields, runMigration, runSqlConn, selectList, withMySQLConn)
11+
import Database.Persist.MySQL (ConnectInfo (ConnectInfo, connectDatabase, connectUser), Entity (Entity), EntityNameDB (unEntityNameDB), FieldDef (FieldDef), FieldNameHS (unFieldNameHS), Filter (Filter), FilterValue (FilterValue), PersistFilter (BackendSpecificFilter), PersistStoreWrite (insert_), SqlPersistT, defaultConnectInfo, fieldDBName, getEntityDBName, getEntityFields, runMigration, runSqlConn, selectList, withMySQLConn, SelectOpt)
1212
import Database.Persist.TH (mkMigrate, mkPersist, persistLowerCase, share, sqlSettings)
1313
import Database.Persist.Types (EntityDef, FieldDef (fieldSqlType), fieldHaskell)
14-
import Database.Persist ((==.))
14+
import Database.Persist ((==.), (=.))
1515
import Database.Schema (EntityField (TokenToken, VisitUuid), GuestbookEntry (GuestbookEntry, guestbookEntryIndex), Snake (Snake, snakeIndex), Token (tokenName, tokenToken, Token, tokenIndex), User (userName, User, userIndex), Visit (Visit, visitIndex), defs, migrateAll)
1616
import Logger (info)
1717
import Tree (Tree (Tree))
@@ -34,53 +34,8 @@ runDb cmd = do
3434
doMigration :: IO ()
3535
doMigration = runDb $ runMigration migrateAll
3636

37-
-- utils
38-
guestbookToTree :: [GuestbookEntry] -> Int -> [Tree GuestbookEntry]
39-
guestbookToTree entries targetParent = [Tree (GuestbookEntry id timestamp name content parent) $ guestbookToTree entries id | (GuestbookEntry id timestamp name content parent) <- entries, parent == targetParent]
40-
4137
-- getters
4238

43-
getVisits :: IO [Visit]
44-
getVisits = do
45-
visits <- runDb $ selectList [] []
46-
return $ map (\(Entity _ u) -> u) visits
47-
48-
getGuestbook :: IO [Tree GuestbookEntry]
49-
getGuestbook = do
50-
entries <- runDb $ selectList [] [] :: IO [Entity GuestbookEntry]
51-
return $ guestbookToTree (map (\(Entity _ entry) -> entry) entries) (-1)
52-
53-
getGuestbookEntries :: IO [GuestbookEntry]
54-
getGuestbookEntries = do
55-
entries <- runDb $ selectList [] []
56-
return $ map (\(Entity _ e) -> e) entries
57-
58-
getLeaderboard :: IO [Snake]
59-
getLeaderboard = do
60-
entries <- runDb $ selectList [] []
61-
return $ map (\(Entity _ e) -> e) entries
62-
63-
getUsers :: IO [User]
64-
getUsers = do
65-
entries <- runDb $ selectList [] []
66-
return $ map (\(Entity _ e) -> e) entries
67-
68-
getTokens :: IO [Token]
69-
getTokens = do
70-
entries <- runDb $ selectList [] []
71-
return $ map (\(Entity _ e) -> e) entries
72-
73-
uuidExists :: String -> IO Bool
74-
uuidExists uuid = do
75-
visits <- runDb $ selectList [VisitUuid ==. uuid] [] :: IO [Entity Visit]
76-
print visits
77-
return (null visits)
78-
79-
tokenToUsername :: String -> IO String
80-
tokenToUsername token = do
81-
(Entity _ token : _) <- runDb $ selectList [TokenToken ==. token] []
82-
return $ tokenName token
83-
8439
-- schema
8540
prettyPrintSchema :: String
8641
prettyPrintSchema =
@@ -95,29 +50,29 @@ prettyPrintSchema =
9550
fieldType field = show $ fieldSqlType field
9651

9752
validateToken :: String -> IO Bool
98-
validateToken token = any (\x -> tokenToken x == token) <$> getTokens
53+
validateToken token = any (\x -> tokenToken x == token) <$> (getData [] [] :: IO [Token])
9954

10055
class AdminTable a where
10156
toList :: a -> [String]
10257
button :: a -> Html
103-
getData :: [Filter a] -> IO [a]
58+
getData :: [Filter a] -> [SelectOpt a] -> IO [a]
10459
instance AdminTable Visit where
10560
toList (Visit rid timestamp uuid) = [show rid, show timestamp, uuid]
10661
button a = [hsx|<button id={"visits::"++(show $ visitIndex a)} onclick="delete_row(this.id)">Delete</button>|]
107-
getData f = map (\(Entity _ e) -> e) <$> runDb (selectList f []) :: IO [Visit]
62+
getData f o = map (\(Entity _ e) -> e) <$> runDb (selectList f o) :: IO [Visit]
10863
instance AdminTable GuestbookEntry where
10964
toList (GuestbookEntry rid timestamp name content parentId) = [show rid, show timestamp, name, content, show parentId]
11065
button a = [hsx|<button id={"guestbook::"++(show $ guestbookEntryIndex a)} onclick="delete_row(this.id)">Delete</button>|]
111-
getData f = map (\(Entity _ e) -> e) <$> runDb (selectList f []) :: IO [GuestbookEntry]
66+
getData f o = map (\(Entity _ e) -> e) <$> runDb (selectList f o) :: IO [GuestbookEntry]
11267
instance AdminTable Snake where
11368
toList (Snake rid timestamp name score speed fruits) = [show rid, show timestamp, name, show score, show speed, show fruits]
11469
button a = [hsx|<button id={"snake::"++(show $ snakeIndex a)} onclick="delete_row(this.id)">Delete</button>|]
115-
getData f = map (\(Entity _ e) -> e) <$> runDb (selectList f []) :: IO [Snake]
70+
getData f o = map (\(Entity _ e) -> e) <$> runDb (selectList f o) :: IO [Snake]
11671
instance AdminTable User where
11772
toList (User rid name password) = [show rid, name, password]
118-
button a = [hsx||<button id={"users::"++(show $ userIndex a)} onclick="delete_row(this.id)">Delete</button>|]
119-
getData f = map (\(Entity _ e) -> e) <$> runDb (selectList f []) :: IO [User]
73+
button a = [hsx|<button id={"users::"++(show $ userIndex a)} onclick="delete_row(this.id)">Delete</button>|]
74+
getData f o = map (\(Entity _ e) -> e) <$> runDb (selectList f o) :: IO [User]
12075
instance AdminTable Token where
12176
toList (Token rid token name) = [show rid, token, name]
12277
button a = [hsx|<button id={"valid_tokens::"++(show $ tokenIndex a)} onclick="delete_row(this.id)">Delete</button>|]
123-
getData f = map (\(Entity _ e) -> e) <$> runDb (selectList f []) :: IO [Token]
78+
getData f o = map (\(Entity _ e) -> e) <$> runDb (selectList f o) :: IO [Token]

lib/Database/Schema.hs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,32 +20,32 @@ import Database.Persist.TH (mkEntityDefList, mkMigrate, mkPersist, persistLowerC
2020

2121
share [mkPersist sqlSettings, mkMigrate "migrateAll", mkEntityDefList "defs"] [persistLowerCase|
2222
Visit sql=visits
23-
index Int sql=id
23+
index Int sql=id
2424
timestamp Int sql=timestamp
2525
uuid String sql=uuid
2626
deriving Eq Show
2727
GuestbookEntry sql=guestbook
28-
index Int sql=id
28+
index Int sql=id
2929
timestamp Int sql=timestamp
3030
name String sql=name
3131
content String sql=content
3232
parentId Int sql=parentId
3333
deriving Eq Show
3434
Snake sql=snake
35-
index Int sql=id
35+
index Int sql=id
3636
timestamp Int sql=timestamp
3737
name String sql=name
3838
score Int sql=score
3939
speed Int sql=speed
4040
fruits Int sql=fruits
4141
deriving Eq Show
4242
User sql=users
43-
index Int sql=id
43+
index Int sql=id
4444
name String sql=username
4545
password String sql=password
4646
deriving Eq Show
4747
Token sql=valid_tokens
48-
index Int sql=id
48+
index Int sql=id
4949
token String sql=token
5050
name String sql=username
5151
deriving Eq Show

0 commit comments

Comments
 (0)