Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
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
Grégoire Locqueville
haskell-gargantext
Commits
2faf39cc
Commit
2faf39cc
authored
Mar 27, 2023
by
Alfredo Di Napoli
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Remove need for liftBase when using the jobs api
parent
80dda00e
Changes
17
Hide whitespace changes
Inline
Side-by-side
Showing
17 changed files
with
93 additions
and
68 deletions
+93
-68
Auth.hs
src/Gargantext/API/Admin/Auth.hs
+1
-1
Ngrams.hs
src/Gargantext/API/Ngrams.hs
+1
-1
List.hs
src/Gargantext/API/Ngrams/List.hs
+2
-2
Contact.hs
src/Gargantext/API/Node/Contact.hs
+3
-3
DocumentUpload.hs
src/Gargantext/API/Node/DocumentUpload.hs
+1
-1
DocumentsFromWriteNodes.hs
src/Gargantext/API/Node/DocumentsFromWriteNodes.hs
+1
-4
File.hs
src/Gargantext/API/Node/File.hs
+1
-1
FrameCalcUpload.hs
src/Gargantext/API/Node/FrameCalcUpload.hs
+1
-1
New.hs
src/Gargantext/API/Node/New.hs
+1
-1
Update.hs
src/Gargantext/API/Node/Update.hs
+3
-3
Routes.hs
src/Gargantext/API/Routes.hs
+4
-4
API.hs
src/Gargantext/Core/Viz/Graph/API.hs
+1
-1
Jobs.hs
src/Gargantext/Utils/Jobs.hs
+1
-1
Internal.hs
src/Gargantext/Utils/Jobs/Internal.hs
+3
-3
Map.hs
src/Gargantext/Utils/Jobs/Map.hs
+5
-1
Monad.hs
src/Gargantext/Utils/Jobs/Monad.hs
+22
-11
Main.hs
tests/queue/Main.hs
+42
-29
No files found.
src/Gargantext/API/Admin/Auth.hs
View file @
2faf39cc
...
@@ -269,7 +269,7 @@ type ForgotPasswordAsyncAPI = Summary "Forgot password asnc"
...
@@ -269,7 +269,7 @@ type ForgotPasswordAsyncAPI = Summary "Forgot password asnc"
forgotPasswordAsync
::
ServerT
ForgotPasswordAsyncAPI
(
GargM
Env
GargError
)
forgotPasswordAsync
::
ServerT
ForgotPasswordAsyncAPI
(
GargM
Env
GargError
)
forgotPasswordAsync
=
forgotPasswordAsync
=
serveJobsAPI
ForgotPasswordJob
$
\
jHandle
p
->
serveJobsAPI
ForgotPasswordJob
$
\
jHandle
p
->
forgotPasswordAsync'
p
(
liftBase
.
jobHandleLogger
jHandle
)
forgotPasswordAsync'
p
(
jobHandleLogger
jHandle
)
forgotPasswordAsync'
::
(
FlowCmdM
env
err
m
)
forgotPasswordAsync'
::
(
FlowCmdM
env
err
m
)
=>
ForgotPasswordAsyncParams
=>
ForgotPasswordAsyncParams
...
...
src/Gargantext/API/Ngrams.hs
View file @
2faf39cc
...
@@ -834,7 +834,7 @@ apiNgramsAsync _dId =
...
@@ -834,7 +834,7 @@ apiNgramsAsync _dId =
let
let
log'
x
=
do
log'
x
=
do
printDebug
"tableNgramsPostChartsAsync"
x
printDebug
"tableNgramsPostChartsAsync"
x
liftBase
$
(
jobHandleLogger
jHandle
)
x
jobHandleLogger
jHandle
x
in
tableNgramsPostChartsAsync
i
log'
in
tableNgramsPostChartsAsync
i
log'
-- Did the given list of ngrams changed since the given version?
-- Did the given list of ngrams changed since the given version?
...
...
src/Gargantext/API/Ngrams/List.hs
View file @
2faf39cc
...
@@ -196,7 +196,7 @@ jsonPostAsync lId =
...
@@ -196,7 +196,7 @@ jsonPostAsync lId =
let
let
log''
x
=
do
log''
x
=
do
-- printDebug "postAsync ListId" x
-- printDebug "postAsync ListId" x
liftBase
$
(
jobHandleLogger
jHandle
)
x
jobHandleLogger
jHandle
x
in
postAsync'
lId
f
log''
in
postAsync'
lId
f
log''
postAsync'
::
FlowCmdM
env
err
m
postAsync'
::
FlowCmdM
env
err
m
...
@@ -292,7 +292,7 @@ csvPostAsync lId =
...
@@ -292,7 +292,7 @@ csvPostAsync lId =
let
log''
x
=
do
let
log''
x
=
do
-- printDebug "[csvPostAsync] filetype" ft
-- printDebug "[csvPostAsync] filetype" ft
-- printDebug "[csvPostAsync] name" n
-- printDebug "[csvPostAsync] name" n
liftBase
$
(
jobHandleLogger
jHandle
)
x
jobHandleLogger
jHandle
x
csvPostAsync'
lId
f
log''
csvPostAsync'
lId
f
log''
...
...
src/Gargantext/API/Node/Contact.hs
View file @
2faf39cc
...
@@ -46,7 +46,7 @@ import Gargantext.Database.Action.Flow.Types (FlowCmdM)
...
@@ -46,7 +46,7 @@ import Gargantext.Database.Action.Flow.Types (FlowCmdM)
import
Gargantext.Database.Admin.Types.Hyperdata
(
HyperdataAnnuaire
(
..
),
HyperdataContact
)
import
Gargantext.Database.Admin.Types.Hyperdata
(
HyperdataAnnuaire
(
..
),
HyperdataContact
)
import
Gargantext.Database.Admin.Types.Hyperdata.Contact
(
hyperdataContact
)
import
Gargantext.Database.Admin.Types.Hyperdata.Contact
(
hyperdataContact
)
import
Gargantext.Database.Admin.Types.Node
import
Gargantext.Database.Admin.Types.Node
import
Gargantext.Prelude
((
$
),
liftBase
,
(
.
),
{-printDebug,-}
pure
)
import
Gargantext.Prelude
((
$
),
{-printDebug,-}
pure
)
import
qualified
Gargantext.Utils.Aeson
as
GUA
import
qualified
Gargantext.Utils.Aeson
as
GUA
import
Gargantext.Utils.Jobs
(
serveJobsAPI
,
jobHandleLogger
)
import
Gargantext.Utils.Jobs
(
serveJobsAPI
,
jobHandleLogger
)
...
@@ -77,8 +77,8 @@ api_async u nId =
...
@@ -77,8 +77,8 @@ api_async u nId =
let
let
log'
x
=
do
log'
x
=
do
-- printDebug "addContact" x
-- printDebug "addContact" x
liftBase
$
(
jobHandleLogger
jHandle
)
x
jobHandleLogger
jHandle
x
in
addContact
u
nId
p
(
liftBase
.
log'
)
in
addContact
u
nId
p
log'
addContact
::
(
HasSettings
env
,
FlowCmdM
env
err
m
)
addContact
::
(
HasSettings
env
,
FlowCmdM
env
err
m
)
=>
User
=>
User
...
...
src/Gargantext/API/Node/DocumentUpload.hs
View file @
2faf39cc
...
@@ -70,7 +70,7 @@ type API = Summary " Document upload"
...
@@ -70,7 +70,7 @@ type API = Summary " Document upload"
api
::
UserId
->
NodeId
->
ServerT
API
(
GargM
Env
GargError
)
api
::
UserId
->
NodeId
->
ServerT
API
(
GargM
Env
GargError
)
api
uId
nId
=
api
uId
nId
=
serveJobsAPI
UploadDocumentJob
$
\
jHandle
q
->
do
serveJobsAPI
UploadDocumentJob
$
\
jHandle
q
->
do
documentUploadAsync
uId
nId
q
(
liftBase
.
jobHandleLogger
jHandle
)
documentUploadAsync
uId
nId
q
(
jobHandleLogger
jHandle
)
documentUploadAsync
::
(
FlowCmdM
env
err
m
)
documentUploadAsync
::
(
FlowCmdM
env
err
m
)
=>
UserId
=>
UserId
...
...
src/Gargantext/API/Node/DocumentsFromWriteNodes.hs
View file @
2faf39cc
...
@@ -71,10 +71,7 @@ instance ToSchema Params
...
@@ -71,10 +71,7 @@ instance ToSchema Params
api
::
UserId
->
NodeId
->
ServerT
API
(
GargM
Env
GargError
)
api
::
UserId
->
NodeId
->
ServerT
API
(
GargM
Env
GargError
)
api
uId
nId
=
api
uId
nId
=
serveJobsAPI
DocumentFromWriteNodeJob
$
\
jHandle
p
->
serveJobsAPI
DocumentFromWriteNodeJob
$
\
jHandle
p
->
let
documentsFromWriteNodes
uId
nId
p
(
jobHandleLogger
jHandle
)
log'
x
=
do
liftBase
$
(
jobHandleLogger
jHandle
)
x
in
documentsFromWriteNodes
uId
nId
p
(
liftBase
.
log'
)
documentsFromWriteNodes
::
(
HasSettings
env
,
FlowCmdM
env
err
m
)
documentsFromWriteNodes
::
(
HasSettings
env
,
FlowCmdM
env
err
m
)
=>
UserId
=>
UserId
...
...
src/Gargantext/API/Node/File.hs
View file @
2faf39cc
...
@@ -106,7 +106,7 @@ fileAsyncApi uId nId =
...
@@ -106,7 +106,7 @@ fileAsyncApi uId nId =
let
let
log'
x
=
do
log'
x
=
do
-- printDebug "addWithFile" x
-- printDebug "addWithFile" x
liftBase
$
(
jobHandleLogger
jHandle
)
x
jobHandleLogger
jHandle
x
in
addWithFile
uId
nId
i
log'
in
addWithFile
uId
nId
i
log'
...
...
src/Gargantext/API/Node/FrameCalcUpload.hs
View file @
2faf39cc
...
@@ -55,7 +55,7 @@ type API = Summary " FrameCalc upload"
...
@@ -55,7 +55,7 @@ type API = Summary " FrameCalc upload"
api
::
UserId
->
NodeId
->
ServerT
API
(
GargM
Env
GargError
)
api
::
UserId
->
NodeId
->
ServerT
API
(
GargM
Env
GargError
)
api
uId
nId
=
api
uId
nId
=
serveJobsAPI
UploadFrameCalcJob
$
\
jHandle
p
->
serveJobsAPI
UploadFrameCalcJob
$
\
jHandle
p
->
frameCalcUploadAsync
uId
nId
p
(
liftBase
.
jobHandleLogger
jHandle
)
(
jobLogInit
5
)
frameCalcUploadAsync
uId
nId
p
(
jobHandleLogger
jHandle
)
(
jobLogInit
5
)
...
...
src/Gargantext/API/Node/New.hs
View file @
2faf39cc
...
@@ -78,7 +78,7 @@ postNodeAsyncAPI
...
@@ -78,7 +78,7 @@ postNodeAsyncAPI
::
UserId
->
NodeId
->
ServerT
PostNodeAsync
(
GargM
Env
GargError
)
::
UserId
->
NodeId
->
ServerT
PostNodeAsync
(
GargM
Env
GargError
)
postNodeAsyncAPI
uId
nId
=
postNodeAsyncAPI
uId
nId
=
serveJobsAPI
NewNodeJob
$
\
jHandle
p
->
serveJobsAPI
NewNodeJob
$
\
jHandle
p
->
postNodeAsync
uId
nId
p
(
liftBase
.
jobHandleLogger
jHandle
)
postNodeAsync
uId
nId
p
(
jobHandleLogger
jHandle
)
------------------------------------------------------------------------
------------------------------------------------------------------------
postNodeAsync
::
FlowCmdM
env
err
m
postNodeAsync
::
FlowCmdM
env
err
m
...
...
src/Gargantext/API/Node/Update.hs
View file @
2faf39cc
...
@@ -43,7 +43,7 @@ import Gargantext.Database.Query.Table.Node (defaultList, getNode)
...
@@ -43,7 +43,7 @@ import Gargantext.Database.Query.Table.Node (defaultList, getNode)
import
Gargantext.Database.Query.Table.Node.UpdateOpaleye
(
updateHyperdata
)
import
Gargantext.Database.Query.Table.Node.UpdateOpaleye
(
updateHyperdata
)
import
Gargantext.Database.Schema.Ngrams
(
NgramsType
(
NgramsTerms
))
import
Gargantext.Database.Schema.Ngrams
(
NgramsType
(
NgramsTerms
))
import
Gargantext.Database.Schema.Node
(
node_parent_id
)
import
Gargantext.Database.Schema.Node
(
node_parent_id
)
import
Gargantext.Prelude
(
Bool
(
..
),
Ord
,
Eq
,
(
<$>
),
(
$
),
liftBase
,
(
.
),
{-printDebug,-}
pure
,
show
,
cs
,
(
<>
),
panic
,
(
<*>
))
import
Gargantext.Prelude
(
Bool
(
..
),
Ord
,
Eq
,
(
<$>
),
(
$
),
{-printDebug,-}
pure
,
show
,
cs
,
(
<>
),
panic
,
(
<*>
))
import
Gargantext.Utils.Jobs
(
serveJobsAPI
,
jobHandleLogger
)
import
Gargantext.Utils.Jobs
(
serveJobsAPI
,
jobHandleLogger
)
import
Prelude
(
Enum
,
Bounded
,
minBound
,
maxBound
)
import
Prelude
(
Enum
,
Bounded
,
minBound
,
maxBound
)
import
Servant
import
Servant
...
@@ -98,8 +98,8 @@ api uId nId =
...
@@ -98,8 +98,8 @@ api uId nId =
let
let
log'
x
=
do
log'
x
=
do
-- printDebug "updateNode" x
-- printDebug "updateNode" x
liftBase
$
(
jobHandleLogger
jHandle
)
x
jobHandleLogger
jHandle
x
in
updateNode
uId
nId
p
(
liftBase
.
log'
)
in
updateNode
uId
nId
p
log'
updateNode
::
(
HasSettings
env
,
FlowCmdM
env
err
m
)
updateNode
::
(
HasSettings
env
,
FlowCmdM
env
err
m
)
=>
UserId
=>
UserId
...
...
src/Gargantext/API/Routes.hs
View file @
2faf39cc
...
@@ -284,7 +284,7 @@ addCorpusWithQuery :: User -> ServerT New.AddWithQuery (GargM Env GargError)
...
@@ -284,7 +284,7 @@ addCorpusWithQuery :: User -> ServerT New.AddWithQuery (GargM Env GargError)
addCorpusWithQuery
user
cid
=
addCorpusWithQuery
user
cid
=
serveJobsAPI
AddCorpusQueryJob
$
\
jHandle
q
->
do
serveJobsAPI
AddCorpusQueryJob
$
\
jHandle
q
->
do
limit
<-
view
$
hasConfig
.
gc_max_docs_scrapers
limit
<-
view
$
hasConfig
.
gc_max_docs_scrapers
New
.
addToCorpusWithQuery
user
cid
q
(
Just
limit
)
(
liftBase
.
jobHandleLogger
jHandle
)
New
.
addToCorpusWithQuery
user
cid
q
(
Just
limit
)
(
jobHandleLogger
jHandle
)
{- let log' x = do
{- let log' x = do
printDebug "addToCorpusWithQuery" x
printDebug "addToCorpusWithQuery" x
liftBase $ log x
liftBase $ log x
...
@@ -296,7 +296,7 @@ addCorpusWithForm user cid =
...
@@ -296,7 +296,7 @@ addCorpusWithForm user cid =
let
let
log''
x
=
do
log''
x
=
do
--printDebug "[addToCorpusWithForm] " x
--printDebug "[addToCorpusWithForm] " x
liftBase
$
(
jobHandleLogger
jHandle
)
x
jobHandleLogger
jHandle
x
in
New
.
addToCorpusWithForm
user
cid
i
log''
(
jobLogInit
3
)
in
New
.
addToCorpusWithForm
user
cid
i
log''
(
jobLogInit
3
)
addCorpusWithFile
::
User
->
ServerT
New
.
AddWithFile
(
GargM
Env
GargError
)
addCorpusWithFile
::
User
->
ServerT
New
.
AddWithFile
(
GargM
Env
GargError
)
...
@@ -305,10 +305,10 @@ addCorpusWithFile user cid =
...
@@ -305,10 +305,10 @@ addCorpusWithFile user cid =
let
let
log''
x
=
do
log''
x
=
do
-- printDebug "[addToCorpusWithFile]" x
-- printDebug "[addToCorpusWithFile]" x
liftBase
$
(
jobHandleLogger
jHandle
)
x
jobHandleLogger
jHandle
x
in
New
.
addToCorpusWithFile
user
cid
i
log''
in
New
.
addToCorpusWithFile
user
cid
i
log''
addAnnuaireWithForm
::
ServerT
Annuaire
.
AddWithForm
(
GargM
Env
GargError
)
addAnnuaireWithForm
::
ServerT
Annuaire
.
AddWithForm
(
GargM
Env
GargError
)
addAnnuaireWithForm
cid
=
addAnnuaireWithForm
cid
=
serveJobsAPI
AddAnnuaireFormJob
$
\
jHandle
i
->
serveJobsAPI
AddAnnuaireFormJob
$
\
jHandle
i
->
Annuaire
.
addToAnnuaireWithForm
cid
i
(
liftBase
.
jobHandleLogger
jHandle
)
Annuaire
.
addToAnnuaireWithForm
cid
i
(
jobHandleLogger
jHandle
)
src/Gargantext/Core/Viz/Graph/API.hs
View file @
2faf39cc
...
@@ -258,7 +258,7 @@ type GraphAsyncAPI = Summary "Recompute graph"
...
@@ -258,7 +258,7 @@ type GraphAsyncAPI = Summary "Recompute graph"
graphAsync
::
UserId
->
NodeId
->
ServerT
GraphAsyncAPI
(
GargM
Env
GargError
)
graphAsync
::
UserId
->
NodeId
->
ServerT
GraphAsyncAPI
(
GargM
Env
GargError
)
graphAsync
u
n
=
graphAsync
u
n
=
serveJobsAPI
RecomputeGraphJob
$
\
jHandle
_
->
serveJobsAPI
RecomputeGraphJob
$
\
jHandle
_
->
graphRecompute
u
n
(
liftBase
.
jobHandleLogger
jHandle
)
graphRecompute
u
n
(
jobHandleLogger
jHandle
)
--graphRecompute :: UserId
--graphRecompute :: UserId
...
...
src/Gargantext/Utils/Jobs.hs
View file @
2faf39cc
...
@@ -37,7 +37,7 @@ serveJobsAPI
...
@@ -37,7 +37,7 @@ serveJobsAPI
,
m
~
(
GargM
env
GargError
)
,
m
~
(
GargM
env
GargError
)
)
)
=>
JobType
m
=>
JobType
m
->
(
JobHandle
(
JobEventType
m
)
->
input
->
m
(
JobOutputType
m
))
->
(
JobHandle
m
(
JobEventType
m
)
->
input
->
m
(
JobOutputType
m
))
->
SJ
.
AsyncJobsServerT'
ctI
ctO
callbacks
(
JobEventType
m
)
input
(
JobOutputType
m
)
m
->
SJ
.
AsyncJobsServerT'
ctI
ctO
callbacks
(
JobEventType
m
)
input
(
JobOutputType
m
)
m
serveJobsAPI
jobType
f
=
Internal
.
serveJobsAPI
ask
jobType
jobErrorToGargError
$
\
env
jHandle
i
->
do
serveJobsAPI
jobType
f
=
Internal
.
serveJobsAPI
ask
jobType
jobErrorToGargError
$
\
env
jHandle
i
->
do
putStrLn
(
"Running job of type: "
++
show
jobType
)
putStrLn
(
"Running job of type: "
++
show
jobType
)
...
...
src/Gargantext/Utils/Jobs/Internal.hs
View file @
2faf39cc
...
@@ -40,7 +40,7 @@ serveJobsAPI
...
@@ -40,7 +40,7 @@ serveJobsAPI
=>
m
env
=>
m
env
->
t
->
t
->
(
JobError
->
e
)
->
(
JobError
->
e
)
->
(
env
->
JobHandle
event
->
input
->
IO
(
Either
e
output
))
->
(
env
->
JobHandle
m
event
->
input
->
IO
(
Either
e
output
))
->
SJ
.
AsyncJobsServerT'
ctI
ctO
callback
event
input
output
m
->
SJ
.
AsyncJobsServerT'
ctI
ctO
callback
event
input
output
m
serveJobsAPI
getenv
t
joberr
f
serveJobsAPI
getenv
t
joberr
f
=
newJob
getenv
t
f
(
SJ
.
JobInput
undefined
Nothing
)
=
newJob
getenv
t
f
(
SJ
.
JobInput
undefined
Nothing
)
...
@@ -76,7 +76,7 @@ newJob
...
@@ -76,7 +76,7 @@ newJob
)
)
=>
m
env
=>
m
env
->
t
->
t
->
(
env
->
JobHandle
event
->
input
->
IO
(
Either
e
output
))
->
(
env
->
JobHandle
m
event
->
input
->
IO
(
Either
e
output
))
->
SJ
.
JobInput
callbacks
input
->
SJ
.
JobInput
callbacks
input
->
m
(
SJ
.
JobStatus
'S
J
.
Safe
event
)
->
m
(
SJ
.
JobStatus
'S
J
.
Safe
event
)
newJob
getenv
jobkind
f
input
=
do
newJob
getenv
jobkind
f
input
=
do
...
@@ -91,7 +91,7 @@ newJob getenv jobkind f input = do
...
@@ -91,7 +91,7 @@ newJob getenv jobkind f input = do
logF
w
logF
w
f'
jId
inp
logF
=
do
f'
jId
inp
logF
=
do
r
<-
f
env
(
mkJobHandle
jId
(
pushLog
logF
.
Seq
.
singleton
))
inp
r
<-
f
env
(
mkJobHandle
jId
(
liftIO
.
pushLog
logF
.
Seq
.
singleton
))
inp
case
r
of
case
r
of
Left
e
->
postCallback
(
SJ
.
mkChanError
e
)
>>
throwIO
e
Left
e
->
postCallback
(
SJ
.
mkChanError
e
)
>>
throwIO
e
Right
a
->
postCallback
(
SJ
.
mkChanResult
a
)
>>
return
a
Right
a
->
postCallback
(
SJ
.
mkChanResult
a
)
>>
return
a
...
...
src/Gargantext/Utils/Jobs/Map.hs
View file @
2faf39cc
...
@@ -6,6 +6,7 @@ module Gargantext.Utils.Jobs.Map (
...
@@ -6,6 +6,7 @@ module Gargantext.Utils.Jobs.Map (
,
J
(
..
)
,
J
(
..
)
,
QueuedJob
(
..
)
,
QueuedJob
(
..
)
,
RunningJob
(
..
)
,
RunningJob
(
..
)
,
LoggerM
,
Logger
,
Logger
-- * Functions
-- * Functions
...
@@ -75,9 +76,12 @@ data RunningJob w a = RunningJob
...
@@ -75,9 +76,12 @@ data RunningJob w a = RunningJob
,
rjGetLog
::
IO
w
,
rjGetLog
::
IO
w
}
}
-- | Polymorphic logger over any monad @m@.
type
LoggerM
m
w
=
w
->
m
()
-- | A @'Logger' w@ is a function that can do something with "messages" of type
-- | A @'Logger' w@ is a function that can do something with "messages" of type
-- @w@ in IO.
-- @w@ in IO.
type
Logger
w
=
w
->
IO
()
type
Logger
w
=
LoggerM
IO
w
newJobMap
::
IO
(
JobMap
jid
w
a
)
newJobMap
::
IO
(
JobMap
jid
w
a
)
newJobMap
=
JobMap
<$>
newTVarIO
Map
.
empty
newJobMap
=
JobMap
<$>
newTVarIO
Map
.
empty
...
...
src/Gargantext/Utils/Jobs/Monad.hs
View file @
2faf39cc
...
@@ -11,6 +11,7 @@ module Gargantext.Utils.Jobs.Monad (
...
@@ -11,6 +11,7 @@ module Gargantext.Utils.Jobs.Monad (
-- * Tracking jobs status
-- * Tracking jobs status
,
MonadJobStatus
(
..
)
,
MonadJobStatus
(
..
)
,
getLatestJobStatus
,
getLatestJobStatus
,
updateJobProgress
-- * Functions
-- * Functions
,
newJobEnv
,
newJobEnv
...
@@ -179,17 +180,17 @@ removeJob queued t jid = do
...
@@ -179,17 +180,17 @@ removeJob queued t jid = do
-- | An opaque handle that abstracts over the concrete identifier for
-- | An opaque handle that abstracts over the concrete identifier for
-- a job. The constructor for this type is deliberately not exported.
-- a job. The constructor for this type is deliberately not exported.
data
JobHandle
event
=
JobHandle
{
data
JobHandle
m
event
=
JobHandle
{
_jh_id
::
!
(
SJ
.
JobID
'S
J
.
Safe
)
_jh_id
::
!
(
SJ
.
JobID
'S
J
.
Safe
)
,
_jh_logger
::
Logger
event
,
_jh_logger
::
Logger
M
m
event
}
}
-- | Creates a new 'JobHandle', given its underlying 'JobID' and the logging function to
-- | Creates a new 'JobHandle', given its underlying 'JobID' and the logging function to
-- be used to report the status.
-- be used to report the status.
mkJobHandle
::
SJ
.
JobID
'S
J
.
Safe
->
Logger
event
->
JobHandle
event
mkJobHandle
::
SJ
.
JobID
'S
J
.
Safe
->
Logger
M
m
event
->
JobHandle
m
event
mkJobHandle
jId
=
JobHandle
jId
mkJobHandle
jId
=
JobHandle
jId
jobHandleLogger
::
JobHandle
event
->
Logger
event
jobHandleLogger
::
JobHandle
m
event
->
LoggerM
m
event
jobHandleLogger
(
JobHandle
_
lgr
)
=
lgr
jobHandleLogger
(
JobHandle
_
lgr
)
=
lgr
-- | A monad to query for the status of a particular job /and/ submit updates for in-progress jobs.
-- | A monad to query for the status of a particular job /and/ submit updates for in-progress jobs.
...
@@ -198,19 +199,13 @@ class MonadJob m (JobType m) (Seq (JobEventType m)) (JobOutputType m) => MonadJo
...
@@ -198,19 +199,13 @@ class MonadJob m (JobType m) (Seq (JobEventType m)) (JobOutputType m) => MonadJo
type
JobOutputType
m
::
Type
type
JobOutputType
m
::
Type
type
JobEventType
m
::
Type
type
JobEventType
m
::
Type
instance
MonadIO
m
=>
MonadJobStatus
(
ReaderT
(
JobEnv
t
(
Seq
event
)
a
)
m
)
where
type
JobType
(
ReaderT
(
JobEnv
t
(
Seq
event
)
a
)
m
)
=
t
type
JobOutputType
(
ReaderT
(
JobEnv
t
(
Seq
event
)
a
)
m
)
=
a
type
JobEventType
(
ReaderT
(
JobEnv
t
(
Seq
event
)
a
)
m
)
=
event
--
--
-- Tracking jobs status API
-- Tracking jobs status API
--
--
-- | Retrevies the latest 'JobEventType' from the underlying monad. It can be
-- | Retrevies the latest 'JobEventType' from the underlying monad. It can be
-- used to query the latest status for a particular job, given its 'JobHandle' as input.
-- used to query the latest status for a particular job, given its 'JobHandle' as input.
getLatestJobStatus
::
MonadJobStatus
m
=>
JobHandle
(
JobEventType
m
)
->
m
(
Maybe
(
JobEventType
m
))
getLatestJobStatus
::
MonadJobStatus
m
=>
JobHandle
m
(
JobEventType
m
)
->
m
(
Maybe
(
JobEventType
m
))
getLatestJobStatus
(
JobHandle
jId
_
)
=
do
getLatestJobStatus
(
JobHandle
jId
_
)
=
do
mb_jb
<-
findJob
jId
mb_jb
<-
findJob
jId
case
mb_jb
of
case
mb_jb
of
...
@@ -224,3 +219,19 @@ getLatestJobStatus (JobHandle jId _) = do
...
@@ -224,3 +219,19 @@ getLatestJobStatus (JobHandle jId _) = do
DoneJ
lgs
_
->
pure
$
case
viewr
lgs
of
DoneJ
lgs
_
->
pure
$
case
viewr
lgs
of
EmptyR
->
Nothing
EmptyR
->
Nothing
_
:>
l
->
Just
l
_
:>
l
->
Just
l
updateJobProgress
::
(
Monoid
(
JobEventType
m
),
MonadJobStatus
m
)
=>
JobHandle
m
(
JobEventType
m
)
-- ^ The handle that uniquely identifies this job.
->
(
JobEventType
m
->
JobEventType
m
)
-- ^ A /pure/ function to update the 'JobEventType'. The input
-- is the /latest/ event, i.e. the current progress status. If
-- this is the first time we report progress and therefore there
-- is no previous progress status, this function will be applied
-- over 'mempty', thus the 'Monoid' constraint.
->
m
()
updateJobProgress
hdl
@
(
JobHandle
_jId
logStatus
)
updateJobStatus
=
do
latestStatus
<-
getLatestJobStatus
hdl
case
latestStatus
of
Nothing
->
logStatus
(
updateJobStatus
mempty
)
Just
s
->
logStatus
(
updateJobStatus
s
)
tests/queue/Main.hs
View file @
2faf39cc
...
@@ -11,7 +11,6 @@ import Control.Concurrent.STM
...
@@ -11,7 +11,6 @@ import Control.Concurrent.STM
import
Control.Exception
import
Control.Exception
import
Control.Monad
import
Control.Monad
import
Control.Monad.Reader
import
Control.Monad.Reader
import
Control.Monad.Except
import
Data.Aeson
import
Data.Aeson
import
Data.Either
import
Data.Either
import
Data.List
import
Data.List
...
@@ -162,18 +161,29 @@ instance Exception MyDummyError where
...
@@ -162,18 +161,29 @@ instance Exception MyDummyError where
instance
ToJSON
MyDummyError
where
instance
ToJSON
MyDummyError
where
toJSON
(
SomethingWentWrong
_
)
=
String
"SomethingWentWrong"
toJSON
(
SomethingWentWrong
_
)
=
String
"SomethingWentWrong"
type
Progress
=
Int
data
MyDummyLog
=
data
MyDummyLog
=
Step_0
Step_0
!
Progress
|
Step_1
|
Step_1
!
Progress
deriving
(
Show
,
Eq
,
Ord
,
Generic
)
deriving
(
Show
,
Eq
,
Ord
,
Generic
)
instance
Monoid
MyDummyLog
where
mempty
=
Step_0
0
instance
Semigroup
MyDummyLog
where
_
<>
_
=
error
"not needed"
instance
ToJSON
MyDummyLog
instance
ToJSON
MyDummyLog
newtype
MyDummyEnv
=
MyDummyEnv
{
_MyDummyEnv
::
JobEnv
MyDummyJob
(
Seq
MyDummyLog
)
()
}
newtype
MyDummyEnv
=
MyDummyEnv
{
_MyDummyEnv
::
JobEnv
MyDummyJob
(
Seq
MyDummyLog
)
()
}
newtype
MyDummyMonad
a
=
newtype
MyDummyMonad
a
=
MyDummyMonad
{
_MyDummyMonad
::
ReaderT
MyDummyEnv
(
ExceptT
MyDummyError
IO
)
a
}
MyDummyMonad
{
_MyDummyMonad
::
ReaderT
MyDummyEnv
IO
a
}
deriving
(
Functor
,
Applicative
,
Monad
,
MonadIO
,
MonadReader
MyDummyEnv
,
MonadError
MyDummyError
)
deriving
(
Functor
,
Applicative
,
Monad
,
MonadIO
,
MonadReader
MyDummyEnv
)
runMyDummyMonad
::
MyDummyEnv
->
MyDummyMonad
a
->
IO
a
runMyDummyMonad
env
=
flip
runReaderT
env
.
_MyDummyMonad
instance
MonadJob
MyDummyMonad
MyDummyJob
(
Seq
MyDummyLog
)
()
where
instance
MonadJob
MyDummyMonad
MyDummyJob
(
Seq
MyDummyLog
)
()
where
getJobEnv
=
asks
_MyDummyEnv
getJobEnv
=
asks
_MyDummyEnv
...
@@ -193,14 +203,15 @@ shouldBeE a b = liftIO (shouldBe a b)
...
@@ -193,14 +203,15 @@ shouldBeE a b = liftIO (shouldBe a b)
type
TheEnv
=
JobEnv
MyDummyJob
(
Seq
MyDummyLog
)
()
type
TheEnv
=
JobEnv
MyDummyJob
(
Seq
MyDummyLog
)
()
withJob
::
TheEnv
withJob
::
TheEnv
->
(
TheEnv
->
JobHandle
MyDummyLog
->
()
->
IO
(
Either
MyDummyError
()
))
->
(
TheEnv
->
JobHandle
MyDummyMonad
MyDummyLog
->
()
->
MyDummyMonad
(
Either
MyDummyError
()
))
->
IO
(
Either
MyDummyError
(
SJ
.
JobStatus
'S
J
.
Safe
MyDummyLog
))
->
IO
(
SJ
.
JobStatus
'S
J
.
Safe
MyDummyLog
)
withJob
myEnv
f
=
do
withJob
myEnv
f
=
runMyDummyMonad
(
MyDummyEnv
myEnv
)
$
runExceptT
$
flip
runReaderT
(
MyDummyEnv
myEnv
)
$
_MyDummyMonad
$
do
newJob
@
_
@
MyDummyError
getJobEnv
MyDummyJob
(
\
env
hdl
input
->
newJob
@
_
@
MyDummyError
getJobEnv
MyDummyJob
(
\
env
hdl
input
->
runMyDummyMonad
(
MyDummyEnv
myEnv
)
$
f
env
hdl
input
)
(
SJ
.
JobInput
()
Nothing
)
f
env
hdl
input
)
(
SJ
.
JobInput
()
Nothing
)
withJob_
::
TheEnv
withJob_
::
TheEnv
->
(
TheEnv
->
JobHandle
MyDummyLog
->
()
->
IO
(
Either
MyDummyError
()
))
->
IO
()
->
(
TheEnv
->
JobHandle
MyDummyMonad
MyDummyLog
->
()
->
MyDummyMonad
(
Either
MyDummyError
()
))
->
IO
()
withJob_
env
f
=
void
(
withJob
env
f
)
withJob_
env
f
=
void
(
withJob
env
f
)
testFetchJobStatus
::
IO
()
testFetchJobStatus
::
IO
()
...
@@ -210,19 +221,21 @@ testFetchJobStatus = do
...
@@ -210,19 +221,21 @@ testFetchJobStatus = do
myEnv
<-
newJobEnv
settings
defaultPrios
testTlsManager
myEnv
<-
newJobEnv
settings
defaultPrios
testTlsManager
evts
<-
newMVar
[]
evts
<-
newMVar
[]
withJob_
myEnv
$
\
env
hdl
_input
->
do
withJob_
myEnv
$
\
_
hdl
_input
->
do
mb_status
<-
runReaderT
(
getLatestJobStatus
hdl
)
env
mb_status
<-
getLatestJobStatus
hdl
-- now let's log something
-- now let's log something
jobHandleLogger
hdl
Step_0
updateJobProgress
hdl
(
const
$
Step_0
20
)
mb_status'
<-
runReaderT
(
getLatestJobStatus
hdl
)
env
mb_status'
<-
getLatestJobStatus
hdl
updateJobProgress
hdl
(
\
(
Step_0
x
)
->
Step_0
(
x
+
5
))
mb_status''
<-
getLatestJobStatus
hdl
modifyMVar_
evts
(
\
xs
->
pure
$
mb_status
:
mb_status
'
:
xs
)
liftIO
$
modifyMVar_
evts
(
\
xs
->
pure
$
mb_status
:
mb_status'
:
mb_status'
'
:
xs
)
pure
$
Right
()
pure
$
Right
()
threadDelay
500
_000
threadDelay
500
_000
-- Check the events
-- Check the events
readMVar
evts
>>=
\
expected
->
expected
`
shouldBe
`
[
Nothing
,
Just
Step_0
]
readMVar
evts
>>=
\
expected
->
expected
`
shouldBe
`
[
Nothing
,
Just
(
Step_0
20
),
Just
(
Step_0
25
)
]
testFetchJobStatusNoContention
::
IO
()
testFetchJobStatusNoContention
::
IO
()
testFetchJobStatusNoContention
=
do
testFetchJobStatusNoContention
=
do
...
@@ -233,23 +246,23 @@ testFetchJobStatusNoContention = do
...
@@ -233,23 +246,23 @@ testFetchJobStatusNoContention = do
evts1
<-
newMVar
[]
evts1
<-
newMVar
[]
evts2
<-
newMVar
[]
evts2
<-
newMVar
[]
let
job1
=
\
()
->
withJob_
myEnv
$
\
env
hdl
_input
->
do
let
job1
=
\
()
->
withJob_
myEnv
$
\
_
hdl
_input
->
do
jobHandleLogger
hdl
Step_1
updateJobProgress
hdl
(
const
$
Step_1
100
)
mb_status
<-
runReaderT
(
getLatestJobStatus
hdl
)
env
mb_status
<-
getLatestJobStatus
hdl
modifyMVar_
evts1
(
\
xs
->
pure
$
mb_status
:
xs
)
liftIO
$
modifyMVar_
evts1
(
\
xs
->
pure
$
mb_status
:
xs
)
pure
$
Right
()
pure
$
Right
()
let
job2
=
\
()
->
withJob_
myEnv
$
\
env
hdl
_input
->
do
let
job2
=
\
()
->
withJob_
myEnv
$
\
_
hdl
_input
->
do
jobHandleLogger
hdl
Step_0
updateJobProgress
hdl
(
const
$
Step_0
50
)
mb_status
<-
runReaderT
(
getLatestJobStatus
hdl
)
env
mb_status
<-
getLatestJobStatus
hdl
modifyMVar_
evts2
(
\
xs
->
pure
$
mb_status
:
xs
)
liftIO
$
modifyMVar_
evts2
(
\
xs
->
pure
$
mb_status
:
xs
)
pure
$
Right
()
pure
$
Right
()
Async
.
forConcurrently_
[
job1
,
job2
]
(
$
()
)
Async
.
forConcurrently_
[
job1
,
job2
]
(
$
()
)
threadDelay
500
_000
threadDelay
500
_000
-- Check the events
-- Check the events
readMVar
evts1
>>=
\
expected
->
expected
`
shouldBe
`
[
Just
Step_1
]
readMVar
evts1
>>=
\
expected
->
expected
`
shouldBe
`
[
Just
(
Step_1
100
)
]
readMVar
evts2
>>=
\
expected
->
expected
`
shouldBe
`
[
Just
Step_0
]
readMVar
evts2
>>=
\
expected
->
expected
`
shouldBe
`
[
Just
(
Step_0
50
)
]
main
::
IO
()
main
::
IO
()
main
=
hspec
$
do
main
=
hspec
$
do
...
...
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