2 Module : Gargantext.API.Ngrams.List
3 Description : Get Ngrams (lists)
4 Copyright : (c) CNRS, 2017-Present
5 License : AGPL + CECILL v3
6 Maintainer : team@gargantext.org
7 Stability : experimental
12 {-# LANGUAGE TemplateHaskell #-}
13 {-# LANGUAGE TypeOperators #-}
15 module Gargantext.API.Ngrams.List
18 import Control.Lens hiding (elements)
20 import Data.Map (Map, toList, fromList)
21 import Data.Swagger (ToSchema, declareNamedSchema, genericDeclareNamedSchema)
22 import Data.Text (Text, concat, pack)
23 import GHC.Generics (Generic)
24 import Network.HTTP.Media ((//), (/:))
26 import Servant.Job.Async
27 import Servant.Job.Utils (jsonOptions)
28 import Web.FormUrlEncoded (FromForm)
30 import Gargantext.API.Admin.Orchestrator.Types
31 import Gargantext.API.Ngrams (getNgramsTableMap, setListNgrams)
32 import Gargantext.API.Ngrams.Types (NgramsTableMap, RepoCmdM, Versioned(..))
33 import Gargantext.API.Node.Corpus.New.File (FileType(..))
34 import Gargantext.API.Prelude (GargServer)
35 import Gargantext.Core.Utils.Prefix (unPrefixSwagger)
36 import Gargantext.Database.Action.Flow.Types (FlowCmdM)
37 import Gargantext.Database.Admin.Types.Node
38 import Gargantext.Database.Schema.Ngrams (NgramsType(..), ngramsTypes)
39 import Gargantext.Prelude
41 ------------------------------------------------------------------------
42 type NgramsList = (Map NgramsType (Versioned NgramsTableMap))
43 ------------------------------------------------------------------------
44 type API = Get '[JSON, HTML] (Headers '[Header "Content-Disposition" Text] NgramsList)
45 -- :<|> ReqBody '[JSON] NgramsList :> Post '[JSON] Bool
48 api :: ListId -> GargServer API
49 api l = get l :<|> postAsync l
52 instance Accept HTML where
53 contentType _ = "text" // "html" /: ("charset", "utf-8")
54 instance ToJSON a => MimeRender HTML a where
57 ------------------------------------------------------------------------
58 get :: RepoCmdM env err m =>
59 ListId -> m (Headers '[Header "Content-Disposition" Text] NgramsList)
63 return $ addHeader (concat [ "attachment; filename=GarganText_NgramsList-"
69 get' :: RepoCmdM env err m
70 => ListId -> m NgramsList
73 <$> mapM (getNgramsTableMap lId) ngramsTypes
75 ------------------------------------------------------------------------
78 post :: FlowCmdM env err m
83 -- TODO check with Version for optim
84 _ <- mapM (\(nt, Versioned _v ns) -> setListNgrams l nt ns) $ toList m
88 ------------------------------------------------------------------------
89 ------------------------------------------------------------------------
90 type PostAPI = Summary "Update List"
94 :> AsyncJobs JobLog '[FormUrlEncoded] WithFile JobLog
96 postAsync :: ListId -> GargServer PostAPI
99 JobFunction (\f log' -> postAsync' lId f (liftBase . log'))
101 postAsync' :: FlowCmdM env err m
106 postAsync' l (WithFile _ m _) logStatus = do
108 logStatus JobLog { _scst_succeeded = Just 0
109 , _scst_failed = Just 0
110 , _scst_remaining = Just 1
111 , _scst_events = Just []
115 pure JobLog { _scst_succeeded = Just 1
116 , _scst_failed = Just 0
117 , _scst_remaining = Just 0
118 , _scst_events = Just []
121 data WithFile = WithFile
122 { _wf_filetype :: !FileType
123 , _wf_data :: !NgramsList
125 } deriving (Eq, Show, Generic)
127 makeLenses ''WithFile
128 instance FromForm WithFile
129 instance FromJSON WithFile where
130 parseJSON = genericParseJSON $ jsonOptions "_wf_"
131 instance ToSchema WithFile where
132 declareNamedSchema = genericDeclareNamedSchema (unPrefixSwagger "_wf_")