{-# 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