Commit 07fa2194 authored by Przemyslaw Kaminski's avatar Przemyslaw Kaminski

Add support for APIKey

parent 364885c8
......@@ -38,14 +38,14 @@ defaultEnv = do
pure $ mkClientEnv manager' $ BaseUrl Https pmHost pmPort pmSearchPath
-- | API main function
getMetadataWith :: Text -> Maybe Integer -> Maybe Limit -> IO (Either Text [PubMed])
getMetadataWith :: Maybe Text -> Text -> Maybe Integer -> Maybe Limit -> IO (Either Text [PubMed])
getMetadataWith = runSimpleFindPubmedAbstractRequest
getMetadataWithC :: Text -> Maybe Limit -> IO (Either ClientError (Maybe Integer, ConduitT () PubMed IO ()))
getMetadataWithC query limit = do
getMetadataWithC :: Maybe Text -> Text -> Maybe Limit -> IO (Either ClientError (Maybe Integer, ConduitT () PubMed IO ()))
getMetadataWithC mAPIKey query limit = do
env <- defaultEnv
-- First, estimate the total number of documents
eRes <- runClientM (search (Just query) Nothing (Just 1)) env
eRes <- runClientM (search mAPIKey (Just query) Nothing (Just 1)) env
pure $ get' env query limit batchSize <$> eRes
where
get' :: ClientEnv -> Text -> Maybe Limit -> Int -> BsXml -> (Maybe Integer, ConduitT () PubMed IO ())
......@@ -53,21 +53,26 @@ getMetadataWithC query limit = do
( Just numResults
, yieldMany [0..]
.| takeC (fromInteger numPages)
.| concatMapMC (getPage env q perPage))
.| concatMapMC (getPage env mAPIKey q perPage))
where
numResults = fromMaybe 0 $ parseDocCount $ TL.fromStrict $ TE.decodeUtf8 $ LBS.toStrict res
numPages = numResults `div` (fromIntegral perPage) + 1
getPage :: ClientEnv -> Text -> Int -> Int -> IO [PubMed]
getPage env q perPage pageNum = do
getPage :: ClientEnv
-> Maybe Text
-> Text
-> Int
-> Int
-> IO [PubMed]
getPage env mAPIKey q perPage pageNum = do
let offset = fromIntegral $ pageNum * perPage
eDocs <- runSimpleFindPubmedAbstractRequest q (Just offset) (Just $ fromIntegral perPage)
eDocs <- runSimpleFindPubmedAbstractRequest mAPIKey q (Just offset) (Just $ fromIntegral perPage)
case eDocs of
Left err -> panic $ "[getPage] error: " <> show err
Right docs -> do
_ <- threadDelay 2000000 -- One seconds
pure docs
-- | TODO this parser need at least one subs at the end
-- (use endOfInput)
removeSub :: Parser ByteString
......@@ -110,7 +115,7 @@ runSimpleFetchPubmedAbstractRequest ::
runSimpleFetchPubmedAbstractRequest ids = do
env <- defaultEnv
res <- runClientM
(fetch (Just "pubmed") (Just "abstract") ids)
(fetch Nothing (Just "pubmed") (Just "abstract") ids)
env
case res of
(Left err) -> pure (Left . T.pack $ show err)
......@@ -126,18 +131,22 @@ runSimpleFetchPubmedAbstractRequest ids = do
-- pure []) :: XmlException -> IO [PubMed])
-- Right <$> pure parsed
runSimpleFindPubmedAbstractRequest :: Text -> Maybe Integer -> Maybe Limit -> IO (Either Text [PubMed])
runSimpleFindPubmedAbstractRequest query offset limit = do
eDocIds <- searchDocIds query offset limit
runSimpleFindPubmedAbstractRequest :: Maybe Text
-> Text
-> Maybe Integer
-> Maybe Limit
-> IO (Either Text [PubMed])
runSimpleFindPubmedAbstractRequest mAPIKey query offset limit = do
eDocIds <- searchDocIds mAPIKey query offset limit
case eDocIds of
Left err -> pure $ Left err
Right docIds -> runMultipleFPAR docIds
searchDocIds :: Text -> Maybe Integer -> Maybe Limit -> IO (Either Text [Integer])
searchDocIds query offset limit = do
searchDocIds :: Maybe Text -> Text -> Maybe Integer -> Maybe Limit -> IO (Either Text [Integer])
searchDocIds mAPIKey query offset limit = do
env <- defaultEnv
res <- runClientM
(search (Just query) offset limit)
(search mAPIKey (Just query) offset limit)
env
case res of
(Left err) -> pure (Left $ T.pack $ show err)
......
......@@ -22,12 +22,14 @@ type PUBMEDAPI =
"esearch.fcgi"
-- :> QueryParam "db" DB
-- not mandatory since the base db is pubmed
:> QueryParam "api_key" T.Text
:> QueryParam "term" T.Text
:> QueryParam "retstart" Integer
:> QueryParam "retmax" Integer
:> Get '[BsXml] BsXml
:<|>
"efetch.fcgi"
:> QueryParam "api_key" T.Text
:> QueryParam "db" T.Text
:> QueryParam "rettype" T.Text
:> QueryParams "id" Integer
......@@ -36,10 +38,15 @@ type PUBMEDAPI =
pubmedApi :: Proxy PUBMEDAPI
pubmedApi = Proxy
search :: Maybe T.Text -> Maybe Integer -> Maybe Integer -> ClientM BsXml
search :: Maybe T.Text
-> Maybe T.Text
-> Maybe Integer
-> Maybe Integer
-> ClientM BsXml
fetch :: Maybe T.Text
-> Maybe T.Text
-> [Integer]
-> ClientM BsXml
-> Maybe T.Text
-> Maybe T.Text
-> [Integer]
-> ClientM BsXml
search :<|> fetch = client pubmedApi
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