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 #-}
14 {-# LANGUAGE DataKinds #-}
15 {-# LANGUAGE TemplateHaskell #-}
16 {-# LANGUAGE TypeOperators #-}
17 {-# LANGUAGE DeriveGeneric #-}
18 {-# LANGUAGE DeriveAnyClass #-}
20 module Gargantext.API.Count
23 import Gargantext.Prelude
25 import Prelude (Bounded, Enum, minBound, maxBound)
27 import Data.Text (Text, pack)
29 import GHC.Generics (Generic)
30 import Data.Aeson hiding (Error)
31 import Test.QuickCheck.Arbitrary
32 import Test.QuickCheck (elements)
33 import Data.List (repeat,permutations)
34 -----------------------------------------------------------------------
35 type CountAPI = Post '[JSON] Counts
37 -----------------------------------------------------------------------
38 data Scraper = Pubmed | Hal | IsTex | Isidore
39 deriving (Eq, Show, Generic, Enum, Bounded)
42 scrapers = [minBound..maxBound]
44 instance FromJSON Scraper
45 instance ToJSON Scraper
47 instance Arbitrary Scraper where
48 arbitrary = elements scrapers
50 -----------------------------------------------------------------------
51 -----------------------------------------------------------------------
53 data QueryBool = QueryBool Text
54 deriving (Eq, Show, Generic)
56 queries :: [QueryBool]
57 queries = [QueryBool (pack "(X OR X') AND (Y OR Y') NOT (Z OR Z')")]
59 instance Arbitrary QueryBool where
60 arbitrary = elements queries
62 instance FromJSON QueryBool
63 instance ToJSON QueryBool
67 data Query = Query { query_query :: QueryBool
68 , query_name :: Maybe [Scraper]
70 deriving (Eq, Show, Generic)
71 instance FromJSON Query
73 instance Arbitrary Query where
74 arbitrary = elements [ Query q (Just n)
76 , n <- take 10 $ permutations scrapers
79 -----------------------------------------------------------------------
80 -----------------------------------------------------------------------
85 data Message = Message Integer Errors
86 deriving (Eq, Show, Generic)
88 toMessage :: [(Integer, [Text])] -> [Message]
89 toMessage = map (\(c,es) -> Message c es)
92 messages = toMessage $ [ (400, ["Ill formed query "])
93 , (300, ["API connexion error "])
94 , (300, ["Internal Gargantext Error "])
95 , (300, ["Connexion to Gargantext Error"])
96 , (300, ["Token has expired "])
97 ] <> take 10 ( repeat (200, [""]))
99 instance Arbitrary Message where
100 arbitrary = elements messages
102 instance FromJSON Message
103 instance ToJSON Message
105 -----------------------------------------------------------------------
106 -----------------------------------------------------------------------
107 data Counts = Counts [Count]
108 deriving (Eq, Show, Generic)
110 instance FromJSON Counts
111 instance ToJSON Counts
113 data Count = Count { count_name :: Scraper
114 , count_count :: Maybe Int
115 , count_message :: Maybe Message
117 deriving (Eq, Show, Generic)
119 instance FromJSON Count
120 instance ToJSON Count
122 instance Arbitrary Counts where
123 arbitrary = elements $ select
125 $ map (\xs -> zipWith (\s (c,m) -> Count s c m) scrapers xs)
126 $ chunkAlong (length scrapers) 1 $ (map filter' countOrErrors)
128 select xs = (take 10 xs) <> (take 10 $ drop 100 xs)
129 countOrErrors = [ (c,e) | c <- [500..1000], e <- reverse messages]
130 filter' (c,e) = case e of
131 Message 200 _ -> (Just c , Nothing )
132 message -> (Nothing, Just message)
134 -----------------------------------------------------------------------
135 count :: Query -> Handler Counts