2 Module : Gargantext.API.Node.Contact
4 Copyright : (c) CNRS, 2017-Present
5 License : AGPL + CECILL v3
6 Maintainer : team@gargantext.org
7 Stability : experimental
12 {-# OPTIONS_GHC -fno-warn-orphans #-}
14 {-# LANGUAGE ConstraintKinds #-}
15 {-# LANGUAGE KindSignatures #-}
16 {-# LANGUAGE ScopedTypeVariables #-}
17 {-# LANGUAGE TemplateHaskell #-}
18 {-# LANGUAGE TypeFamilies #-}
19 {-# LANGUAGE TypeOperators #-}
22 module Gargantext.API.Node.Contact
27 import Data.Either (Either(Right))
28 import Data.Maybe (Maybe(..))
30 import Data.Text (Text)
31 import GHC.Generics (Generic)
33 import Test.QuickCheck (elements)
34 import Test.QuickCheck.Arbitrary
36 import Gargantext.API.Admin.EnvTypes (Env, GargJob(..))
37 import Gargantext.API.Admin.Orchestrator.Types (JobLog(..), AsyncJobs)
38 import Gargantext.API.Admin.Types (HasSettings)
39 import Gargantext.API.Node
40 import Gargantext.API.Prelude (GargError, GargM, simuLogs)
41 import Gargantext.Core (Lang(..))
42 import Gargantext.Core.Text.Terms (TermType(..))
43 import Gargantext.Core.Types.Individu (User(..))
44 import Gargantext.Database.Action.Flow (flow)
45 import Gargantext.Database.Action.Flow.Types (FlowCmdM)
46 import Gargantext.Database.Admin.Types.Hyperdata (HyperdataAnnuaire(..), HyperdataContact)
47 import Gargantext.Database.Admin.Types.Hyperdata.Contact (hyperdataContact)
48 import Gargantext.Database.Admin.Types.Node
49 import Gargantext.Prelude (($), liftBase, (.), printDebug, pure)
50 import qualified Gargantext.Utils.Aeson as GUA
51 import Gargantext.Utils.Jobs (serveJobsAPI)
53 ------------------------------------------------------------------------
54 type API = "contact" :> Summary "Contact endpoint"
56 :<|> Capture "contact_id" NodeId
57 :> NodeNodeAPI HyperdataContact
60 api :: UserId -> CorpusId -> ServerT API (GargM Env GargError)
61 api uid cid = (api_async (RootId (NodeId uid)) cid)
62 :<|> (nodeNodeAPI (Proxy :: Proxy HyperdataContact) uid cid)
64 type API_Async = AsyncJobs JobLog '[JSON] AddContactParams JobLog
65 ------------------------------------------------------------------------
66 data AddContactParams = AddContactParams { firstname :: !Text, lastname :: !Text }
67 | AddContactParamsAdvanced { firstname :: !Text
69 -- TODO add others fields
73 ----------------------------------------------------------------------
74 api_async :: User -> NodeId -> ServerT API_Async (GargM Env GargError)
76 serveJobsAPI AddContactJob $ \p log ->
79 printDebug "addContact" x
81 in addContact u nId p (liftBase . log')
83 addContact :: (HasSettings env, FlowCmdM env err m)
89 addContact u nId (AddContactParams fn ln) logStatus = do
91 logStatus JobLog { _scst_succeeded = Just 1
92 , _scst_failed = Just 0
93 , _scst_remaining = Just 1
94 , _scst_events = Just []
96 _ <- flow (Nothing :: Maybe HyperdataAnnuaire) u (Right [nId]) (Multi EN) Nothing (Just 1, yield $ hyperdataContact fn ln) logStatus
98 pure JobLog { _scst_succeeded = Just 2
99 , _scst_failed = Just 0
100 , _scst_remaining = Just 0
101 , _scst_events = Just []
103 addContact _uId _nId _p logStatus = do
104 simuLogs logStatus 10
106 ------------------------------------------------------------------------
107 -- TODO unPrefix "pn_" FromJSON, ToJSON, ToSchema, adapt frontend.
108 instance FromJSON AddContactParams where
109 parseJSON = genericParseJSON (defaultOptions { sumEncoding = GUA.defaultTaggedObject })
111 instance ToJSON AddContactParams where
112 toJSON = genericToJSON (defaultOptions { sumEncoding = GUA.defaultTaggedObject })
114 instance ToSchema AddContactParams
115 instance Arbitrary AddContactParams where
116 arbitrary = elements [AddContactParams "Pierre" "Dupont"]
118 ------------------------------------------------------------------------