Update.hs 7.63 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
{-|
Module      : Gargantext.API.Node.Update
Description :
Copyright   : (c) CNRS, 2017-Present
License     : AGPL + CECILL v3
Maintainer  : team@gargantext.org
Stability   : experimental
Portability : POSIX

-}

{-# LANGUAGE TemplateHaskell    #-}
{-# LANGUAGE TypeOperators      #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}

module Gargantext.API.Node.Update
      where

19
import Control.Lens (view)
20
import Data.Aeson
21
import Data.Maybe (Maybe(..))
22 23
import Data.Swagger
import GHC.Generics (Generic)
24
import Gargantext.API.Admin.Orchestrator.Types (JobLog(..), AsyncJobs)
25
import Gargantext.API.Admin.Types (HasSettings)
26
import qualified Gargantext.API.Metrics as Metrics
27
import Gargantext.API.Ngrams.List (reIndexWith)
28
import qualified Gargantext.API.Ngrams.Types as NgramsTypes
29
import Gargantext.API.Prelude (GargServer, simuLogs)
30
import Gargantext.Core.Methods.Distances (GraphMetric(..))
31
import Gargantext.Core.Types.Main (ListType(..))
32
import Gargantext.Core.Viz.Graph.API (recomputeGraph)
33
import Gargantext.Database.Action.Flow.Pairing (pairing)
34
import Gargantext.Database.Action.Flow.Types (FlowCmdM)
35
import Gargantext.Database.Admin.Types.Node
36 37 38
import Gargantext.Database.Query.Table.Node (getNode)
import Gargantext.Database.Schema.Node (node_parent_id)
import Gargantext.Database.Schema.Ngrams (NgramsType(NgramsTerms))
Alexandre Delanoë's avatar
Alexandre Delanoë committed
39
import Gargantext.Prelude (Ord, Eq, (<$>), ($), liftBase, (.), printDebug, pure, show, cs, (<>), panic)
40
import qualified Gargantext.Utils.Aeson as GUA
41 42 43 44 45 46
import Prelude (Enum, Bounded, minBound, maxBound)
import Servant
import Servant.Job.Async (JobFunction(..), serveJobsAPI)
import Test.QuickCheck (elements)
import Test.QuickCheck.Arbitrary
import qualified Data.Set as Set
47 48 49 50

------------------------------------------------------------------------
type API = Summary " Update node according to NodeType params"
         :> AsyncJobs JobLog '[JSON] UpdateNodeParams JobLog
51

52
------------------------------------------------------------------------
53 54 55 56
data UpdateNodeParams = UpdateNodeParamsList  { methodList  :: !Method      }
                      | UpdateNodeParamsGraph { methodGraph :: !GraphMetric }
                      | UpdateNodeParamsTexts { methodTexts :: !Granularity }
                      | UpdateNodeParamsBoard { methodBoard :: !Charts      }
57
                      | LinkNodeReq { nodeType :: !NodeType, id :: !NodeId }
58 59 60 61 62 63 64 65 66 67 68 69 70 71
    deriving (Generic)

----------------------------------------------------------------------
data Method = Basic | Advanced | WithModel
    deriving (Generic, Eq, Ord, Enum, Bounded)

----------------------------------------------------------------------
data Granularity = NewNgrams | NewTexts | Both
    deriving (Generic, Eq, Ord, Enum, Bounded)

----------------------------------------------------------------------
data Charts = Sources | Authors | Institutes | Ngrams | All
    deriving (Generic, Eq, Ord, Enum, Bounded)

72 73 74 75
------------------------------------------------------------------------
api :: UserId -> NodeId -> GargServer API
api uId nId =
  serveJobsAPI $
76
    JobFunction (\p log'' ->
77 78 79
      let
        log' x = do
          printDebug "updateNode" x
80
          liftBase $ log'' x
81 82 83 84 85 86 87 88 89 90 91 92 93
      in updateNode uId nId p (liftBase . log')
      )

updateNode :: (HasSettings env, FlowCmdM env err m)
    => UserId
    -> NodeId
    -> UpdateNodeParams
    -> (JobLog -> m ())
    -> m JobLog
updateNode uId nId (UpdateNodeParamsGraph metric) logStatus = do

  logStatus JobLog { _scst_succeeded = Just 1
                   , _scst_failed    = Just 0
94
                   , _scst_remaining = Just 1
95 96 97
                   , _scst_events    = Just []
                   }

98
  _ <- recomputeGraph uId nId (Just metric)
99 100 101 102 103 104 105

  pure  JobLog { _scst_succeeded = Just 2
               , _scst_failed    = Just 0
               , _scst_remaining = Just 0
               , _scst_events    = Just []
               }

106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
updateNode _uId nid1 (LinkNodeReq nt nid2) logStatus = do
  logStatus JobLog { _scst_succeeded = Just 1
                   , _scst_failed    = Just 0
                   , _scst_remaining = Just 1
                   , _scst_events    = Just []
                   }
  _ <- case nt of
    NodeAnnuaire -> pairing nid2 nid1 Nothing -- defaultList
    NodeCorpus   -> pairing nid1 nid2 Nothing -- defaultList
    _            -> panic $ "[G.API.N.Update.updateNode] NodeType not implemented"
                           <> cs (show nt)

  pure  JobLog { _scst_succeeded = Just 2
               , _scst_failed    = Just 0
               , _scst_remaining = Just 0
               , _scst_events    = Just []
               }

124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
-- | `Advanced` to update graphs
updateNode _uId lId (UpdateNodeParamsList Advanced) logStatus = do
  logStatus JobLog { _scst_succeeded = Just 1
                   , _scst_failed    = Just 0
                   , _scst_remaining = Just 2
                   , _scst_events    = Just []
                   }
  corpusId <- view node_parent_id <$> getNode lId

  logStatus JobLog { _scst_succeeded = Just 2
                   , _scst_failed    = Just 0
                   , _scst_remaining = Just 1
                   , _scst_events    = Just []
                   }

  _ <- case corpusId of
    Just cId -> do
      _ <- Metrics.updatePie' cId (Just lId) NgramsTypes.Authors Nothing
      _ <- Metrics.updateTree' cId (Just lId) NgramsTypes.Institutes MapTerm
      _ <- Metrics.updatePie' cId (Just lId) NgramsTypes.Sources Nothing
      pure ()
    Nothing  -> pure ()

  pure  JobLog { _scst_succeeded = Just 3
               , _scst_failed    = Just 0
               , _scst_remaining = Just 0
               , _scst_events    = Just []
               }

153
updateNode _uId lId (UpdateNodeParamsList _mode) logStatus = do
154 155 156 157 158
  logStatus JobLog { _scst_succeeded = Just 1
                   , _scst_failed    = Just 0
                   , _scst_remaining = Just 2
                   , _scst_events    = Just []
                   }
159
  corpusId <- view node_parent_id <$> getNode lId
160 161 162 163 164 165 166 167

  logStatus JobLog { _scst_succeeded = Just 2
                   , _scst_failed    = Just 0
                   , _scst_remaining = Just 1
                   , _scst_events    = Just []
                   }

  _ <- case corpusId of
168
    Just cId -> reIndexWith cId lId NgramsTerms (Set.singleton MapTerm)
169 170 171 172 173 174 175 176
    Nothing  -> pure ()

  pure  JobLog { _scst_succeeded = Just 3
               , _scst_failed    = Just 0
               , _scst_remaining = Just 0
               , _scst_events    = Just []
               }

177 178 179 180

updateNode _uId _nId _p logStatus = do
  simuLogs logStatus 10

181 182
------------------------------------------------------------------------
-- TODO unPrefix "pn_" FromJSON, ToJSON, ToSchema, adapt frontend.
183
instance FromJSON  UpdateNodeParams where
184
  parseJSON = genericParseJSON (defaultOptions { sumEncoding = GUA.defaultTaggedObject })
185 186

instance ToJSON    UpdateNodeParams where
187
  toJSON = genericToJSON (defaultOptions { sumEncoding = GUA.defaultTaggedObject })
188
  
189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216
instance ToSchema  UpdateNodeParams
instance Arbitrary UpdateNodeParams where
  arbitrary = do
    l <- UpdateNodeParamsList  <$> arbitrary
    g <- UpdateNodeParamsGraph <$> arbitrary
    t <- UpdateNodeParamsTexts <$> arbitrary
    b <- UpdateNodeParamsBoard <$> arbitrary
    elements [l,g,t,b]

instance FromJSON  Method
instance ToJSON    Method
instance ToSchema  Method
instance Arbitrary Method where
  arbitrary = elements [ minBound .. maxBound ]

instance FromJSON  Granularity
instance ToJSON    Granularity
instance ToSchema  Granularity
instance Arbitrary Granularity where
  arbitrary = elements [ minBound .. maxBound ]

instance FromJSON  Charts
instance ToJSON    Charts
instance ToSchema  Charts
instance Arbitrary Charts where
  arbitrary = elements [ minBound .. maxBound ]

------------------------------------------------------------------------