[tree] refactor "root" variable name
[gargantext.git] / src / Gargantext / Database / Action / Share.hs
index 05aed845f31794481ec9fbcb2e4a8f15a3c0a3b5..09875f122ddbc0a5824d6bab740be9a4282c536c 100644 (file)
@@ -9,54 +9,84 @@ Portability : POSIX
 
 -}
 
+
 module Gargantext.Database.Action.Share
   where
 
 import Control.Lens (view)
+import Gargantext.Database
 import Gargantext.Core.Types.Individu (User(..))
-import Gargantext.Database.Action.Flow.Utils (getUserId)
-import Gargantext.Database.Admin.Config (hasNodeType)
-import Gargantext.Database.Admin.Types.Node (NodeId)
-import Gargantext.Database.Admin.Types.Node -- (NodeType(..))
-import Gargantext.Database.Prelude (Cmd)
+import Gargantext.Database.Action.User (getUserId)
+import Gargantext.Database.Admin.Config (hasNodeType, isInNodeTypes)
+import Gargantext.Database.Admin.Types.Hyperdata (HyperdataAny(..))
+import Gargantext.Database.Admin.Types.Node
 import Gargantext.Database.Query.Table.Node (getNode, getNodesWith)
-import Gargantext.Database.Query.Table.Node.Error (HasNodeError)
-import Gargantext.Database.Query.Table.NodeNode (insertNodeNode, deleteNodeNode)
+import Gargantext.Database.Query.Table.Node.Error (HasNodeError, errorWith)
+import Gargantext.Database.Query.Table.NodeNode (deleteNodeNode)
 import Gargantext.Database.Query.Tree.Root (getRootId)
 import Gargantext.Database.Schema.Node
-import Gargantext.Database.Schema.NodeNode (NodeNodePoly(..))
 import Gargantext.Prelude
 
+-- | TODO move in Config of Gargantext
+publicNodeTypes :: [NodeType]
+publicNodeTypes = [NodeDashboard, NodeGraph, NodePhylo, NodeFile]
+
+------------------------------------------------------------------------
+data ShareNodeWith = ShareNodeWith_User { snwu_nodetype :: NodeType
+                                        , snwu_user     :: User
+                                        }
+                   | ShareNodeWith_Node { snwn_nodetype :: NodeType
+                                        , snwn_node_id  :: NodeId
+                                        }
 ------------------------------------------------------------------------
 shareNodeWith :: HasNodeError err
-              => NodeId
-              -> User
-              -> Cmd err Int64
-shareNodeWith n u = do
+              => ShareNodeWith
+              -> NodeId
+              -> Cmd err Int
+shareNodeWith (ShareNodeWith_User NodeFolderShared u) n = do
   nodeToCheck <- getNode   n
   userIdCheck <- getUserId u
   if not (hasNodeType nodeToCheck NodeTeam)
-    then panic "Can share node Team only"
-    else if (view node_userId nodeToCheck == userIdCheck)
-     then panic "Can share to others only"
-     else do 
-       folderSharedId  <- getFolderSharedId u
-       insertNodeNode [NodeNode folderSharedId n Nothing Nothing]
-------------------------------------------------------------------------
+    then errorWith "[G.D.A.S.shareNodeWith] Can share node Team only"
+    else
+      if (view node_userId nodeToCheck == userIdCheck)
+        then errorWith "[G.D.A.S.shareNodeWith] Can share to others only"
+        else do
+          folderSharedId  <- getFolderId u NodeFolderShared
+          insertDB ([NodeNode folderSharedId n Nothing Nothing]:: [NodeNode])
 
-getFolderSharedId :: User -> Cmd err NodeId
-getFolderSharedId u = do
+shareNodeWith (ShareNodeWith_Node NodeFolderPublic nId) n = do
+  nodeToCheck <- getNode n
+  if not (isInNodeTypes nodeToCheck publicNodeTypes)
+    then errorWith $ "[G.D.A.S.shareNodeWith] Can share this nodesTypes only: "
+                   <> (cs $ show publicNodeTypes)
+    else do
+      folderToCheck <- getNode nId
+      if hasNodeType folderToCheck NodeFolderPublic
+         then insertDB ([NodeNode nId n Nothing Nothing] :: [NodeNode])
+         else errorWith "[G.D.A.S.shareNodeWith] Can share NodeWith NodeFolderPublic only"
+
+shareNodeWith _ _ = errorWith "[G.D.A.S.shareNodeWith] Not implemented for this NodeType"
+
+------------------------------------------------------------------------
+getFolderId :: HasNodeError err => User -> NodeType -> Cmd err NodeId
+getFolderId u nt = do
   rootId <- getRootId u
-  s <- getNodesWith rootId HyperdataAny (Just NodeFolderShared) Nothing Nothing
+  s <- getNodesWith rootId HyperdataAny (Just nt) Nothing Nothing
   case head s of
-    Nothing -> panic "No folder shared found"
+    Nothing -> errorWith "[G.D.A.S.getFolderId] No folder shared found"
     Just  f -> pure (_node_id f)
 
+------------------------------------------------------------------------
 type TeamId = NodeId
 
-delFolderTeam :: User -> TeamId -> Cmd err Int
+delFolderTeam :: HasNodeError err => User -> TeamId -> Cmd err Int
 delFolderTeam u nId = do
-  folderSharedId <- getFolderSharedId u
+  folderSharedId <- getFolderId u NodeFolderShared
   deleteNodeNode folderSharedId nId
 
+unPublish :: HasNodeError err
+          => ParentId -> NodeId
+          -> Cmd err Int
+unPublish p n = deleteNodeNode p n