33 lines
1.8 KiB
Haskell
33 lines
1.8 KiB
Haskell
{-# LANGUAGE ImportQualifiedPost #-}
|
|
{-# LANGUAGE OverloadedStrings #-}
|
|
{-# LANGUAGE NoImplicitPrelude #-}
|
|
|
|
module Handler.Api where
|
|
|
|
import Data.Time.Clock.POSIX (posixSecondsToUTCTime)
|
|
import Database.Persist.Sql (rawSql)
|
|
import Import
|
|
|
|
getApiR :: Int -> Handler TypedContent
|
|
getApiR time = do
|
|
-- TODO: use only one runDB (or use joins ?)
|
|
userId <- getUserId
|
|
let utcTime = posixSecondsToUTCTime (fromIntegral time)
|
|
-- condition : parent user or group changed
|
|
let sqlUpdatedGroups = "select ?? from \"group\" join group_user gu on \"group\".id = gu.group_id where gu.user = ? where \"group\".last_modified > ? or user.last_modified > ?;"
|
|
-- condition : parent group or list changed
|
|
let sqlUpdatedLists = "select ?? from todolist join group_user on todolist.group_id = group_user.group_id and group_user.user = ? join \"group\" as g on g.id = todolist.id where list.last_modified > ? or g.last_modified > ?;"
|
|
-- condition : parent list changed
|
|
let sqlUpdatedItems = "select ?? from todolist where todolist.last_modified > ? join group_user on todolist.group_id = group_user.group_id and group_user.user = ? join todolist_item on todolist_item.todolist_id = todolist.id;"
|
|
runDB $ do
|
|
user <- selectList [UserId ==. userId, UserLastModified >. utcTime] []
|
|
groups <- rawSql sqlUpdatedGroups [toPersistValue userId, toPersistValue utcTime, toPersistValue utcTime]
|
|
lists <- rawSql sqlUpdatedLists [toPersistValue userId, toPersistValue utcTime, toPersistValue utcTime]
|
|
items <- rawSql sqlUpdatedItems [toPersistValue utcTime, toPersistValue userId]
|
|
let t =
|
|
unlines
|
|
$ map userToCSV user
|
|
<> map groupToCSV groups
|
|
<> map todolistToCSV lists
|
|
<> map todolistItemToCSV items
|
|
return $ TypedContent typePlain $ toContent t
|