[DEP] haskell-opaleye dep upgrade
[gargantext.git] / src / Gargantext / Database / Admin / Trigger / Nodes.hs
index aef31b2a21126ca07d41e160922374c9bf078953..5c31003d7350d8a28b12e514b8c2f82794e94437 100644 (file)
@@ -11,27 +11,24 @@ Triggers on Nodes table.
 
 -}
 
-{-# LANGUAGE FlexibleContexts  #-}
 {-# LANGUAGE QuasiQuotes       #-}
-{-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE RankNTypes        #-}
 
 module Gargantext.Database.Admin.Trigger.Nodes
   where
 
+import Data.Text (Text)
 import Database.PostgreSQL.Simple.SqlQQ (sql)
-import Gargantext.Database.Admin.Config (nodeTypeId)
+import Gargantext.Core (HasDBid(..))
 import Gargantext.Database.Admin.Types.Node -- (ListId, CorpusId, NodeId)
 import Gargantext.Database.Prelude (Cmd, execPGSQuery)
 import Gargantext.Prelude
 import qualified Database.PostgreSQL.Simple as DPS
 
 
-triggerSearchUpdate :: Cmd err Int64
-triggerSearchUpdate = execPGSQuery query ( nodeTypeId NodeDocument
-                                         , nodeTypeId NodeDocument
-                                         , nodeTypeId NodeContact
+triggerSearchUpdate :: HasDBid NodeType => Cmd err Int64
+triggerSearchUpdate = execPGSQuery query ( toDBid NodeDocument
+                                         , toDBid NodeDocument
+                                         , toDBid NodeContact
                                          )
   where
     query :: DPS.Query
@@ -70,3 +67,52 @@ triggerSearchUpdate = execPGSQuery query ( nodeTypeId NodeDocument
 
   |]
 
+type Secret = Text
+
+triggerUpdateHash :: HasDBid NodeType => Secret -> Cmd err Int64
+triggerUpdateHash secret = execPGSQuery query ( toDBid NodeDocument
+                                              , toDBid NodeContact
+                                              , secret
+                                              , secret
+                                              , toDBid NodeDocument
+                                              , toDBid NodeContact
+                                              , secret
+                                              , secret
+                                              )
+  where
+    query :: DPS.Query
+    query = [sql|
+
+      CREATE OR REPLACE FUNCTION hash_insert_nodes()
+      RETURNS trigger AS $$
+      BEGIN
+       IF NEW.hash_id = ''
+         THEN
+           IF NEW.typename = ? OR NEW.typename = ?
+             THEN NEW.hash_id = digest(CONCAT(?, NEW.typename, NEW.name, NEW.parent_id, NEW.hyperdata), 'sha256');
+             ELSE NEW.hash_id = digest(CONCAT(?, NEW.typename, NEW.name, NEW.id, NEW.hyperdata), 'sha256');
+           END IF;
+        END IF;
+        RETURN NEW;
+      END
+      $$ LANGUAGE plpgsql;
+
+
+      CREATE OR REPLACE FUNCTION hash_update_nodes()
+      RETURNS trigger AS $$
+      BEGIN
+        IF NEW.typename = ? OR NEW.typename = ?
+             THEN NEW.hash_id = digest(CONCAT(?, NEW.typename, NEW.name, NEW.parent_id, NEW.hyperdata), 'sha256');
+             ELSE NEW.hash_id = digest(CONCAT(?, NEW.typename, NEW.name, NEW.id, NEW.hyperdata), 'sha256');
+        END IF;
+        RETURN NEW;
+      END
+      $$ LANGUAGE plpgsql;
+
+
+      CREATE TRIGGER nodes_hash_insert BEFORE INSERT ON nodes FOR EACH ROW EXECUTE PROCEDURE hash_insert_nodes();
+      CREATE TRIGGER nodes_hash_update BEFORE UPDATE ON nodes FOR EACH ROW EXECUTE PROCEDURE hash_update_nodes();
+
+  |]
+
+