-}
+
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