1 {-# LANGUAGE AllowAmbiguousTypes #-}
2 {-# LANGUAGE MonoLocalBinds #-}
3 {-# LANGUAGE TypeOperators #-}
5 module Gargantext.API.Node.FrameCalcUpload where
7 import Control.Lens ((^.))
9 import qualified Data.ByteString.Lazy as BSL
10 import qualified Data.ByteString.UTF8 as BSU8
12 import qualified Data.Text as T
13 import GHC.Generics (Generic)
14 import Network.HTTP.Client (newManager, httpLbs, parseRequest, responseBody)
15 import Network.HTTP.Client.TLS (tlsManagerSettings)
17 import Web.FormUrlEncoded (FromForm)
19 import Gargantext.API.Admin.EnvTypes (GargJob(..), Env)
20 import Gargantext.API.Admin.Orchestrator.Types (JobLog(..), AsyncJobs)
21 import Gargantext.API.Node.Corpus.New (addToCorpusWithForm)
22 import Gargantext.API.Node.Corpus.New.Types (FileFormat(..), FileType(..))
23 import Gargantext.API.Node.Types (NewWithForm(..))
24 import Gargantext.API.Prelude
25 import Gargantext.Core.Types.Individu (User(..))
26 import Gargantext.Core.Text.List.Social (FlowSocialListWith(..))
27 import Gargantext.Database.Action.Flow.Types
28 import Gargantext.Database.Admin.Types.Hyperdata.Frame
29 import Gargantext.Database.Admin.Types.Node
30 import Gargantext.Database.Prelude (HasConfig)
31 import Gargantext.Database.Query.Table.Node (getClosestParentIdByType, getNodeWith)
32 import Gargantext.Database.Schema.Node (node_hyperdata)
33 import Gargantext.Prelude
34 import Gargantext.Utils.Jobs (serveJobsAPI, MonadJobStatus(..))
35 import Gargantext.Core (Lang)
37 data FrameCalcUpload = FrameCalcUpload {
38 _wf_lang :: !(Maybe Lang)
39 , _wf_selection :: !FlowSocialListWith
43 instance FromForm FrameCalcUpload
44 instance FromJSON FrameCalcUpload
45 instance ToJSON FrameCalcUpload
46 instance ToSchema FrameCalcUpload
48 type API = Summary " FrameCalc upload"
52 :> AsyncJobs JobLog '[JSON] FrameCalcUpload JobLog
54 api :: UserId -> NodeId -> ServerT API (GargM Env GargError)
56 serveJobsAPI UploadFrameCalcJob $ \jHandle p ->
57 frameCalcUploadAsync uId nId p jHandle
61 frameCalcUploadAsync :: (HasConfig env, FlowCmdM env err m, MonadJobStatus m)
67 frameCalcUploadAsync uId nId (FrameCalcUpload _wf_lang _wf_selection) jobHandle = do
68 markStarted 5 jobHandle
70 -- printDebug "[frameCalcUploadAsync] uId" uId
71 -- printDebug "[frameCalcUploadAsync] nId" nId
73 node <- getNodeWith nId (Proxy :: Proxy HyperdataFrame)
74 let (HyperdataFrame { _hf_base = base
75 , _hf_frame_id = frame_id }) = node ^. node_hyperdata
77 let csvUrl = base <> "/" <> frame_id <> ".csv"
78 -- printDebug "[frameCalcUploadAsync] csvUrl" csvUrl
81 manager <- newManager tlsManagerSettings
82 req <- parseRequest $ T.unpack csvUrl
84 let body = T.pack $ BSU8.toString $ BSL.toStrict $ responseBody res
86 -- printDebug "body" body
87 mCId <- getClosestParentIdByType nId NodeCorpus
88 -- printDebug "[frameCalcUploadAsync] mCId" mCId
91 Nothing -> markFailure 1 Nothing jobHandle
93 addToCorpusWithForm (RootId (NodeId uId)) cId (NewWithForm CSV Plain body _wf_lang "calc-upload.csv" _wf_selection) jobHandle
95 markComplete jobHandle