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

[API] Search API using generics with front

parent 314ed198
Pipeline #986 failed with stage
...@@ -19,15 +19,16 @@ Count API part of Gargantext. ...@@ -19,15 +19,16 @@ Count API part of Gargantext.
module Gargantext.API.Search module Gargantext.API.Search
where where
import Data.Aeson.TH (deriveJSON) import Data.Aeson
import Data.Swagger import Data.Swagger
import Data.Text (Text) import Data.Text (Text)
import Data.Time (UTCTime) import Data.Time (UTCTime)
import GHC.Generics (Generic) import GHC.Generics (Generic)
import Gargantext.API.Prelude (GargServer) import Gargantext.API.Prelude (GargServer)
import Gargantext.Core.Utils.Prefix (unPrefix, unPrefixSwagger) import Gargantext.Core.Utils.Prefix (unPrefixSwagger)
import Gargantext.Database.Query.Facet import Gargantext.Database.Query.Facet
import Gargantext.Database.Action.Search import Gargantext.Database.Action.Search
import Gargantext.Database.Action.Flow.Pairing (isPairedWith)
import Gargantext.Database.Admin.Types.Hyperdata (HyperdataContact) import Gargantext.Database.Admin.Types.Hyperdata (HyperdataContact)
import Gargantext.Database.Admin.Types.Node import Gargantext.Database.Admin.Types.Node
import Gargantext.Prelude import Gargantext.Prelude
...@@ -39,32 +40,48 @@ import Test.QuickCheck.Arbitrary ...@@ -39,32 +40,48 @@ import Test.QuickCheck.Arbitrary
data SearchType = SearchDoc | SearchContact data SearchType = SearchDoc | SearchContact
deriving (Generic) deriving (Generic)
$(deriveJSON (unPrefix "") ''SearchType)
instance FromJSON SearchType where
parseJSON = genericParseJSON (defaultOptions { sumEncoding = ObjectWithSingleField })
instance ToJSON SearchType where
toJSON = genericToJSON (defaultOptions { sumEncoding = ObjectWithSingleField })
instance ToSchema SearchType instance ToSchema SearchType
instance Arbitrary SearchType where instance Arbitrary SearchType where
arbitrary = elements [SearchDoc, SearchContact] arbitrary = elements [SearchDoc, SearchContact]
----------------------------------------------------------------------- -----------------------------------------------------------------------
data SearchQuery = SearchQuery data SearchQuery =
{ sq_query :: [Text] SearchQuery { query :: ![Text]
, sq_type :: SearchType , expected :: !SearchType
} deriving (Generic) } deriving (Generic)
$(deriveJSON (unPrefix "sq_") ''SearchQuery) instance FromJSON SearchQuery where
parseJSON = genericParseJSON (defaultOptions { sumEncoding = ObjectWithSingleField })
instance ToJSON SearchQuery where
toJSON = genericToJSON (defaultOptions { sumEncoding = ObjectWithSingleField })
instance ToSchema SearchQuery where instance ToSchema SearchQuery where
declareNamedSchema = genericDeclareNamedSchema (unPrefixSwagger "sq_") declareNamedSchema = genericDeclareNamedSchema (unPrefixSwagger "")
instance Arbitrary SearchQuery where instance Arbitrary SearchQuery where
arbitrary = elements [SearchQuery ["electrodes"] SearchDoc] arbitrary = elements [SearchQuery ["electrodes"] SearchDoc]
----------------------------------------------------------------------- -----------------------------------------------------------------------
data SearchResult = SearchResultDoc { sr_result :: [FacetDoc]} data SearchResult = SearchResultDoc { docs :: ![FacetDoc]}
| SearchResultContact { sr_results :: [FacetPaired Int UTCTime HyperdataContact Int] } | SearchNoResult { sr_message :: Text } | SearchResultContact { contacts :: ![FacetPaired Int UTCTime HyperdataContact Int] }
| SearchNoResult { message :: !Text }
deriving (Generic) deriving (Generic)
$(deriveJSON (unPrefix "sr_") ''SearchResult)
instance FromJSON SearchResult where
parseJSON = genericParseJSON (defaultOptions { sumEncoding = ObjectWithSingleField })
instance ToJSON SearchResult where
toJSON = genericToJSON (defaultOptions { sumEncoding = ObjectWithSingleField })
instance Arbitrary SearchResult where instance Arbitrary SearchResult where
arbitrary = do arbitrary = do
srd <- SearchResultDoc <$> arbitrary srd <- SearchResultDoc <$> arbitrary
...@@ -88,7 +105,10 @@ type API results = Summary "Search endpoint" ...@@ -88,7 +105,10 @@ type API results = Summary "Search endpoint"
api :: NodeId -> GargServer (API SearchResult) api :: NodeId -> GargServer (API SearchResult)
api nId (SearchQuery q SearchDoc) o l order = api nId (SearchQuery q SearchDoc) o l order =
SearchResultDoc <$> searchInCorpus nId False q o l order SearchResultDoc <$> searchInCorpus nId False q o l order
api nId (SearchQuery q SearchContact) o l order = api nId (SearchQuery q SearchContact) o l order = do
-- SearchPairedResults <$> searchInCorpusWithContacts pId aId q o l order aIds <- isPairedWith NodeAnnuaire nId
pure $ SearchNoResult "Need Implementation" -- TODO if paired with several corpus
case head aIds of
Nothing -> pure $ SearchNoResult "[G.A.Search] pair corpus with an Annuaire"
Just aId -> SearchResultContact <$> searchInCorpusWithContacts nId aId q o l order
----------------------------------------------------------------------- -----------------------------------------------------------------------
...@@ -29,8 +29,6 @@ import Gargantext.Prelude ...@@ -29,8 +29,6 @@ import Gargantext.Prelude
import Gargantext.Database.Admin.Types.Hyperdata.Prelude import Gargantext.Database.Admin.Types.Hyperdata.Prelude
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
data HyperdataContact = data HyperdataContact =
HyperdataContact { _hc_bdd :: Maybe Text -- ID of Database source HyperdataContact { _hc_bdd :: Maybe Text -- ID of Database source
, _hc_who :: Maybe ContactWho , _hc_who :: Maybe ContactWho
......
...@@ -75,23 +75,23 @@ import Gargantext.Database.Schema.Node ...@@ -75,23 +75,23 @@ import Gargantext.Database.Schema.Node
--instance FromJSON Facet --instance FromJSON Facet
--instance ToJSON Facet --instance ToJSON Facet
type Favorite = Int type Category = Int
type Title = Text type Title = Text
-- TODO remove Title -- TODO remove Title
type FacetDoc = Facet NodeId UTCTime Title HyperdataDocument (Maybe Favorite) (Maybe Double) type FacetDoc = Facet NodeId UTCTime Title HyperdataDocument (Maybe Category) (Maybe Double)
-- type FacetSources = FacetDoc -- type FacetSources = FacetDoc
-- type FacetAuthors = FacetDoc -- type FacetAuthors = FacetDoc
-- type FacetTerms = FacetDoc -- type FacetTerms = FacetDoc
data Facet id created title hyperdata favorite ngramCount = data Facet id created title hyperdata category ngramCount =
FacetDoc { facetDoc_id :: id FacetDoc { facetDoc_id :: id
, facetDoc_created :: created , facetDoc_created :: created
, facetDoc_title :: title , facetDoc_title :: title
, facetDoc_hyperdata :: hyperdata , facetDoc_hyperdata :: hyperdata
, facetDoc_favorite :: favorite , facetDoc_category :: category
, facetDoc_ngramCount :: ngramCount , facetDoc_score :: ngramCount
} deriving (Show, Generic) } deriving (Show, Generic)
{- | TODO after demo {- | TODO after demo
data Facet id date hyperdata score = data Facet id date hyperdata score =
...@@ -318,8 +318,8 @@ orderWith (Just DateDesc) = desc facetDoc_created ...@@ -318,8 +318,8 @@ orderWith (Just DateDesc) = desc facetDoc_created
orderWith (Just TitleAsc) = asc facetDoc_title orderWith (Just TitleAsc) = asc facetDoc_title
orderWith (Just TitleDesc) = desc facetDoc_title orderWith (Just TitleDesc) = desc facetDoc_title
orderWith (Just ScoreAsc) = asc facetDoc_favorite orderWith (Just ScoreAsc) = asc facetDoc_category
orderWith (Just ScoreDesc) = desc facetDoc_favorite orderWith (Just ScoreDesc) = desc facetDoc_category
orderWith (Just SourceAsc) = asc facetDoc_source orderWith (Just SourceAsc) = asc facetDoc_source
orderWith (Just SourceDesc) = desc facetDoc_source orderWith (Just SourceDesc) = desc facetDoc_source
......
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