export Session.duration as NominalDiffTime
This commit is contained in:
parent
8988bb5b61
commit
9a9c41a2ba
12
app/Main.hs
12
app/Main.hs
@ -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'
|
||||||
|
@ -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
|
||||||
|
@ -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")
|
||||||
|
Loading…
Reference in New Issue
Block a user