1 {-# LANGUAGE AllowAmbiguousTypes #-}
2 {-# LANGUAGE MonoLocalBinds #-}
3 {-# LANGUAGE TemplateHaskell #-}
4 {-# LANGUAGE TypeOperators #-}
6 module Gargantext.API.Node.DocumentUpload where
8 import Control.Lens (makeLenses, view)
10 import Data.Swagger (ToSchema)
11 import GHC.Generics (Generic)
13 import Servant.Job.Async
14 import qualified Data.Text as T
16 import Gargantext.API.Admin.Orchestrator.Types (JobLog(..), AsyncJobs)
17 import Gargantext.API.Job (jobLogSuccess)
18 import Gargantext.API.Prelude
19 import Gargantext.Core (Lang(..))
20 import Gargantext.Core.Text.Corpus.Parsers.Date (dateSplit)
21 import Gargantext.Core.Utils.Prefix (unCapitalize, dropPrefix)
22 import Gargantext.Database.Action.Flow.Types
23 import Gargantext.Core.Text.Terms (TermType(..))
24 import Gargantext.Database.Action.Flow (insertMasterDocs)
25 import Gargantext.Database.Admin.Types.Hyperdata.Document (HyperdataDocument(..))
26 import qualified Gargantext.Database.Query.Table.Node.Document.Add as Doc (add)
27 import Gargantext.Database.Admin.Types.Node
28 import Gargantext.Database.Query.Table.Node (getClosestParentIdByType')
29 import Gargantext.Prelude
30 import Gargantext.Database.Admin.Types.Hyperdata.Corpus (HyperdataCorpus(..))
33 data DocumentUpload = DocumentUpload
34 { _du_abstract :: T.Text
35 , _du_authors :: T.Text
36 , _du_sources :: T.Text
42 $(makeLenses ''DocumentUpload)
44 instance ToSchema DocumentUpload
45 instance FromJSON DocumentUpload
47 parseJSON = genericParseJSON
48 ( defaultOptions { sumEncoding = ObjectWithSingleField
49 , fieldLabelModifier = unCapitalize . dropPrefix "_du_"
50 , omitNothingFields = True
53 instance ToJSON DocumentUpload
55 toJSON = genericToJSON
56 ( defaultOptions { sumEncoding = ObjectWithSingleField
57 , fieldLabelModifier = unCapitalize . dropPrefix "_du_"
58 , omitNothingFields = True
62 type API = Summary " Document upload"
66 :> AsyncJobs JobLog '[JSON] DocumentUpload JobLog
68 api :: UserId -> NodeId -> GargServer API
71 JobFunction (\q log' -> do
72 documentUpload uId nId q (liftBase . log')
75 documentUpload :: (FlowCmdM env err m)
81 documentUpload _uId nId doc logStatus = do
82 let jl = JobLog { _scst_succeeded = Just 0
83 , _scst_failed = Just 0
84 , _scst_remaining = Just 1
85 , _scst_events = Just [] }
87 mcId <- getClosestParentIdByType' nId NodeCorpus
88 let cId = case mcId of
90 Nothing -> panic $ T.pack $ "[G.A.N.DU] Node has no corpus parent: " <> show nId
92 let (theFullDate, (year, month, day)) = dateSplit EN
94 $ view du_date doc <> "T:0:0:0"
96 let hd = HyperdataDocument { _hd_bdd = Nothing
99 , _hd_uniqId = Nothing
100 , _hd_uniqIdBdd = Nothing
102 , _hd_title = Just $ view du_title doc
103 , _hd_authors = Just $ view du_authors doc
104 , _hd_institutes = Nothing
105 , _hd_source = Just $ view du_sources doc
106 , _hd_abstract = Just $ view du_abstract doc
107 , _hd_publication_date = fmap (T.pack . show) theFullDate
108 , _hd_publication_year = year
109 , _hd_publication_month = month
110 , _hd_publication_day = day
111 , _hd_publication_hour = Nothing
112 , _hd_publication_minute = Nothing
113 , _hd_publication_second = Nothing
114 , _hd_language_iso2 = Just $ T.pack $ show EN }
116 docIds <- insertMasterDocs (Nothing :: Maybe HyperdataCorpus) (Multi EN) [hd]
117 _ <- Doc.add cId docIds
119 pure $ jobLogSuccess jl