Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
H
haskell-gargantext
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Przemyslaw Kaminski
haskell-gargantext
Commits
a3dc2f3f
Commit
a3dc2f3f
authored
Aug 25, 2021
by
Alexandre Delanoë
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[FIX] repo migration fixed (WIP)
parent
2b1c8e4e
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
94 additions
and
45 deletions
+94
-45
package.yaml
package.yaml
+1
-0
EnvTypes.hs
src/Gargantext/API/Admin/EnvTypes.hs
+20
-2
Settings.hs
src/Gargantext/API/Admin/Settings.hs
+18
-14
Dev.hs
src/Gargantext/API/Dev.hs
+3
-2
Tools.hs
src/Gargantext/API/Ngrams/Tools.hs
+7
-0
Types.hs
src/Gargantext/API/Ngrams/Types.hs
+2
-4
NodeStory.hs
src/Gargantext/Core/NodeStory.hs
+43
-23
No files found.
package.yaml
View file @
a3dc2f3f
...
...
@@ -121,6 +121,7 @@ library:
-
case-insensitive
-
cassava
-
cereal
# (IGraph)
-
cborg
-
conduit
-
conduit-extra
-
containers
...
...
src/Gargantext/API/Admin/EnvTypes.hs
View file @
a3dc2f3f
...
...
@@ -14,6 +14,7 @@ import Servant.Job.Async (HasJobEnv(..), Job)
import
System.Log.FastLogger
import
qualified
Servant.Job.Core
import
Gargantext.API.Ngrams.Types
(
HasRepoVar
(
..
),
HasRepoSaver
(
..
),
HasRepo
(
..
),
RepoEnv
(
..
))
import
Gargantext.API.Admin.Types
import
Gargantext.API.Admin.Orchestrator.Types
import
Gargantext.Database.Prelude
(
HasConnectionPool
(
..
),
HasConfig
(
..
))
...
...
@@ -25,6 +26,7 @@ data Env = Env
{
_env_settings
::
!
Settings
,
_env_logger
::
!
LoggerSet
,
_env_pool
::
!
(
Pool
Connection
)
,
_env_repo
::
!
RepoEnv
,
_env_nodeStory
::
!
NodeStoryEnv
,
_env_manager
::
!
Manager
,
_env_self_url
::
!
BaseUrl
...
...
@@ -53,6 +55,14 @@ instance HasNodeStorySaver Env where
instance
HasSettings
Env
where
settings
=
env_settings
-- Specific to Repo
instance
HasRepoVar
Env
where
repoVar
=
repoEnv
.
repoVar
instance
HasRepoSaver
Env
where
repoSaver
=
repoEnv
.
repoSaver
instance
HasRepo
Env
where
repoEnv
=
env_repo
...
...
@@ -71,9 +81,9 @@ makeLenses ''MockEnv
data
DevEnv
=
DevEnv
{
_dev_env_settings
::
!
Settings
,
_dev_env_repo
::
!
RepoEnv
,
_dev_env_config
::
!
GargConfig
,
_dev_env_pool
::
!
(
Pool
Connection
)
,
_dev_env_nodeStory
::
!
NodeStoryEnv
...
...
@@ -91,7 +101,6 @@ instance HasSettings DevEnv where
settings
=
dev_env_settings
instance
HasNodeStoryEnv
DevEnv
where
hasNodeStory
=
dev_env_nodeStory
...
...
@@ -101,3 +110,12 @@ instance HasNodeStoryVar DevEnv where
instance
HasNodeStorySaver
DevEnv
where
hasNodeStorySaver
=
hasNodeStory
.
nse_saver
instance
HasRepoVar
DevEnv
where
repoVar
=
repoEnv
.
repoVar
instance
HasRepoSaver
DevEnv
where
repoSaver
=
repoEnv
.
repoSaver
instance
HasRepo
DevEnv
where
repoEnv
=
dev_env_repo
src/Gargantext/API/Admin/Settings.hs
View file @
a3dc2f3f
...
...
@@ -18,32 +18,36 @@ TODO-SECURITY: Critical
module
Gargantext.API.Admin.Settings
where
import
Codec.Serialise
(
Serialise
(),
serialise
{-, deserialise-}
)
--
import Control.Concurrent
--
import Control.Debounce (mkDebounce, defaultDebounceSettings, debounceFreq, debounceAction)
import
Codec.Serialise
(
Serialise
(),
serialise
,
deserialise
)
import
Control.Concurrent
import
Control.Debounce
(
mkDebounce
,
defaultDebounceSettings
,
debounceFreq
,
debounceAction
)
import
Control.Lens
import
Control.Monad.Logger
import
Control.Monad.Reader
import
Data.Maybe
(
fromMaybe
)
import
Data.Pool
(
Pool
,
createPool
)
import
Database.PostgreSQL.Simple
(
Connection
,
connect
,
close
,
ConnectInfo
)
import
Gargantext.API.Admin.EnvTypes
import
Gargantext.API.Admin.Types
import
Gargantext.Core.NodeStory
import
Gargantext.Database.Prelude
(
databaseParameters
)
import
Gargantext.Prelude
import
Gargantext.Prelude.Config
(
GargConfig
(
..
),
{-gc_repofilepath,-}
readConfig
)
import
Network.HTTP.Client.TLS
(
newTlsManager
)
import
Servant.Auth.Server
(
defaultJWTSettings
,
CookieSettings
(
..
),
XsrfCookieSettings
(
..
),
defaultCookieSettings
,
defaultXsrfCookieSettings
,
readKey
,
writeKey
)
import
Servant.Client
(
parseBaseUrl
)
import
Servant.Job.Async
(
newJobEnv
,
defaultSettings
)
import
System.Directory
--
import System.FileLock (tryLockFile, unlockFile, SharedExclusive(Exclusive))
import
System.FileLock
(
tryLockFile
,
unlockFile
,
SharedExclusive
(
Exclusive
))
import
System.IO
(
FilePath
,
hClose
)
import
System.IO.Temp
(
withTempFile
)
import
System.Log.FastLogger
import
qualified
Data.ByteString.Lazy
as
L
import
Gargantext.API.Admin.EnvTypes
import
Gargantext.API.Admin.Types
import
Gargantext.API.Ngrams.Types
(
NgramsRepo
,
HasRepo
(
..
),
RepoEnv
(
..
),
r_version
,
initRepo
,
renv_var
,
renv_lock
)
import
Gargantext.Database.Prelude
(
databaseParameters
,
HasConfig
(
..
))
import
Gargantext.Prelude
import
Gargantext.Prelude.Config
(
gc_repofilepath
)
devSettings
::
FilePath
->
IO
Settings
devSettings
jwkFile
=
do
jwkExists
<-
doesFileExist
jwkFile
...
...
@@ -109,7 +113,7 @@ repoSaverAction repoDir a = do
{-
--
{-
-- The use of mkDebounce makes sure that repoSaverAction is not called too often.
-- If repoSaverAction start taking more time than the debounceFreq then it should
-- be increased.
...
...
@@ -158,7 +162,7 @@ readRepoEnv repoDir = do
-- TODO save in DB here
saver
<-
mkRepoSaver
repoDir
mvar
pure
$
RepoEnv
{
_renv_var
=
mvar
,
_renv_saver
=
saver
,
_renv_lock
=
lock
}
-}
-
-
}
devJwkFile
::
FilePath
devJwkFile
=
"dev.jwk"
...
...
@@ -174,7 +178,7 @@ newEnv port file = do
self_url_env
<-
parseBaseUrl
$
"http://0.0.0.0:"
<>
show
port
dbParam
<-
databaseParameters
file
pool
<-
newPool
dbParam
--
repo <- readRepoEnv (_gc_repofilepath config_env)
repo
<-
readRepoEnv
(
_gc_repofilepath
config_env
)
nodeStory_env
<-
readNodeStoryEnv
(
_gc_repofilepath
config_env
)
scrapers_env
<-
newJobEnv
defaultSettings
manager_env
logger
<-
newStderrLoggerSet
defaultBufSize
...
...
@@ -183,7 +187,7 @@ newEnv port file = do
{
_env_settings
=
settings'
,
_env_logger
=
logger
,
_env_pool
=
pool
--
, _env_repo = repo
,
_env_repo
=
repo
,
_env_nodeStory
=
nodeStory_env
,
_env_manager
=
manager_env
,
_env_scrapers
=
scrapers_env
...
...
@@ -194,10 +198,10 @@ newEnv port file = do
newPool
::
ConnectInfo
->
IO
(
Pool
Connection
)
newPool
param
=
createPool
(
connect
param
)
close
1
(
60
*
60
)
8
{-
--
{-
cleanEnv
::
(
HasConfig
env
,
HasRepo
env
)
=>
env
->
IO
()
cleanEnv
env
=
do
r
<-
takeMVar
(
env
^.
repoEnv
.
renv_var
)
repoSaverAction
(
env
^.
hasConfig
.
gc_repofilepath
)
r
unlockFile
(
env
^.
repoEnv
.
renv_lock
)
-}
-
-
}
src/Gargantext/API/Dev.hs
View file @
a3dc2f3f
...
...
@@ -31,8 +31,7 @@ type IniPath = FilePath
withDevEnv
::
IniPath
->
(
DevEnv
->
IO
a
)
->
IO
a
withDevEnv
iniPath
k
=
do
env
<-
newDevEnv
k
env
-- k env `finally` cleanEnv env
k
env
`
finally
`
cleanEnv
env
where
newDevEnv
=
do
...
...
@@ -40,9 +39,11 @@ withDevEnv iniPath k = do
dbParam
<-
databaseParameters
iniPath
nodeStory_env
<-
readNodeStoryEnv
(
_gc_repofilepath
cfg
)
pool
<-
newPool
dbParam
repo
<-
readRepoEnv
(
_gc_repofilepath
cfg
)
setts
<-
devSettings
devJwkFile
pure
$
DevEnv
{
_dev_env_pool
=
pool
,
_dev_env_repo
=
repo
,
_dev_env_nodeStory
=
nodeStory_env
,
_dev_env_settings
=
setts
,
_dev_env_config
=
cfg
...
...
src/Gargantext/API/Ngrams/Tools.hs
View file @
a3dc2f3f
...
...
@@ -36,6 +36,13 @@ mergeNgramsElement _neOld neNew = neNew
type
RootTerm
=
NgramsTerm
getRepo
::
RepoCmdM
env
err
m
=>
m
NgramsRepo
getRepo
=
do
v
<-
view
repoVar
liftBase
$
readMVar
v
getRepo'
::
HasNodeStory
env
err
m
=>
[
ListId
]
->
m
NodeListStory
getRepo'
listIds
=
do
...
...
src/Gargantext/API/Ngrams/Types.hs
View file @
a3dc2f3f
...
...
@@ -12,7 +12,7 @@ module Gargantext.API.Ngrams.Types where
import
Codec.Serialise
(
Serialise
())
import
Control.Category
((
>>>
))
import
Control.Concurrent
import
Control.Lens
(
makeLenses
,
makePrisms
,
Iso
'
,
iso
,
from
,
(
.~
),
(
?=
),
(
#
),
to
,
folded
,
{-withIndex, ifolded,-}
view
,
use
,
(
^.
),
(
^?
),
(
%~
),
(
.~
),
(
%=
),
at
,
_Just
,
Each
(
..
),
itraverse_
,
both
,
forOf_
,
(
?~
))
import
Control.Lens
(
makeLenses
,
makePrisms
,
Iso
'
,
iso
,
from
,
(
.~
),
(
?=
),
(
#
),
to
,
folded
,
{-withIndex, ifolded,-}
view
,
use
,
(
^.
),
(
^?
),
(
%~
),
(
.~
),
(
%=
),
at
,
_Just
,
Each
(
..
),
itraverse_
,
both
,
forOf_
,
(
?~
)
,
Getter
)
import
Control.Monad.State
import
Data.Aeson
hiding
((
.=
))
import
Data.Aeson.TH
(
deriveJSON
)
...
...
@@ -33,7 +33,7 @@ import GHC.Generics (Generic)
import
Gargantext.Core.Text
(
size
)
import
Gargantext.Core.Types
(
ListType
(
..
),
ListId
,
NodeId
,
TODO
)
import
Gargantext.Core.Utils.Prefix
(
unPrefix
,
unPrefixUntagged
,
unPrefixSwagger
,
wellNamedSchema
)
import
Gargantext.Database.Prelude
(
fromField'
)
import
Gargantext.Database.Prelude
(
fromField'
,
HasConnectionPool
,
HasConfig
,
CmdM
'
)
import
Gargantext.Prelude
import
Gargantext.Prelude.Crypto.Hash
(
IsHashable
(
..
))
import
Protolude
(
maybeToEither
)
...
...
@@ -719,7 +719,6 @@ data RepoEnv = RepoEnv
makeLenses
''
R
epoEnv
{-
type
RepoCmdM
env
err
m
=
(
CmdM'
env
err
m
,
HasRepo
env
...
...
@@ -744,7 +743,6 @@ instance HasRepoVar RepoEnv where
repoVar
=
renv_var
instance
HasRepoSaver
RepoEnv
where
repoSaver
=
renv_saver
-}
------------------------------------------------------------------------
...
...
src/Gargantext/Core/NodeStory.hs
View file @
a3dc2f3f
...
...
@@ -15,13 +15,15 @@ Portability : POSIX
module
Gargantext.Core.NodeStory
where
import
Codec.Serialise
(
Serialise
(),
serialise
,
deserialise
)
-- import Debug.Trace (traceShow)
import
Codec.Serialise
(
serialise
,
deserialise
)
import
Codec.Serialise.Class
import
Control.Concurrent
(
MVar
(),
withMVar
,
newMVar
)
import
Control.Debounce
(
mkDebounce
,
defaultDebounceSettings
,
debounceFreq
,
debounceAction
)
import
Control.Lens
(
makeLenses
,
Getter
,
(
^.
))
import
Control.Monad.Except
import
Control.Monad.Reader
import
Data.Aeson
hiding
((
.=
))
import
Data.Aeson
hiding
((
.=
)
,
decode
)
import
Data.Map.Strict
(
Map
)
import
Data.Maybe
(
fromMaybe
)
import
Data.Monoid
...
...
@@ -36,10 +38,10 @@ import Gargantext.Prelude
import
System.Directory
(
renameFile
,
createDirectoryIfMissing
,
doesFileExist
)
import
System.IO
(
FilePath
,
hClose
)
import
System.IO.Temp
(
withTempFile
)
import
qualified
Data.ByteString.Lazy
as
L
import
qualified
Data.List
as
List
import
qualified
Data.Map.Strict
as
Map
import
qualified
Data.Map.Strict.Patch.Internal
as
Patch
import
qualified
Data.ByteString.Lazy
as
DB
L
import
qualified
Data.List
as
List
import
qualified
Data.Map.Strict
as
Map
import
qualified
Data.Map.Strict.Patch.Internal
as
Patch
import
qualified
Gargantext.Database.Query.Table.Ngrams
as
TableNgrams
------------------------------------------------------------------------
...
...
@@ -84,7 +86,7 @@ mkNodeStorySaver nsd mvns = mkDebounce settings
where
settings
=
defaultDebounceSettings
{
debounceAction
=
withMVar
mvns
(
writeNodeStories
nsd
)
,
debounceFreq
=
1
0
*
minute
,
debounceFreq
=
1
*
minute
-- , debounceEdge = trailingEdge -- Trigger on the trailing edge
}
minute
=
60
*
second
...
...
@@ -117,9 +119,16 @@ nodeStoryRead nsd ni = do
let
nsp
=
nodeStoryPath
nsd
ni
exists
<-
doesFileExist
nsp
if
exists
then
deserialise
<$>
L
.
readFile
nsp
then
deserialise
<$>
DB
L
.
readFile
nsp
else
pure
(
initNodeStory
ni
)
nodeStoryRead_test
::
NodeStoryDir
->
NodeId
->
IO
(
Maybe
[
TableNgrams
.
NgramsType
])
nodeStoryRead_test
nsd
ni
=
nodeStoryRead
nsd
ni
>>=
\
n
->
pure
$
fmap
Map
.
keys
$
fmap
_a_state
$
Map
.
lookup
ni
$
_unNodeStory
n
------------------------------------------------------------------------
type
NodeStoryDir
=
FilePath
...
...
@@ -140,7 +149,7 @@ saverAction' :: NodeStoryDir -> NodeId -> Serialise a => a -> IO ()
saverAction'
repoDir
nId
a
=
do
withTempFile
repoDir
((
cs
$
show
nId
)
<>
"-tmp-repo.cbor"
)
$
\
fp
h
->
do
printDebug
"repoSaverAction"
fp
L
.
hPut
h
$
serialise
a
DB
L
.
hPut
h
$
serialise
a
hClose
h
renameFile
fp
(
nodeStoryPath
repoDir
nId
)
...
...
@@ -150,7 +159,6 @@ nodeStoryPath repoDir nId = repoDir <> "/" <> filename
filename
=
"repo"
<>
"-"
<>
(
cs
$
show
nId
)
<>
".cbor"
------------------------------------------------------------------------
-- TODO : repo Migration TODO TESTS
repoMigration
::
NodeStoryDir
->
NgramsRepo
->
IO
()
...
...
@@ -165,24 +173,34 @@ repoToNodeListStory (Repo _v s h) = NodeStory $ Map.fromList ns
->
(
n
,
let
hs
=
fromMaybe
[]
(
Map
.
lookup
n
h'
)
in
Archive
(
List
.
length
hs
)
ns'
hs
)
)
s'
)
$
Map
.
toList
s'
ngramsState_migration
::
NgramsState
->
[(
NodeId
,
NgramsState'
)]
->
Map
NodeId
NgramsState'
ngramsState_migration
ns
=
[
(
nid
,
Map
.
singleton
nt
table
)
|
(
nt
,
nTable
)
<-
Map
.
toList
ns
,
(
nid
,
table
)
<-
Map
.
toList
nTable
]
Map
.
fromListWith
(
Map
.
union
)
$
List
.
concat
$
map
(
\
(
nt
,
nTable
)
->
map
(
\
(
nid
,
table
)
->
(
nid
,
Map
.
singleton
nt
table
)
)
$
Map
.
toList
nTable
)
$
Map
.
toList
ns
ngramsStatePatch_migration
::
[
NgramsStatePatch
]
->
Map
NodeId
[
NgramsStatePatch'
]
ngramsStatePatch_migration
np'
=
Map
.
fromListWith
(
<>
)
[
(
nid
,
[
fst
$
Patch
.
singleton
nt
table
])
|
np
<-
np'
,
(
nt
,
nTable
)
<-
Patch
.
toList
np
,
(
nid
,
table
)
<-
Patch
.
toList
nTable
]
$
List
.
concat
$
map
toPatch
np'
where
toPatch
::
NgramsStatePatch
->
[(
NodeId
,
[
NgramsStatePatch'
])]
toPatch
p
=
List
.
concat
$
map
(
\
(
nt
,
nTable
)
->
map
(
\
(
nid
,
table
)
->
(
nid
,
[
fst
$
Patch
.
singleton
nt
table
])
)
$
Patch
.
toList
nTable
)
$
Patch
.
toList
p
------------------------------------------------------------------------
...
...
@@ -230,7 +248,6 @@ instance (ToJSON s, ToJSON p) => ToJSON (Archive s p) where
toEncoding
=
genericToEncoding
$
unPrefix
"_a_"
------------------------------------------------------------------------
initNodeStory
::
Monoid
s
=>
NodeId
->
NodeStory
s
p
initNodeStory
ni
=
NodeStory
$
Map
.
singleton
ni
initArchive
...
...
@@ -240,7 +257,7 @@ initArchive = Archive 0 mempty []
initNodeListStoryMock
::
NodeListStory
initNodeListStoryMock
=
NodeStory
$
Map
.
singleton
nodeListId
archive
where
nodeListId
=
1
0
nodeListId
=
0
archive
=
Archive
0
ngramsTableMap
[]
ngramsTableMap
=
Map
.
singleton
TableNgrams
.
NgramsTerms
$
Map
.
fromList
...
...
@@ -248,6 +265,9 @@ initNodeListStoryMock = NodeStory $ Map.singleton nodeListId archive
|
n
<-
mockTable
^.
_NgramsTable
]
------------------------------------------------------------------------
------------------------------------------------------------------------
-- | Lenses at the bottom of the file because Template Haskell would reorder order of execution in others cases
makeLenses
''
N
odeStoryEnv
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment