{-# LANGUAGE BlockArguments #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE LambdaCase #-} {-# LANGUAGE QuasiQuotes #-} {-# LANGUAGE RecordWildCards #-} module Server.Frontend.Tickets ( getTicketsR , postGtfsTicketImportR , getTicketViewR , getTicketMapViewR , getDelAnnounceR , postAnnounceR , getTrackerIdBlock ) where import Server.Frontend.Routes import Config (ServerConfig (..), UffdConfig (..)) import Control.Monad (forM, forM_, join) import Control.Monad.Extra (maybeM) import Control.Monad.IO.Class (MonadIO (liftIO)) import Data.Coerce (coerce) import Data.Function (on, (&)) import Data.Functor ((<&>)) import Data.List (lookup, nubBy) import Data.List.NonEmpty (nonEmpty) import Data.Map (Map) import qualified Data.Map as M import Data.Maybe (catMaybes, fromJust, isJust) import Data.Text (Text) import qualified Data.Text as T import Data.Time (UTCTime (..), addDays, getCurrentTime, utctDay) import Data.Time.Calendar (Day) import Data.Time.Format.ISO8601 (iso8601Show) import Data.UUID (UUID) import qualified Data.UUID as UUID import qualified Data.Vector as V import Extrapolation (Extrapolator (..), LinearExtrapolator (..)) import Fmt ((+|), (|+)) import GHC.Float (int2Double) import qualified GTFS import Numeric (showFFloat) import Persist import Server.Frontend.SpaceTime (mkSpaceTimeDiagram, mkSpaceTimeDiagramHandler) import Server.Frontend.Ticker (tickerWidget) import Server.Util (Service, secondsNow) import Text.Read (readMaybe) import qualified Yesod import Yesod hiding (delete, update, (=.), (==.), (||.)) import Yesod.Auth import Yesod.Auth.Uffd (UffdUser (..), uffdClient) import Database.Esqueleto.Experimental (asc, associateJoin, orderBy, where_, (:&) (..), (^.)) import Database.Esqueleto.Experimental hiding (on, (<&>)) import qualified Database.Esqueleto.Experimental as E getTicketsR :: Handler Html getTicketsR = do req <- getRequest let maybeDay = lookup "day" (reqGetParams req) >>= (readMaybe . T.unpack) mdisplayname <- maybeAuthId <&> fmap uffdDisplayName (day, isToday) <- liftIO $ getCurrentTime <&> utctDay <&> \today -> case maybeDay of Just day -> (day, day == today) Nothing -> (today, True) maybeSpaceTime <- mkSpaceTimeDiagramHandler 1 day [ TicketDay Yesod.==. day ] let prevday = (T.pack . iso8601Show . addDays (-1)) day let nextday = (T.pack . iso8601Show . addDays 1) day gtfs <- getYesod <&> getGtfs -- TODO: tickets should have all trip information saved tickets <- runDB $ E.select do ((ticket :& stop) :& station) <- E.from $ (E.table @Ticket `E.InnerJoin` E.table @Stop `E.on` \(ticket :& stop) -> ticket ^. TicketId E.==. stop E.^. StopTicket) `E.InnerJoin` E.table @Station `E.on` \((_ :& stop) :& station) -> stop E.^. StopStation E.==. station ^. StationId where_ (ticket ^. TicketDay E.==. (E.val day)) orderBy [asc (ticket ^. TicketTripName)] pure (ticket, (stop, station)) & fmap associateJoin let trips = GTFS.tripsOnDay gtfs day tickerAnnounceWidget <- tickerWidget (widget, enctype) <- generateFormPost (tripImportForm (fmap (,day) (M.elems trips))) defaultLayout $ do [whamlet|
_{MsgLoggedInAs name} - _{MsgLogout}