feat: add SQLite database support
- Add sqlite-simple dependency - Create Sis.Database module with openDatabase (creates parent dir, enables WAL + FK) - Add --db-path CLI option (default data/sis.db) - Format all Haskell sources with fourmolu - Fix hlint suggestions in Sis.Server
This commit is contained in:
+48
-48
@@ -14,62 +14,62 @@ import Sis.Database qualified as Database
|
||||
import Sis.Server qualified as Sis
|
||||
|
||||
data Options = Options
|
||||
{ optPort :: Int
|
||||
, optStaticDir :: FilePath
|
||||
, optDbPath :: FilePath
|
||||
}
|
||||
{ optPort :: Int
|
||||
, optStaticDir :: FilePath
|
||||
, optDbPath :: FilePath
|
||||
}
|
||||
|
||||
optionsParser :: Opt.Parser Options
|
||||
optionsParser =
|
||||
Options
|
||||
<$> Opt.option
|
||||
Opt.auto
|
||||
( Opt.long "port"
|
||||
<> Opt.short 'p'
|
||||
<> Opt.metavar "PORT"
|
||||
<> Opt.help "Listen port"
|
||||
<> Opt.value 8080
|
||||
<> Opt.showDefault
|
||||
)
|
||||
<*> Opt.strOption
|
||||
( Opt.long "static-dir"
|
||||
<> Opt.metavar "DIR"
|
||||
<> Opt.help "Directory containing the SPA frontend static files"
|
||||
<> Opt.value "frontend/dist"
|
||||
<> Opt.showDefault
|
||||
)
|
||||
<*> Opt.strOption
|
||||
( Opt.long "db-path"
|
||||
<> Opt.metavar "PATH"
|
||||
<> Opt.help "Path to the SQLite database file"
|
||||
<> Opt.value "data/sis.db"
|
||||
<> Opt.showDefault
|
||||
)
|
||||
Options
|
||||
<$> Opt.option
|
||||
Opt.auto
|
||||
( Opt.long "port"
|
||||
<> Opt.short 'p'
|
||||
<> Opt.metavar "PORT"
|
||||
<> Opt.help "Listen port"
|
||||
<> Opt.value 8080
|
||||
<> Opt.showDefault
|
||||
)
|
||||
<*> Opt.strOption
|
||||
( Opt.long "static-dir"
|
||||
<> Opt.metavar "DIR"
|
||||
<> Opt.help "Directory containing the SPA frontend static files"
|
||||
<> Opt.value "frontend/dist"
|
||||
<> Opt.showDefault
|
||||
)
|
||||
<*> Opt.strOption
|
||||
( Opt.long "db-path"
|
||||
<> Opt.metavar "PATH"
|
||||
<> Opt.help "Path to the SQLite database file"
|
||||
<> Opt.value "data/sis.db"
|
||||
<> Opt.showDefault
|
||||
)
|
||||
|
||||
main :: IO ()
|
||||
main = do
|
||||
opts <-
|
||||
Opt.execParser $
|
||||
Opt.info (optionsParser Opt.<**> Opt.helper) $
|
||||
Opt.fullDesc
|
||||
<> Opt.progDesc "Sis — shared household chore tracker"
|
||||
<> Opt.header "sis-server"
|
||||
opts <-
|
||||
Opt.execParser $
|
||||
Opt.info (optionsParser Opt.<**> Opt.helper) $
|
||||
Opt.fullDesc
|
||||
<> Opt.progDesc "Sis — shared household chore tracker"
|
||||
<> Opt.header "sis-server"
|
||||
|
||||
_db <- Database.openDatabase (optDbPath opts)
|
||||
_db <- Database.openDatabase (optDbPath opts)
|
||||
|
||||
-- Install a SIGTERM handler so Docker stop works cleanly.
|
||||
_ <-
|
||||
Signals.installHandler
|
||||
Signals.sigTERM
|
||||
(Signals.Catch (putStrLn "[sis] shutting down"))
|
||||
Nothing
|
||||
-- Install a SIGTERM handler so Docker stop works cleanly.
|
||||
_ <-
|
||||
Signals.installHandler
|
||||
Signals.sigTERM
|
||||
(Signals.Catch (putStrLn "[sis] shutting down"))
|
||||
Nothing
|
||||
|
||||
let waiApp = Sis.app (optStaticDir opts)
|
||||
let waiApp = Sis.app (optStaticDir opts)
|
||||
|
||||
let settings =
|
||||
Warp.setPort (optPort opts) $
|
||||
Warp.setBeforeMainLoop
|
||||
(putStrLn $ "[sis] listening on port " ++ show (optPort opts))
|
||||
Warp.defaultSettings
|
||||
let settings =
|
||||
Warp.setPort (optPort opts) $
|
||||
Warp.setBeforeMainLoop
|
||||
(putStrLn $ "[sis] listening on port " ++ show (optPort opts))
|
||||
Warp.defaultSettings
|
||||
|
||||
Warp.runSettings settings waiApp
|
||||
Warp.runSettings settings waiApp
|
||||
|
||||
Reference in New Issue
Block a user