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

[API] External API Pubmed connected.

parent 5ae60a4b
...@@ -24,19 +24,21 @@ New corpus means either: ...@@ -24,19 +24,21 @@ New corpus means either:
module Gargantext.API.Corpus.New module Gargantext.API.Corpus.New
where where
import Control.Monad.IO.Class (liftIO)
import Data.Aeson.TH (deriveJSON) import Data.Aeson.TH (deriveJSON)
import Data.Swagger import Data.Swagger
import Data.Text (Text) import Data.Text (Text)
import GHC.Generics (Generic) import GHC.Generics (Generic)
import Gargantext.Core (Lang(..))
import Gargantext.Core.Utils.Prefix (unPrefix) import Gargantext.Core.Utils.Prefix (unPrefix)
import Gargantext.Database.Flow (flowCorpusSearchInDatabase) import Gargantext.Database.Flow (flowCorpusSearchInDatabase)
import Gargantext.Database.Types.Node (CorpusId) import Gargantext.Database.Types.Node (CorpusId)
import Gargantext.Text.Terms (TermType(..))
import Gargantext.Prelude import Gargantext.Prelude
import Servant import Servant
import Test.QuickCheck (elements) import Test.QuickCheck (elements)
import Test.QuickCheck.Arbitrary import Test.QuickCheck.Arbitrary
import Gargantext.Database.Flow (FlowCmdM) import Gargantext.Core (Lang(..))
import Gargantext.Database.Flow (FlowCmdM, flowCorpus)
import qualified Gargantext.Text.Corpus.API as API import qualified Gargantext.Text.Corpus.API as API
import Gargantext.Database.Types.Node (UserId) import Gargantext.Database.Types.Node (UserId)
...@@ -67,12 +69,15 @@ type Api = Summary "New Corpus endpoint" ...@@ -67,12 +69,15 @@ type Api = Summary "New Corpus endpoint"
:<|> Get '[JSON] ApiInfo :<|> Get '[JSON] ApiInfo
-- | TODO manage several apis -- | TODO manage several apis
api :: FlowCmdM env err m => Query -> m CorpusId api :: (FlowCmdM env err m) => Query -> m CorpusId
api (Query q _ as) = do api (Query q _ as) = do
cId <- case head as of cId <- case head as of
Nothing -> flowCorpusSearchInDatabase "user1" EN q Nothing -> flowCorpusSearchInDatabase "user1" EN q
Just API.All -> flowCorpusSearchInDatabase "user1" EN q Just API.All -> flowCorpusSearchInDatabase "user1" EN q
Just _ -> undefined Just a -> do
docs <- liftIO $ API.get a q Nothing
cId' <- flowCorpus "user1" q (Multi EN) [docs]
pure cId'
pure cId pure cId
......
...@@ -15,7 +15,7 @@ Portability : POSIX ...@@ -15,7 +15,7 @@ Portability : POSIX
module Gargantext.Core.Flow where module Gargantext.Core.Flow where
import Control.Lens ((^.), view, Lens', _Just) import Control.Lens (Lens')
import Data.Map (Map) import Data.Map (Map)
import Data.Text (Text) import Data.Text (Text)
import Gargantext.Text.Terms (TermType) import Gargantext.Text.Terms (TermType)
...@@ -25,7 +25,7 @@ import Gargantext.Core.Types.Main (HashId) ...@@ -25,7 +25,7 @@ import Gargantext.Core.Types.Main (HashId)
import Gargantext.Database.Types.Node -- (HyperdataDocument(..)) import Gargantext.Database.Types.Node -- (HyperdataDocument(..))
import Gargantext.Database.Node.Contact -- (HyperdataContact(..)) import Gargantext.Database.Node.Contact -- (HyperdataContact(..))
import Gargantext.Database.Node.Document.Insert (AddUniqId, InsertDb) import Gargantext.Database.Node.Document.Insert (AddUniqId, InsertDb)
import Gargantext.Database.Utils (Cmd, CmdM) import Gargantext.Database.Utils (Cmd)
type FlowCorpus a = ( AddUniqId a type FlowCorpus a = ( AddUniqId a
, UniqId a , UniqId a
......
...@@ -110,7 +110,6 @@ flowCorpusApi u n tt l q = do ...@@ -110,7 +110,6 @@ flowCorpusApi u n tt l q = do
------------------------------------------------------------------------ ------------------------------------------------------------------------
flowAnnuaire :: FlowCmdM env ServantErr m flowAnnuaire :: FlowCmdM env ServantErr m
=> Username -> CorpusName -> (TermType Lang) -> FilePath -> m AnnuaireId => Username -> CorpusName -> (TermType Lang) -> FilePath -> m AnnuaireId
flowAnnuaire u n l filePath = do flowAnnuaire u n l filePath = do
...@@ -151,25 +150,33 @@ flowCorpusSearchInDatabase u la q = do ...@@ -151,25 +150,33 @@ flowCorpusSearchInDatabase u la q = do
flowCorpusUser la u q (Nothing :: Maybe HyperdataCorpus) ids flowCorpusUser la u q (Nothing :: Maybe HyperdataCorpus) ids
flowCorpusSearchInDatabase' :: FlowCmdM env ServantErr m flowCorpusSearchInDatabaseApi :: FlowCmdM env ServantErr m
=> Username -> Lang -> Text -> m CorpusId => Username -> Lang -> Text -> m CorpusId
flowCorpusSearchInDatabase' u la q = do flowCorpusSearchInDatabaseApi u la q = do
(_masterUserId, _masterRootId, cId) <- getOrMkRootWithCorpus userMaster "" (Nothing :: Maybe HyperdataCorpus) (_masterUserId, _masterRootId, cId) <- getOrMkRootWithCorpus userMaster "" (Nothing :: Maybe HyperdataCorpus)
ids <- map fst <$> searchInDatabase cId (stemIt q) ids <- map fst <$> searchInDatabase cId (stemIt q)
flowCorpusUser la u q (Nothing :: Maybe HyperdataCorpus) ids flowCorpusUser la u q (Nothing :: Maybe HyperdataCorpus) ids
------------------------------------------------------------------------ ------------------------------------------------------------------------
-- | TODO improve the needed type to create/update a corpus
data UserInfo = Username Text
| UserId NodeId
data CorpusInfo = CorpusName Lang Text
| CorpusId Lang NodeId
flow :: (FlowCmdM env ServantErr m, FlowCorpus a, MkCorpus c) flow :: (FlowCmdM env err m, FlowCorpus a, MkCorpus c)
=> Maybe c -> Username -> CorpusName -> TermType Lang -> [[a]] -> m CorpusId => Maybe c -> Username -> CorpusName -> TermType Lang -> [[a]] -> m CorpusId
flow c u cn la docs = do flow c u cn la docs = do
ids <- mapM (insertMasterDocs c la ) docs ids <- mapM (insertMasterDocs c la ) docs
flowCorpusUser (la ^. tt_lang) u cn c (concat ids) flowCorpusUser (la ^. tt_lang) u cn c (concat ids)
flowCorpus :: (FlowCmdM env ServantErr m, FlowCorpus a) flowCorpus :: (FlowCmdM env err m, FlowCorpus a)
=> Username -> CorpusName -> TermType Lang -> [[a]] -> m CorpusId => Username -> CorpusName -> TermType Lang -> [[a]] -> m CorpusId
flowCorpus = flow (Nothing :: Maybe HyperdataCorpus) flowCorpus = flow (Nothing :: Maybe HyperdataCorpus)
------------------------------------------------------------------------
flowCorpusUser :: (FlowCmdM env err m, MkCorpus c) flowCorpusUser :: (FlowCmdM env err m, MkCorpus c)
=> Lang -> Username -> CorpusName -> Maybe c -> [NodeId] -> m CorpusId => Lang -> Username -> CorpusName -> Maybe c -> [NodeId] -> m CorpusId
...@@ -198,7 +205,7 @@ flowCorpusUser l userName corpusName ctype ids = do ...@@ -198,7 +205,7 @@ flowCorpusUser l userName corpusName ctype ids = do
pure userCorpusId pure userCorpusId
insertMasterDocs :: ( FlowCmdM env ServantErr m insertMasterDocs :: ( FlowCmdM env err m
, FlowCorpus a , FlowCorpus a
, MkCorpus c , MkCorpus c
) )
......
...@@ -18,18 +18,19 @@ module Gargantext.Text.Corpus.API ...@@ -18,18 +18,19 @@ module Gargantext.Text.Corpus.API
import GHC.Generics (Generic) import GHC.Generics (Generic)
import Data.Aeson import Data.Aeson
import Data.Maybe
import Data.Text (Text) import Data.Text (Text)
import Gargantext.Prelude import Gargantext.Prelude
import Gargantext.Core (Lang(..)) import Gargantext.Core (Lang(..))
import Gargantext.Core.Flow (FlowCorpus) import Gargantext.Database.Types.Node (HyperdataDocument(..))
import Gargantext.Database.Types.Node (HyperdataDocument)
import Test.QuickCheck.Arbitrary import Test.QuickCheck.Arbitrary
import Test.QuickCheck (elements) import Test.QuickCheck (elements)
import Data.Swagger import Data.Swagger
import qualified Data.Text as Text
import qualified PUBMED as PubMed import qualified PUBMED as PubMed
import qualified PUBMED.Parser as Doc (PubMed) import qualified PUBMED.Parser as Doc
import qualified Gargantext.Text.Corpus.API.Isidore as Isidore --import qualified Gargantext.Text.Corpus.API.Isidore as Isidore
data ExternalAPIs = All data ExternalAPIs = All
| PubMed | PubMed
...@@ -53,10 +54,41 @@ instance ToSchema ExternalAPIs ...@@ -53,10 +54,41 @@ instance ToSchema ExternalAPIs
type Query = Text type Query = Text
type Limit = PubMed.Limit type Limit = PubMed.Limit
get :: FlowCorpus a => ExternalAPIs -> Query -> Maybe Limit -> IO [a] get :: ExternalAPIs -> Query -> Maybe Limit -> IO [HyperdataDocument]
get PubMed q l = either (\e -> panic $ "CRAWL: PubMed" <> e) (map (toDoc EN)) <$> PubMed.crawler q l get PubMed q l = either (\e -> panic $ "CRAWL: PubMed" <> e) (map (toDoc EN)) <$> PubMed.crawler q l
get _ _ _ = undefined get _ _ _ = undefined
toDoc :: FlowCorpus a => Lang -> Doc.PubMed -> a toDoc :: Lang -> Doc.PubMed -> HyperdataDocument
toDoc = undefined toDoc l (Doc.PubMed (Doc.PubMedArticle t j as aus)
(Doc.PubMedDate a y m d)
) = HyperdataDocument (Just "PubMed")
Nothing
Nothing
Nothing
Nothing
Nothing
t
(authors aus)
Nothing
j
(abstract as)
(Just $ Text.pack $ show a)
(Just $ fromIntegral y)
(Just m)
(Just d)
Nothing
Nothing
Nothing
(Just $ (Text.pack . show) l)
where
authors :: Maybe [Doc.Author] -> Maybe Text
authors aus' = case aus' of
Nothing -> Nothing
Just au -> Just $ (Text.intercalate ", ") $ catMaybes $ map Doc.foreName au
abstract :: Maybe [Text] -> Maybe Text
abstract as' = fmap (Text.intercalate ", ") as'
...@@ -92,3 +92,11 @@ isidoreToDoc l (IsidoreDoc t a d u s as) = do ...@@ -92,3 +92,11 @@ isidoreToDoc l (IsidoreDoc t a d u s as) = do
(Just $ (Text.pack . show) l) (Just $ (Text.pack . show) l)
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