Commit d04cf03b authored by Alexandre Delanoë's avatar Alexandre Delanoë

Merge remote-tracking branch 'origin/201-dev-user-pubmed-api-key' into dev

parents e213a4bf 3597eee4
...@@ -74,6 +74,7 @@ data Query m ...@@ -74,6 +74,7 @@ data Query m
, job_logs :: GQLAT.JobLogArgs -> m (Map Int JobLog) , job_logs :: GQLAT.JobLogArgs -> m (Map Int JobLog)
, languages :: GQLNLP.LanguagesArgs -> m GQLNLP.LanguagesMap , languages :: GQLNLP.LanguagesArgs -> m GQLNLP.LanguagesMap
, nodes :: GQLNode.NodeArgs -> m [GQLNode.Node] , nodes :: GQLNode.NodeArgs -> m [GQLNode.Node]
, nodes_corpus :: GQLNode.CorpusArgs -> m [GQLNode.Corpus]
, node_parent :: GQLNode.NodeParentArgs -> m [GQLNode.Node] , node_parent :: GQLNode.NodeParentArgs -> m [GQLNode.Node]
, user_infos :: GQLUserInfo.UserInfoArgs -> m [GQLUserInfo.UserInfo] , user_infos :: GQLUserInfo.UserInfoArgs -> m [GQLUserInfo.UserInfo]
, users :: GQLUser.UserArgs -> m [GQLUser.User m] , users :: GQLUser.UserArgs -> m [GQLUser.User m]
...@@ -117,6 +118,7 @@ rootResolver = ...@@ -117,6 +118,7 @@ rootResolver =
, job_logs = GQLAT.resolveJobLogs , job_logs = GQLAT.resolveJobLogs
, languages = GQLNLP.resolveLanguages , languages = GQLNLP.resolveLanguages
, nodes = GQLNode.resolveNodes , nodes = GQLNode.resolveNodes
, nodes_corpus = GQLNode.resolveNodesCorpus
, node_parent = GQLNode.resolveNodeParent , node_parent = GQLNode.resolveNodeParent
, user_infos = GQLUserInfo.resolveUserInfos , user_infos = GQLUserInfo.resolveUserInfos
, users = GQLUser.resolveUsers , users = GQLUser.resolveUsers
......
...@@ -3,7 +3,9 @@ ...@@ -3,7 +3,9 @@
module Gargantext.API.GraphQL.Node where module Gargantext.API.GraphQL.Node where
import Data.Aeson
import Data.Either (Either(..)) import Data.Either (Either(..))
import qualified Data.HashMap.Strict as HashMap
import Data.Morpheus.Types import Data.Morpheus.Types
( GQLType ( GQLType
, Resolver , Resolver
...@@ -16,23 +18,37 @@ import Gargantext.API.Prelude (GargM, GargError) ...@@ -16,23 +18,37 @@ import Gargantext.API.Prelude (GargM, GargError)
import Gargantext.Database.Admin.Types.Node (NodeId(..), NodeType) import Gargantext.Database.Admin.Types.Node (NodeId(..), NodeType)
import qualified Gargantext.Database.Admin.Types.Node as NN import qualified Gargantext.Database.Admin.Types.Node as NN
import Gargantext.Database.Query.Table.Node (getClosestParentIdByType, getNode) import Gargantext.Database.Query.Table.Node (getClosestParentIdByType, getNode)
import Gargantext.Database.Prelude (CmdCommon) import Gargantext.Database.Prelude (CmdCommon) -- , JSONB)
import qualified Gargantext.Database.Schema.Node as N import qualified Gargantext.Database.Schema.Node as N
import Gargantext.Prelude import Gargantext.Prelude
import GHC.Generics (Generic) import GHC.Generics (Generic)
import qualified Prelude import qualified Prelude
import qualified PUBMED.Types as PUBMED
import Text.Read (readEither) import Text.Read (readEither)
data Corpus = Corpus
{ id :: Int
, name :: Text
, parent_id :: Maybe Int
, pubmedAPIKey :: Maybe PUBMED.APIKey
, type_id :: Int
} deriving (Show, Generic, GQLType)
data Node = Node data Node = Node
{ id :: Int { id :: Int
, name :: Text , name :: Text
, parent_id :: Maybe Int , parent_id :: Maybe Int
, type_id :: Int , type_id :: Int
} deriving (Show, Generic, GQLType) } deriving (Show, Generic, GQLType)
data CorpusArgs
= CorpusArgs
{ corpus_id :: Int
} deriving (Generic, GQLType)
data NodeArgs data NodeArgs
= NodeArgs = NodeArgs
{ node_id :: Int { node_id :: Int
} deriving (Generic, GQLType) } deriving (Generic, GQLType)
type GqlM e env = Resolver QUERY e (GargM env GargError) type GqlM e env = Resolver QUERY e (GargM env GargError)
...@@ -43,6 +59,11 @@ resolveNodes ...@@ -43,6 +59,11 @@ resolveNodes
=> NodeArgs -> GqlM e env [Node] => NodeArgs -> GqlM e env [Node]
resolveNodes NodeArgs { node_id } = dbNodes node_id resolveNodes NodeArgs { node_id } = dbNodes node_id
resolveNodesCorpus
:: (CmdCommon env)
=> CorpusArgs -> GqlM e env [Corpus]
resolveNodesCorpus CorpusArgs { corpus_id } = dbNodesCorpus corpus_id
dbNodes dbNodes
:: (CmdCommon env) :: (CmdCommon env)
=> Int -> GqlM e env [Node] => Int -> GqlM e env [Node]
...@@ -50,6 +71,13 @@ dbNodes node_id = do ...@@ -50,6 +71,13 @@ dbNodes node_id = do
node <- lift $ getNode $ NodeId node_id node <- lift $ getNode $ NodeId node_id
pure [toNode node] pure [toNode node]
dbNodesCorpus
:: (CmdCommon env)
=> Int -> GqlM e env [Corpus]
dbNodesCorpus corpus_id = do
corpus <- lift $ getNode $ NodeId corpus_id
pure [toCorpus corpus]
data NodeParentArgs data NodeParentArgs
= NodeParentArgs = NodeParentArgs
{ node_id :: Int { node_id :: Int
...@@ -79,7 +107,23 @@ dbParentNodes node_id parent_type = do ...@@ -79,7 +107,23 @@ dbParentNodes node_id parent_type = do
pure [toNode node] pure [toNode node]
toNode :: NN.Node json -> Node toNode :: NN.Node json -> Node
toNode (N.Node { .. }) = Node { id = NN.unNodeId _node_id toNode N.Node { .. } = Node { id = NN.unNodeId _node_id
, name = _node_name , name = _node_name
, parent_id = NN.unNodeId <$> _node_parent_id , parent_id = NN.unNodeId <$> _node_parent_id
, type_id = _node_typename } , type_id = _node_typename }
toCorpus :: NN.Node Value -> Corpus
toCorpus N.Node { .. } = Corpus { id = NN.unNodeId _node_id
, name = _node_name
, parent_id = NN.unNodeId <$> _node_parent_id
, pubmedAPIKey = pubmedAPIKeyFromValue _node_hyperdata
, type_id = _node_typename }
pubmedAPIKeyFromValue :: Value -> Maybe PUBMED.APIKey
pubmedAPIKeyFromValue (Object kv) =
case HashMap.lookup "pubmed_api_key" kv of
Nothing -> Nothing
Just v -> case fromJSON v of
Error _ -> Nothing
Success v' -> Just v'
pubmedAPIKeyFromValue _ = Nothing
...@@ -56,7 +56,7 @@ import Gargantext.Database.Action.User (getUserId) ...@@ -56,7 +56,7 @@ import Gargantext.Database.Action.User (getUserId)
import Gargantext.Database.Admin.Types.Hyperdata import Gargantext.Database.Admin.Types.Hyperdata
import Gargantext.Database.Admin.Types.Node (CorpusId, NodeType(..), UserId) import Gargantext.Database.Admin.Types.Node (CorpusId, NodeType(..), UserId)
import Gargantext.Database.Prelude (hasConfig) import Gargantext.Database.Prelude (hasConfig)
import Gargantext.Database.Query.Table.Node (getNodeWith) import Gargantext.Database.Query.Table.Node (getNodeWith, updateCorpusPubmedAPIKey)
import Gargantext.Database.Query.Table.Node.UpdateOpaleye (updateHyperdata) import Gargantext.Database.Query.Table.Node.UpdateOpaleye (updateHyperdata)
import Gargantext.Database.Schema.Node (node_hyperdata) import Gargantext.Database.Schema.Node (node_hyperdata)
import Gargantext.Prelude import Gargantext.Prelude
...@@ -209,6 +209,12 @@ addToCorpusWithQuery user cid (WithQuery { _wq_query = q ...@@ -209,6 +209,12 @@ addToCorpusWithQuery user cid (WithQuery { _wq_query = q
markComplete jobHandle markComplete jobHandle
_ -> do _ -> do
case datafield of
Just (External (PubMed { _api_key })) -> do
printDebug "[addToCorpusWithQuery] pubmed api key" _api_key
_ <- updateCorpusPubmedAPIKey cid _api_key
pure ()
_ -> pure ()
markStarted 3 jobHandle markStarted 3 jobHandle
-- TODO add cid -- TODO add cid
...@@ -227,7 +233,7 @@ addToCorpusWithQuery user cid (WithQuery { _wq_query = q ...@@ -227,7 +233,7 @@ addToCorpusWithQuery user cid (WithQuery { _wq_query = q
markProgress 1 jobHandle markProgress 1 jobHandle
void $ flowDataText user txt (Multi l) cid (Just flw) jobHandle void $ flowDataText user txt (Multi l) cid (Just flw) jobHandle
-- printDebug "corpus id" cids -- printDebug "corpus id" cids
-- printDebug "sending email" ("xxxxxxxxxxxxxxxxxxxxx" :: Text) -- printDebug "sending email" ("xxxxxxxxxxxxxxxxxxxxx" :: Text)
sendMail user sendMail user
-- TODO ... -- TODO ...
......
...@@ -3,28 +3,23 @@ ...@@ -3,28 +3,23 @@
module Gargantext.API.Node.Corpus.Types where module Gargantext.API.Node.Corpus.Types where
import Control.Lens hiding (elements, Empty) import Control.Lens hiding (elements, Empty)
import Control.Monad.Fail (fail)
import Control.Monad.Reader (MonadReader) import Control.Monad.Reader (MonadReader)
import Data.Aeson import Data.Aeson
import Data.Aeson.TH (deriveJSON) import Data.Aeson.TH (deriveJSON)
import Data.Monoid (mempty) import Data.Monoid (mempty)
import Data.Swagger import Data.Swagger
import Data.Text (Text)
import qualified Data.Text as T
import GHC.Generics (Generic) import GHC.Generics (Generic)
import Text.Regex.TDFA ((=~)) import qualified PUBMED.Types as PUBMED
import Protolude ((++))
import Gargantext.Prelude import Gargantext.Prelude
import qualified Gargantext.API.Admin.Orchestrator.Types as T import qualified Gargantext.API.Admin.Orchestrator.Types as T
import Gargantext.Core.Utils.Prefix (unPrefix) import Gargantext.Core.Utils.Prefix (unPrefix)
import Gargantext.Database.Action.Flow (DataOrigin(..)) import Gargantext.Database.Action.Flow (DataOrigin(..))
import Gargantext.Database.Prelude (HasConfig(..)) import Gargantext.Database.Prelude (HasConfig(..))
import Gargantext.Prelude.Config (gc_pubmed_api_key)
data Database = Empty data Database = Empty
| PubMed | PubMed { _api_key :: Maybe PUBMED.APIKey }
| Arxiv | Arxiv
| HAL | HAL
| IsTex | IsTex
...@@ -32,15 +27,16 @@ data Database = Empty ...@@ -32,15 +27,16 @@ data Database = Empty
deriving (Eq, Show, Generic) deriving (Eq, Show, Generic)
deriveJSON (unPrefix "") ''Database deriveJSON (unPrefix "") ''Database
instance ToSchema Database instance ToSchema Database where
declareNamedSchema = genericDeclareNamedSchemaUnrestricted defaultSchemaOptions
database2origin :: ( MonadReader env m database2origin :: ( MonadReader env m
, HasConfig env ) => Database -> m DataOrigin , HasConfig env ) => Database -> m DataOrigin
database2origin Empty = pure $ InternalOrigin T.IsTex database2origin Empty = pure $ InternalOrigin T.IsTex
database2origin PubMed = do database2origin (PubMed { _api_key }) = do
pubmed_api_key <- view $ hasConfig . gc_pubmed_api_key -- pubmed_api_key <- view $ hasConfig . gc_pubmed_api_key
pure $ ExternalOrigin $ T.PubMed { mAPIKey = Just pubmed_api_key } pure $ ExternalOrigin $ T.PubMed { mAPIKey = _api_key }
database2origin Arxiv = pure $ ExternalOrigin T.Arxiv database2origin Arxiv = pure $ ExternalOrigin T.Arxiv
database2origin HAL = pure $ ExternalOrigin T.HAL database2origin HAL = pure $ ExternalOrigin T.HAL
database2origin IsTex = pure $ ExternalOrigin T.IsTex database2origin IsTex = pure $ ExternalOrigin T.IsTex
...@@ -48,27 +44,29 @@ database2origin Isidore = pure $ ExternalOrigin T.Isidore ...@@ -48,27 +44,29 @@ database2origin Isidore = pure $ ExternalOrigin T.Isidore
------------------------------------------------------------------------ ------------------------------------------------------------------------
data Datafield = Gargantext data Datafield = Gargantext
| External (Maybe Database) | External Database
| Web | Web
| Files | Files
deriving (Eq, Show, Generic) deriving (Eq, Show, Generic)
instance FromJSON Datafield where instance FromJSON Datafield
parseJSON = withText "Datafield" $ \text -> instance ToJSON Datafield
case text of -- instance FromJSON Datafield where
"Gargantext" -> pure Gargantext -- parseJSON = withText "Datafield" $ \text ->
"Web" -> pure Web -- case text of
"Files" -> pure Files -- "Gargantext" -> pure Gargantext
v -> -- "Web" -> pure Web
let (preExternal, _, postExternal) = v =~ ("External " :: Text) :: (Text, Text, Text) -- "Files" -> pure Files
in -- v ->
if preExternal == "" then do -- let (preExternal, _, postExternal) = v =~ ("External " :: Text) :: (Text, Text, Text)
db <- parseJSON $ String postExternal -- in
pure $ External db -- if preExternal == "" then do
else fail $ "Cannot match patterh 'External <db>' for string " ++ (T.unpack v) -- db <- parseJSON $ String postExternal
instance ToJSON Datafield where -- pure $ External db
toJSON (External db) = toJSON $ "External " ++ (show db) -- else fail $ "Cannot match patterh 'External <db>' for string " ++ (T.unpack v)
toJSON s = toJSON $ show s -- instance ToJSON Datafield where
-- toJSON (External db) = toJSON $ "External " ++ (show db)
-- toJSON s = toJSON $ show s
instance ToSchema Datafield where instance ToSchema Datafield where
declareNamedSchema _ = do declareNamedSchema _ = do
return $ NamedSchema (Just "Datafield") $ mempty return $ NamedSchema (Just "Datafield") $ mempty
......
...@@ -74,11 +74,11 @@ type TableApi = Summary "Table API" ...@@ -74,11 +74,11 @@ type TableApi = Summary "Table API"
:> Get '[JSON] Text :> Get '[JSON] Text
data TableQuery = TableQuery data TableQuery = TableQuery
{ tq_offset :: Offset { tq_offset :: Offset
, tq_limit :: Limit , tq_limit :: Limit
, tq_orderBy :: OrderBy , tq_orderBy :: OrderBy
, tq_view :: TabType , tq_view :: TabType
, tq_query :: Text , tq_query :: Text
} deriving (Generic) } deriving (Generic)
type FacetTableResult = TableResult FacetDoc type FacetTableResult = TableResult FacetDoc
......
...@@ -12,10 +12,10 @@ Portability : POSIX ...@@ -12,10 +12,10 @@ Portability : POSIX
module Gargantext.Core.Viz.Phylo.API.Tools module Gargantext.Core.Viz.Phylo.API.Tools
where where
import Data.Proxy
import Data.Aeson (Value, decodeFileStrict, eitherDecode, encode) import Data.Aeson (Value, decodeFileStrict, eitherDecode, encode)
import Data.Map.Strict (Map) import Data.Map.Strict (Map)
import Data.Maybe (catMaybes) import Data.Maybe (catMaybes)
import Data.Proxy
import Data.Set (Set) import Data.Set (Set)
import Data.Text (Text, pack) import Data.Text (Text, pack)
import Data.Time.Calendar (fromGregorian, diffGregorianDurationClip, cdMonths, diffDays, showGregorian) import Data.Time.Calendar (fromGregorian, diffGregorianDurationClip, cdMonths, diffDays, showGregorian)
......
...@@ -24,22 +24,26 @@ module Gargantext.Database.Admin.Types.Hyperdata.Corpus ...@@ -24,22 +24,26 @@ module Gargantext.Database.Admin.Types.Hyperdata.Corpus
import Gargantext.Prelude import Gargantext.Prelude
import Gargantext.Database.Admin.Types.Hyperdata.CorpusField import Gargantext.Database.Admin.Types.Hyperdata.CorpusField
import Gargantext.Database.Admin.Types.Hyperdata.Prelude import Gargantext.Database.Admin.Types.Hyperdata.Prelude
import PUBMED.Types (APIKey)
------------------------------------------------------------------------ ------------------------------------------------------------------------
data HyperdataCorpus = data HyperdataCorpus =
HyperdataCorpus { _hc_fields :: ![HyperdataField CorpusField] } HyperdataCorpus { _hc_fields :: ![HyperdataField CorpusField]
, _hc_pubmed_api_key :: Maybe APIKey }
deriving (Generic) deriving (Generic)
defaultHyperdataCorpus :: HyperdataCorpus defaultHyperdataCorpus :: HyperdataCorpus
defaultHyperdataCorpus = defaultHyperdataCorpus =
HyperdataCorpus [ HyperdataField Markdown HyperdataCorpus
"Corpus analysis" { _hc_fields = [ HyperdataField Markdown
(MarkdownField "# title\n## subtitle") "Corpus analysis"
(MarkdownField "# title\n## subtitle")
, HyperdataField JSON
"Metadata (Experts only)" , HyperdataField JSON
(JsonField "Title" "Descr" "Bool query" "Authors") "Metadata (Experts only)"
] (JsonField "Title" "Descr" "Bool query" "Authors")
]
, _hc_pubmed_api_key = Nothing }
------------------------------------------------------------------------ ------------------------------------------------------------------------
------------------------------------------------------------------------ ------------------------------------------------------------------------
......
...@@ -29,6 +29,7 @@ import Data.Text (Text) ...@@ -29,6 +29,7 @@ import Data.Text (Text)
import Database.PostgreSQL.Simple.SqlQQ (sql) import Database.PostgreSQL.Simple.SqlQQ (sql)
import Opaleye hiding (FromField) import Opaleye hiding (FromField)
import Prelude hiding (null, id, map, sum) import Prelude hiding (null, id, map, sum)
import qualified PUBMED.Types as PUBMED
import Gargantext.Core import Gargantext.Core
import Gargantext.Core.Types import Gargantext.Core.Types
...@@ -327,6 +328,31 @@ insertNodesWithParent pid ns = insertNodes (set node_parent_id (pgNodeId <$> pid ...@@ -327,6 +328,31 @@ insertNodesWithParent pid ns = insertNodes (set node_parent_id (pgNodeId <$> pid
insertNodesWithParentR :: Maybe ParentId -> [NodeWrite] -> Cmd err [NodeId] insertNodesWithParentR :: Maybe ParentId -> [NodeWrite] -> Cmd err [NodeId]
insertNodesWithParentR pid ns = insertNodesR (set node_parent_id (pgNodeId <$> pid) <$> ns) insertNodesWithParentR pid ns = insertNodesR (set node_parent_id (pgNodeId <$> pid) <$> ns)
getCorpusPubmedAPIKey :: NodeId -> Cmd err (Maybe PUBMED.APIKey)
getCorpusPubmedAPIKey cId = do
res <- runPGSQuery query params
pure $ (\(PGS.Only apiKey) -> apiKey) <$> head res
where
query :: PGS.Query
query = [sql|
SELECT hyperdata -> 'pubmed_api_key'
FROM nodes
WHERE id = ?
|]
params = PGS.Only cId
updateCorpusPubmedAPIKey :: NodeId -> Maybe PUBMED.APIKey -> Cmd err Int64
updateCorpusPubmedAPIKey cId mAPIKey =
execPGSQuery query params
where
query :: PGS.Query
query = [sql|
UPDATE nodes
SET hyperdata = hyperdata || ?
WHERE id = ?
|]
params = (encode $ object [ "pubmed_api_key" .= mAPIKey ], cId)
------------------------------------------------------------------------ ------------------------------------------------------------------------
-- TODO -- TODO
-- currently this function removes the child relation -- currently this function removes the child relation
......
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