2 Module : Gargantext.API.Count
3 Description : Server API
4 Copyright : (c) CNRS, 2017-Present
5 License : AGPL + CECILL v3
6 Maintainer : team@gargantext.org
7 Stability : experimental
10 Count API part of Gargantext.
13 {-# OPTIONS_GHC -fno-warn-name-shadowing #-}
16 {-# LANGUAGE NoImplicitPrelude #-}
17 {-# LANGUAGE DataKinds #-}
18 {-# LANGUAGE TemplateHaskell #-}
19 {-# LANGUAGE TypeOperators #-}
20 {-# LANGUAGE DeriveGeneric #-}
21 {-# LANGUAGE DeriveAnyClass #-}
22 {-# LANGUAGE OverloadedStrings #-}
24 module Gargantext.API.Search
28 import GHC.Generics (Generic)
29 import Control.Monad.IO.Class (liftIO)
30 import Prelude (Bounded, Enum, minBound, maxBound)
33 import Data.Aeson hiding (Error, fieldLabelModifier)
34 import Data.Aeson.TH (deriveJSON)
37 import Data.List (repeat, permutations)
39 import Data.Swagger.SchemaOptions
40 import Data.Text (Text, pack)
41 import Database.PostgreSQL.Simple (Connection)
44 import Test.QuickCheck.Arbitrary
45 import Test.QuickCheck (elements)
46 -- import Control.Applicative ((<*>))
48 import Gargantext.Prelude
49 import Gargantext.Core.Utils.Prefix (unPrefix)
50 import Gargantext.Database.TextSearch
54 -----------------------------------------------------------------------
55 data SearchQuery = SearchQuery { sq_query :: [Text]
58 $(deriveJSON (unPrefix "sq_") ''SearchQuery)
59 instance ToSchema SearchQuery where
61 genericDeclareNamedSchema
62 defaultSchemaOptions {fieldLabelModifier = \fieldLabel -> drop 3 fieldLabel}
65 instance Arbitrary SearchQuery where
66 arbitrary = elements [SearchQuery ["query"] 1]
68 -----------------------------------------------------------------------
70 data SearchResult = SearchResult { sr_id :: Int
73 $(deriveJSON (unPrefix "sr_") ''SearchResult)
74 instance Arbitrary SearchResult where
75 arbitrary = elements [SearchResult 1 "name"]
77 instance ToSchema SearchResult where
79 genericDeclareNamedSchema
80 defaultSchemaOptions {fieldLabelModifier = \fieldLabel -> drop 3 fieldLabel}
82 -----------------------------------------------------------------------
84 data SearchResults = SearchResults { srs_results :: [SearchResult]}
86 $(deriveJSON (unPrefix "srs_") ''SearchResults)
88 instance Arbitrary SearchResults where
89 arbitrary = SearchResults <$> arbitrary
91 instance ToSchema SearchResults where
93 genericDeclareNamedSchema
94 defaultSchemaOptions {fieldLabelModifier = \fieldLabel -> drop 4 fieldLabel}
98 -----------------------------------------------------------------------
99 type SearchAPI = Post '[JSON] SearchResults
100 -----------------------------------------------------------------------
102 search :: Connection -> SearchQuery -> Handler SearchResults
103 search c (SearchQuery q pId) =
104 liftIO $ SearchResults <$> map (\(i, y, t, s, _) -> SearchResult i (cs $ encode t))
105 <$> textSearch c (toTSQuery q) pId 5 0 Desc