export Session.duration as NominalDiffTime

This commit is contained in:
Daniel Barlow 2024-11-11 19:14:21 +00:00
parent 8988bb5b61
commit 9a9c41a2ba
3 changed files with 31 additions and 14 deletions

View File

@ -16,9 +16,9 @@ import Data.Text.Lazy.Builder qualified as B
import Data.Text.Lazy.Builder.Int qualified as B import Data.Text.Lazy.Builder.Int qualified as B
import Data.Time.Clock (nominalDiffTimeToSeconds) import Data.Time.Clock (nominalDiffTimeToSeconds)
import Data.Time.Clock.POSIX (posixSecondsToUTCTime, utcTimeToPOSIXSeconds) import Data.Time.Clock.POSIX (posixSecondsToUTCTime, utcTimeToPOSIXSeconds)
import Database.Persist.Postgresql (ConnectionPool, ConnectionString, SqlBackend, getPgInterval, runMigration, runSqlPool, withPostgresqlPool) import Database.Persist.Postgresql (ConnectionPool, ConnectionString, SqlBackend, runMigration, runSqlPool, withPostgresqlPool)
import Debug.Trace (traceShow) import Debug.Trace (traceShow)
import Session import Session qualified
import Store import Store
import Track (parseBS) import Track (parseBS)
import Yesod.Core import Yesod.Core
@ -59,13 +59,13 @@ instance YesodPersist Souplesse where
Souplesse pool _ <- getYesod Souplesse pool _ <- getYesod
runSqlPool action pool runSqlPool action pool
intToText :: Integral a => a -> T.Text intToText :: (Integral a) => a -> T.Text
intToText = T.toStrict . B.toLazyText . B.decimal intToText = T.toStrict . B.toLazyText . B.decimal
getCalendarR :: Handler Html getCalendarR :: Handler Html
getCalendarR = do getCalendarR = do
let fTime = intToText . floor . utcTimeToPOSIXSeconds let fTime = intToText . floor . utcTimeToPOSIXSeconds
fDur = intToText . ceiling . nominalDiffTimeToSeconds . getPgInterval fDur = intToText . ceiling . nominalDiffTimeToSeconds
(formWidget, _) <- generateFormPost uploadForm (formWidget, _) <- generateFormPost uploadForm
sessions' <- runDB Session.recents sessions' <- runDB Session.recents
defaultLayout defaultLayout
@ -76,7 +76,7 @@ getCalendarR = do
<ul> <ul>
$forall s <- sessions' $forall s <- sessions'
<li> <li>
<a href=@?{(TimelineR, [("start", fTime $ sessionStartTime s), ("duration", fDur $ sessionDuration s)])} > #{show $ sessionStartTime s} #{show $ getPgInterval (sessionDuration s)} <a href=@?{(TimelineR, [("start", fTime $ Session.startTime s), ("duration", fDur $ Session.duration s)])} > #{show $ Session.startTime s} #{show (Session.duration s)}
<form action="/upload" method=post enctype="multipart/form-data"> <form action="/upload" method=post enctype="multipart/form-data">
^{formWidget} ^{formWidget}
@ -170,7 +170,7 @@ connStr = "host=127.0.0.1 port=5432 user=souplesse dbname=souplesse password=sec
main :: IO () main :: IO ()
main = runStderrLoggingT $ withPostgresqlPool connStr 10 $ \pool -> liftIO $ do main = runStderrLoggingT $ withPostgresqlPool connStr 10 $ \pool -> liftIO $ do
runResourceT $ flip runSqlPool pool $ do runResourceT $ flip runSqlPool pool $ do
runMigration migrateSession runMigration Session.migrateSession
runMigration migrateTrkpt runMigration migrateTrkpt
static' <- static "frontend" static' <- static "frontend"
warp 3000 $ Souplesse pool static' warp 3000 $ Souplesse pool static'

View File

@ -25,13 +25,15 @@ import Control.Monad.IO.Class (MonadIO)
import Control.Monad.Trans.Reader (ReaderT) import Control.Monad.Trans.Reader (ReaderT)
import Data.Text import Data.Text
import Data.Time.Clock import Data.Time.Clock
( UTCTime, ( NominalDiffTime,
UTCTime,
) )
import Database.Persist import Database.Persist
import Database.Persist.Postgresql import Database.Persist.Postgresql
( PgInterval, ( PgInterval,
SqlBackend, SqlBackend,
rawExecute getPgInterval,
rawExecute,
) )
import Database.Persist.TH import Database.Persist.TH
import Text.RawString.QQ (r) import Text.RawString.QQ (r)
@ -39,13 +41,28 @@ import Text.RawString.QQ (r)
share share
[mkPersist sqlSettings, mkMigrate "migrateSession"] [mkPersist sqlSettings, mkMigrate "migrateSession"]
[persistLowerCase| [persistLowerCase|
Session SessionRow sql=session
startTime UTCTime startTime UTCTime
duration PgInterval duration PgInterval
draft Bool default=True draft Bool default=True
notes String Maybe notes String Maybe
|] |]
data Session = Session
{ startTime :: UTCTime,
duration :: NominalDiffTime,
draft :: Bool,
notes :: Maybe String
}
fromEntity :: Entity SessionRow -> Session
fromEntity (Entity _ row) =
Session
(sessionRowStartTime row)
(getPgInterval (sessionRowDuration row))
(sessionRowDraft row)
(sessionRowNotes row)
updateSql :: Text updateSql :: Text
updateSql = updateSql =
[r| [r|
@ -69,5 +86,5 @@ refreshDrafts =
recents :: (MonadIO m) => ReaderT SqlBackend m [Session] recents :: (MonadIO m) => ReaderT SqlBackend m [Session]
recents = do recents = do
s <- selectList [SessionDraft !=. True] [Desc SessionStartTime, LimitTo 10] s <- selectList [SessionRowDraft !=. True] [Desc SessionRowStartTime, LimitTo 10]
return $ Prelude.map (\(Entity _ x) -> x) s return $ Prelude.map fromEntity s

View File

@ -39,7 +39,7 @@ import Database.Persist.Postgresql
runSqlPool, runSqlPool,
) )
import Database.Persist.TH import Database.Persist.TH
import Session import Session qualified
import Text.Read (readMaybe) import Text.Read (readMaybe)
import Track (Point (..), Pos (..)) import Track (Point (..), Pos (..))
import Track as T import Track as T
@ -82,8 +82,8 @@ instance Exception OverlapExists
save :: (MonadIO m) => Track -> ReaderT SqlBackend m (Either OverlapExists Track) save :: (MonadIO m) => Track -> ReaderT SqlBackend m (Either OverlapExists Track)
save track = do save track = do
let start = startTime track let start = T.startTime track
finish = addUTCTime (duration track) (startTime track) finish = addUTCTime (T.duration track) (T.startTime track)
priors <- selectFirst [TrkptTime >. start, TrkptTime <. finish] [] priors <- selectFirst [TrkptTime >. start, TrkptTime <. finish] []
if isJust priors if isJust priors
then return $ Left (OverlapExists "track overlaps with existing data") then return $ Left (OverlapExists "track overlaps with existing data")