module Handler.Notifications where import Startlude import Data.UUID import Database.Persist import Yesod.Core.Handler import Yesod.Core.Types ( JSONResponse(..) ) import Yesod.Persist.Core import Foundation import qualified Lib.Notifications as Notification import Model getNotificationsR :: Handler (JSONResponse [Entity Notification]) getNotificationsR = runDB $ do page <- lookupGetParam "page" `orDefaultTo` 1 pageSize <- lookupGetParam "perPage" `orDefaultTo` 20 evs <- selectList [] [Desc NotificationCreatedAt, LimitTo pageSize, OffsetBy ((page - 1) * pageSize)] let toArchive = fmap entityKey $ filter ((== Nothing) . notificationArchivedAt . entityVal) evs void $ Notification.archive toArchive pure $ JSONResponse evs where orDefaultTo :: (Monad m, Read a) => m (Maybe Text) -> a -> m a orDefaultTo m a = do m' <- m case m' >>= readMaybe . toS of Nothing -> pure a Just x -> pure x deleteNotificationsR :: Handler () deleteNotificationsR = do runDB $ deleteWhere ([] :: [Filter Notification]) deleteNotificationR :: UUID -> Handler () deleteNotificationR notifId = runDB $ delete (coerce @_ @(Key Notification) notifId)