aboutsummaryrefslogtreecommitdiff
path: root/lib/Server/Subscribe.hs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--lib/Server/Subscribe.hs66
1 files changed, 40 insertions, 26 deletions
diff --git a/lib/Server/Subscribe.hs b/lib/Server/Subscribe.hs
index 831f4c9..86b67a6 100644
--- a/lib/Server/Subscribe.hs
+++ b/lib/Server/Subscribe.hs
@@ -1,27 +1,26 @@
+{-# LANGUAGE BlockArguments #-}
module Server.Subscribe where
-import Conduit (MonadIO (..))
-import Control.Concurrent.STM (atomically, newTQueue, readTQueue,
- readTVar, writeTVar)
-import Control.Exception (handle)
-import Control.Monad.Extra (forever, whenJust)
-import qualified Data.Aeson as A
-import qualified Data.ByteString.Char8 as C8
-import Data.Coerce (coerce)
-import Data.Functor ((<&>))
-import Data.Map (Map)
-import qualified Data.Map as M
+import Conduit (MonadIO (..))
+import Control.Concurrent.STM (atomically, newTQueue,
+ readTQueue, readTVar,
+ writeTVar)
+import Control.Exception (handle)
+import Control.Monad.Extra (forever, whenJust)
+import qualified Data.Aeson as A
+import qualified Data.ByteString.Char8 as C8
+import Data.Coerce (coerce)
+import Data.Functor ((<&>))
+import Data.Map (Map)
+import qualified Data.Map as M
import Data.Pool
-import Data.UUID (UUID)
-import Database.Persist (Entity (entityKey), SelectOpt (Desc),
- entityVal, selectFirst, selectList,
- (<-.), (==.), (||.))
-import Database.Persist.Sql (SqlBackend)
-import qualified Network.WebSockets as WS
+import Data.UUID (UUID)
+import Database.Esqueleto.Experimental hiding ((<&>))
+import Database.Persist.Sql (SqlBackend)
+import qualified Network.WebSockets as WS
import Persist
-import Server.Base (ServerState)
-import Server.Util (ServiceM)
-
+import Server.Base (ServerState)
+import Server.Util (ServiceM)
handleSubscribe
:: Pool SqlBackend
@@ -38,8 +37,11 @@ handleSubscribe dbpool subscribers (ticketId :: UUID) conn = liftIO $ WS.withPin
pure queue
-- send most recent ping, if any (so we won't have to wait for movement)
- runSqlWithoutLog dbpool
- (selectFirst [TrainPingTicket ==. coerce ticketId] [Desc TrainPingTimestamp])
+ runSqlWithoutLog dbpool (selectOne do
+ ping <- from (table @Ping)
+ where_ (ping ^. PingTicket ==. val (Just (coerce ticketId)))
+ orderBy [desc (ping ^. PingTimestamp)]
+ pure ping)
<&> fmap entityVal
>>= flip whenJust (WS.sendTextData conn . A.encode)
@@ -57,7 +59,19 @@ handleSubscribe dbpool subscribers (ticketId :: UUID) conn = liftIO $ WS.withPin
-- getTicketTrackers :: (MonadLogger (t (ResourceT IO)), MonadIO (t (ResourceT IO)))
-- => UUID -> ReaderT SqlBackend (t (ResourceT IO)) [Entity Tracker]
-getTicketTrackers ticketId = do
- joins <- selectList [TrackerTicketTicket ==. TicketKey ticketId] []
- <&> fmap (trackerTicketTracker . entityVal)
- selectList ([TrackerId <-. joins] ||. [TrackerCurrentTicket ==. Just (TicketKey ticketId)]) []
+getTicketTrackers ticketId = select do
+ (tracker :& trackerticket) <- from $
+ table @Tracker
+ `innerJoin`
+ table @TrackerTicket
+ `on` \(tr :& ti) -> tr ^. TrackerId ==. ti ^. TrackerTicketTracker
+
+ where_ $
+ tracker ^. TrackerCurrentTicket ==. val (Just (TicketKey ticketId))
+ ||. trackerticket ^. TrackerTicketTicket ==. val (TicketKey ticketId)
+
+ pure tracker
+
+ -- joins <- selectList [TrackerTicketTicket ==. TicketKey ticketId] []
+ -- <&> fmap (trackerTicketTracker . entityVal)
+ -- selectList ([TrackerId <-. joins] ||. [TrackerCurrentTicket ==. Just (TicketKey ticketId)]) []