[NGRAMS-REPO] Refactor Repo env

parent 9f2b9050
...@@ -73,7 +73,7 @@ import Gargantext.Prelude ...@@ -73,7 +73,7 @@ import Gargantext.Prelude
import Gargantext.API.FrontEnd (FrontEndAPI, frontEndServer) import Gargantext.API.FrontEnd (FrontEndAPI, frontEndServer)
import Gargantext.API.Auth (AuthRequest, AuthResponse, auth) import Gargantext.API.Auth (AuthRequest, AuthResponse, auth)
import Gargantext.API.Ngrams (HasRepoVar(..), HasRepoSaver(..), saveRepo) import Gargantext.API.Ngrams (HasRepo(..), HasRepoSaver(..), saveRepo)
import Gargantext.API.Node ( GargServer import Gargantext.API.Node ( GargServer
, Roots , roots , Roots , roots
, NodeAPI , nodeAPI , NodeAPI , nodeAPI
...@@ -278,7 +278,7 @@ type API = SwaggerFrontAPI :<|> GargAPI :<|> Get '[HTML] Html ...@@ -278,7 +278,7 @@ type API = SwaggerFrontAPI :<|> GargAPI :<|> Get '[HTML] Html
--------------------------------------------------------------------- ---------------------------------------------------------------------
-- | Server declarations -- | Server declarations
server :: (HasConnection env, HasRepoVar env, HasRepoSaver env) server :: (HasConnection env, HasRepo env)
=> env -> IO (Server API) => env -> IO (Server API)
server env = do server env = do
-- orchestrator <- scrapyOrchestrator env -- orchestrator <- scrapyOrchestrator env
...@@ -318,7 +318,7 @@ gargMock :: Server GargAPI ...@@ -318,7 +318,7 @@ gargMock :: Server GargAPI
gargMock = mock apiGarg Proxy gargMock = mock apiGarg Proxy
--------------------------------------------------------------------- ---------------------------------------------------------------------
makeApp :: (HasConnection env, HasRepoVar env, HasRepoSaver env) makeApp :: (HasConnection env, HasRepo env)
=> env -> IO Application => env -> IO Application
makeApp = fmap (serve api) . server makeApp = fmap (serve api) . server
......
...@@ -601,6 +601,14 @@ initMockRepo = Repo 1 s [] ...@@ -601,6 +601,14 @@ initMockRepo = Repo 1 s []
$ Map.fromList $ Map.fromList
[ (n ^. ne_ngrams, n) | n <- mockTable ^. _NgramsTable ] [ (n ^. ne_ngrams, n) | n <- mockTable ^. _NgramsTable ]
data RepoEnv = RepoEnv
{ _renv_var :: !(MVar NgramsRepo)
, _renv_saver :: !(IO ())
}
deriving (Generic)
makeLenses ''RepoEnv
class HasRepoVar env where class HasRepoVar env where
repoVar :: Getter env (MVar NgramsRepo) repoVar :: Getter env (MVar NgramsRepo)
...@@ -610,15 +618,23 @@ instance HasRepoVar (MVar NgramsRepo) where ...@@ -610,15 +618,23 @@ instance HasRepoVar (MVar NgramsRepo) where
class HasRepoSaver env where class HasRepoSaver env where
repoSaver :: Getter env (IO ()) repoSaver :: Getter env (IO ())
instance HasRepoSaver (IO ()) where class (HasRepoVar env, HasRepoSaver env) => HasRepo env where
repoSaver = identity repoEnv :: Getter env RepoEnv
instance HasRepo RepoEnv where
repoEnv = identity
instance HasRepoVar RepoEnv where
repoVar = renv_var
instance HasRepoSaver RepoEnv where
repoSaver = renv_saver
type RepoCmdM env err m = type RepoCmdM env err m =
( MonadReader env m ( MonadReader env m
, MonadError err m , MonadError err m
, MonadIO m , MonadIO m
, HasRepoVar env , HasRepo env
, HasRepoSaver env
) )
------------------------------------------------------------------------ ------------------------------------------------------------------------
......
...@@ -47,7 +47,7 @@ import Data.Time (UTCTime) ...@@ -47,7 +47,7 @@ import Data.Time (UTCTime)
import GHC.Generics (Generic) import GHC.Generics (Generic)
import Servant import Servant
import Gargantext.API.Ngrams (TabType(..), TableNgramsApi, TableNgramsApiGet, tableNgramsPatch, getTableNgrams, HasRepoVar, HasRepoSaver) import Gargantext.API.Ngrams (TabType(..), TableNgramsApi, TableNgramsApiGet, tableNgramsPatch, getTableNgrams, HasRepo)
import Gargantext.Prelude import Gargantext.Prelude
import Gargantext.Database.Types.Node import Gargantext.Database.Types.Node
import Gargantext.Database.Utils -- (Cmd, CmdM) import Gargantext.Database.Utils -- (Cmd, CmdM)
...@@ -76,7 +76,7 @@ import Test.QuickCheck.Arbitrary (Arbitrary, arbitrary) ...@@ -76,7 +76,7 @@ import Test.QuickCheck.Arbitrary (Arbitrary, arbitrary)
type GargServer api = type GargServer api =
forall env m. forall env m.
(CmdM env ServantErr m, HasRepoVar env, HasRepoSaver env) (CmdM env ServantErr m, HasRepo env)
=> ServerT api m => ServerT api m
------------------------------------------------------------------- -------------------------------------------------------------------
......
...@@ -60,7 +60,7 @@ import Control.Monad.Reader ...@@ -60,7 +60,7 @@ import Control.Monad.Reader
import Control.Lens import Control.Lens
import Gargantext.Prelude import Gargantext.Prelude
import Gargantext.Database.Utils (databaseParameters, HasConnection(..), Cmd', runCmd) import Gargantext.Database.Utils (databaseParameters, HasConnection(..), Cmd', runCmd)
import Gargantext.API.Ngrams (NgramsRepo, HasRepoVar(..), HasRepoSaver(..), r_version, saveRepo, initRepo) import Gargantext.API.Ngrams (NgramsRepo, HasRepoVar(..), HasRepoSaver(..), HasRepo(..), RepoEnv(..), r_version, saveRepo, initRepo)
import Gargantext.API.Orchestrator.Types import Gargantext.API.Orchestrator.Types
type PortNumber = Int type PortNumber = Int
...@@ -137,14 +137,13 @@ optSetting name d = do ...@@ -137,14 +137,13 @@ optSetting name d = do
data FireWall = FireWall { unFireWall :: Bool } data FireWall = FireWall { unFireWall :: Bool }
data Env = Env data Env = Env
{ _env_settings :: !Settings { _env_settings :: !Settings
, _env_logger :: !LoggerSet , _env_logger :: !LoggerSet
, _env_conn :: !Connection , _env_conn :: !Connection
, _env_repo_var :: !(MVar NgramsRepo) , _env_repo :: !RepoEnv
, _env_repo_saver :: !(IO ()) , _env_manager :: !Manager
, _env_manager :: !Manager , _env_self_url :: !BaseUrl
, _env_self_url :: !BaseUrl , _env_scrapers :: !ScrapersEnv
, _env_scrapers :: !ScrapersEnv
} }
deriving (Generic) deriving (Generic)
...@@ -154,10 +153,13 @@ instance HasConnection Env where ...@@ -154,10 +153,13 @@ instance HasConnection Env where
connection = env_conn connection = env_conn
instance HasRepoVar Env where instance HasRepoVar Env where
repoVar = env_repo_var repoVar = repoEnv . repoVar
instance HasRepoSaver Env where instance HasRepoSaver Env where
repoSaver = env_repo_saver repoSaver = repoEnv . repoSaver
instance HasRepo Env where
repoEnv = env_repo
data MockEnv = MockEnv data MockEnv = MockEnv
{ _menv_firewall :: !FireWall { _menv_firewall :: !FireWall
...@@ -169,8 +171,24 @@ makeLenses ''MockEnv ...@@ -169,8 +171,24 @@ makeLenses ''MockEnv
repoSnapshot :: FilePath repoSnapshot :: FilePath
repoSnapshot = "repo.json" repoSnapshot = "repo.json"
readRepo :: IO (MVar NgramsRepo) ignoreExc :: IO () -> IO ()
readRepo = do ignoreExc = handle $ \(_ :: SomeException) -> return ()
repoSaverAction :: ToJSON a => a -> IO ()
repoSaverAction a = ignoreExc $ do
-- TODO file locking
withTempFile "." "tmp-repo.json" $ \fp h -> do
L.hPut h $ encode a
hClose h
renameFile fp repoSnapshot
mkRepoSaver :: MVar NgramsRepo -> IO (IO ())
mkRepoSaver repo_var = do
(saveAction, _) <- mkDebounce (10 :: Second) repoSaverAction
pure $ readMVar repo_var >>= saveAction
readRepoEnv :: IO RepoEnv
readRepoEnv = do
-- | Does file exist ? :: Bool -- | Does file exist ? :: Bool
repoFile <- doesFileExist repoSnapshot repoFile <- doesFileExist repoSnapshot
...@@ -179,7 +197,7 @@ readRepo = do ...@@ -179,7 +197,7 @@ readRepo = do
then (>0) <$> getFileSize repoSnapshot then (>0) <$> getFileSize repoSnapshot
else pure False else pure False
newMVar =<< mvar <- newMVar =<<
if repoExists if repoExists
then do then do
e_repo <- eitherDecodeFileStrict repoSnapshot e_repo <- eitherDecodeFileStrict repoSnapshot
...@@ -190,21 +208,8 @@ readRepo = do ...@@ -190,21 +208,8 @@ readRepo = do
else else
pure initRepo pure initRepo
ignoreExc :: IO () -> IO () saver <- mkRepoSaver mvar
ignoreExc = handle $ \(_ :: SomeException) -> return () pure $ RepoEnv { _renv_var = mvar, _renv_saver = saver }
repoSaverAction :: ToJSON a => a -> IO ()
repoSaverAction a = ignoreExc $ do
-- TODO file locking
withTempFile "." "tmp-repo.json" $ \fp h -> do
L.hPut h $ encode a
hClose h
renameFile fp repoSnapshot
mkRepoSaver :: MVar NgramsRepo -> IO (IO ())
mkRepoSaver repo_var = do
(saveAction, _) <- mkDebounce (10 :: Second) repoSaverAction
pure $ readMVar repo_var >>= saveAction
newEnv :: PortNumber -> FilePath -> IO Env newEnv :: PortNumber -> FilePath -> IO Env
newEnv port file = do newEnv port file = do
...@@ -212,31 +217,27 @@ newEnv port file = do ...@@ -212,31 +217,27 @@ newEnv port file = do
settings <- pure (devSettings & appPort .~ port) -- TODO read from 'file' settings <- pure (devSettings & appPort .~ port) -- TODO read from 'file'
when (port /= settings ^. appPort) $ when (port /= settings ^. appPort) $
panic "TODO: conflicting settings of port" panic "TODO: conflicting settings of port"
self_url <- parseBaseUrl $ "http://0.0.0.0:" <> show port self_url <- parseBaseUrl $ "http://0.0.0.0:" <> show port
param <- databaseParameters file param <- databaseParameters file
conn <- connect param conn <- connect param
repo <- readRepoEnv
repo_var <- readRepo
repo_saver <- mkRepoSaver repo_var
scrapers_env <- newJobEnv defaultSettings manager scrapers_env <- newJobEnv defaultSettings manager
logger <- newStderrLoggerSet defaultBufSize logger <- newStderrLoggerSet defaultBufSize
pure $ Env pure $ Env
{ _env_settings = settings { _env_settings = settings
, _env_logger = logger , _env_logger = logger
, _env_conn = conn , _env_conn = conn
, _env_repo_var = repo_var , _env_repo = repo
, _env_repo_saver = repo_saver
, _env_manager = manager , _env_manager = manager
, _env_scrapers = scrapers_env , _env_scrapers = scrapers_env
, _env_self_url = self_url , _env_self_url = self_url
} }
data DevEnv = DevEnv data DevEnv = DevEnv
{ _dev_env_conn :: !Connection { _dev_env_conn :: !Connection
, _dev_env_repo_var :: !(MVar NgramsRepo) , _dev_env_repo :: !RepoEnv
, _dev_env_repo_saver :: !(IO ())
} }
makeLenses ''DevEnv makeLenses ''DevEnv
...@@ -245,21 +246,22 @@ instance HasConnection DevEnv where ...@@ -245,21 +246,22 @@ instance HasConnection DevEnv where
connection = dev_env_conn connection = dev_env_conn
instance HasRepoVar DevEnv where instance HasRepoVar DevEnv where
repoVar = dev_env_repo_var repoVar = repoEnv . repoVar
instance HasRepoSaver DevEnv where instance HasRepoSaver DevEnv where
repoSaver = dev_env_repo_saver repoSaver = repoEnv . repoSaver
instance HasRepo DevEnv where
repoEnv = dev_env_repo
newDevEnvWith :: FilePath -> IO DevEnv newDevEnvWith :: FilePath -> IO DevEnv
newDevEnvWith file = do newDevEnvWith file = do
param <- databaseParameters file param <- databaseParameters file
conn <- connect param conn <- connect param
repo_var <- readRepo repo <- readRepoEnv
repo_saver <- mkRepoSaver repo_var
pure $ DevEnv pure $ DevEnv
{ _dev_env_conn = conn { _dev_env_conn = conn
, _dev_env_repo_var = repo_var , _dev_env_repo = repo
, _dev_env_repo_saver = repo_saver
} }
-- | Run Cmd Sugar for the Repl (GHCI) -- | Run Cmd Sugar for the Repl (GHCI)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment