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 DataKinds #-}
13 {-# LANGUAGE DeriveGeneric #-}
14 {-# LANGUAGE FlexibleContexts #-}
15 {-# LANGUAGE FlexibleInstances #-}
16 {-# LANGUAGE MultiParamTypeClasses #-}
17 {-# LANGUAGE NoImplicitPrelude #-}
18 {-# LANGUAGE OverloadedStrings #-}
19 {-# LANGUAGE RankNTypes #-}
20 {-# LANGUAGE TemplateHaskell #-}
21 {-# LANGUAGE TypeOperators #-}
23 module Gargantext.API.Ngrams.List
26 import Control.Lens hiding (elements)
28 import Data.List (zip)
29 import Data.Map (Map, toList, fromList)
30 import Data.Swagger (ToSchema, declareNamedSchema, genericDeclareNamedSchema)
31 import Data.Text (Text, concat, pack)
32 import GHC.Generics (Generic)
33 import Gargantext.API.Corpus.New
34 import Gargantext.API.Corpus.New.File (FileType(..))
35 import Gargantext.API.Ngrams
36 import Gargantext.API.Admin.Orchestrator.Types
37 import Gargantext.API.Admin.Types (GargServer)
38 import Gargantext.Core.Utils.Prefix (unPrefixSwagger)
39 import Gargantext.Database.Action.Flow (FlowCmdM)
40 import Gargantext.Database.Admin.Types.Node
41 import Gargantext.Database.Schema.Ngrams (NgramsType(..), ngramsTypes)
42 import Gargantext.Prelude
43 import Network.HTTP.Media ((//), (/:))
45 import Servant.Job.Async
46 import Servant.Job.Utils (jsonOptions)
47 import Web.FormUrlEncoded (FromForm)
49 ------------------------------------------------------------------------
50 type NgramsList = (Map NgramsType (Versioned NgramsTableMap))
51 ------------------------------------------------------------------------
52 type API = Get '[JSON, HTML] (Headers '[Header "Content-Disposition" Text] NgramsList)
53 -- :<|> ReqBody '[JSON] NgramsList :> Post '[JSON] Bool
56 api :: ListId -> GargServer API
57 api l = get l :<|> postAsync l
60 instance Accept HTML where
61 contentType _ = "text" // "html" /: ("charset", "utf-8")
62 instance ToJSON a => MimeRender HTML a where
65 ------------------------------------------------------------------------
67 get :: RepoCmdM env err m
68 => ListId -> m (Headers '[Header "Content-Disposition" Text] NgramsList)
72 return $ addHeader (concat [ "attachment; filename=GarganText_NgramsList-"
78 get' :: RepoCmdM env err m
79 => ListId -> m NgramsList
82 <$> mapM (getNgramsTableMap lId) ngramsTypes
84 ------------------------------------------------------------------------
87 post :: FlowCmdM env err m
92 -- TODO check with Version for optim
93 _ <- mapM (\(nt, Versioned _v ns) -> setListNgrams l nt ns) $ toList m
97 ------------------------------------------------------------------------
98 ------------------------------------------------------------------------
100 type PostAPI = Summary "Update List"
104 :> AsyncJobs ScraperStatus '[FormUrlEncoded] WithFile ScraperStatus
106 postAsync :: ListId -> GargServer PostAPI
109 JobFunction (\f log' -> postAsync' lId f (liftBase . log'))
111 postAsync' :: FlowCmdM env err m
114 -> (ScraperStatus -> m ())
116 postAsync' l (WithFile _ m _) logStatus = do
118 logStatus ScraperStatus { _scst_succeeded = Just 0
119 , _scst_failed = Just 0
120 , _scst_remaining = Just 1
121 , _scst_events = Just []
125 pure ScraperStatus { _scst_succeeded = Just 1
126 , _scst_failed = Just 0
127 , _scst_remaining = Just 0
128 , _scst_events = Just []
131 data WithFile = WithFile
132 { _wf_filetype :: !FileType
133 , _wf_data :: !NgramsList
135 } deriving (Eq, Show, Generic)
137 makeLenses ''WithFile
138 instance FromForm WithFile
139 instance FromJSON WithFile where
140 parseJSON = genericParseJSON $ jsonOptions "_wf_"
141 instance ToSchema WithFile where
142 declareNamedSchema = genericDeclareNamedSchema (unPrefixSwagger "_wf_")