2 Module : Gargantext.Database.Action.Share
4 Copyright : (c) CNRS, 2017-Present
5 License : AGPL + CECILL v3
6 Maintainer : team@gargantext.org
7 Stability : experimental
13 module Gargantext.Database.Action.Share
16 import Control.Lens (view)
17 import Gargantext.Database
18 import Gargantext.Core.Types.Individu (User(..))
19 import Gargantext.Database.Action.Flow.Utils (getUserId)
20 import Gargantext.Database.Admin.Config (hasNodeType, isInNodeTypes)
21 import Gargantext.Database.Admin.Types.Hyperdata (HyperdataAny(..))
22 import Gargantext.Database.Admin.Types.Node
23 import Gargantext.Database.Query.Table.Node (getNode, getNodesWith)
24 import Gargantext.Database.Query.Table.Node.Error (HasNodeError, errorWith)
25 import Gargantext.Database.Query.Table.NodeNode (deleteNodeNode)
26 import Gargantext.Database.Query.Tree.Root (getRootId)
27 import Gargantext.Database.Schema.Node
28 import Gargantext.Prelude
30 -- | TODO move in Config of Gargantext
31 publicNodeTypes :: [NodeType]
32 publicNodeTypes = [NodeDashboard, NodeGraph, NodePhylo, NodeFile]
34 ------------------------------------------------------------------------
36 data ShareNodeWith = ShareNodeWith_User { snwu_nodetype :: NodeType
38 | ShareNodeWith_Node { snwn_nodetype :: NodeType
39 , snwn_node_id :: NodeId
42 ------------------------------------------------------------------------
43 shareNodeWith :: HasNodeError err
47 shareNodeWith (ShareNodeWith_User NodeFolderShared u) n = do
48 nodeToCheck <- getNode n
49 userIdCheck <- getUserId u
50 if not (hasNodeType nodeToCheck NodeTeam)
51 then errorWith "[G.D.A.S.shareNodeWith] Can share node Team only"
53 if (view node_userId nodeToCheck == userIdCheck)
54 then errorWith "[G.D.A.S.shareNodeWith] Can share to others only"
56 folderSharedId <- getFolderId u NodeFolderShared
57 insertDB ([NodeNode folderSharedId n Nothing Nothing]:: [NodeNode])
59 shareNodeWith (ShareNodeWith_Node NodeFolderPublic nId) n = do
60 nodeToCheck <- getNode n
61 if not (isInNodeTypes nodeToCheck publicNodeTypes)
62 then errorWith $ "[G.D.A.S.shareNodeWith] Can share this nodesTypes only: "
63 <> (cs $ show publicNodeTypes)
65 folderToCheck <- getNode nId
66 if hasNodeType folderToCheck NodeFolderPublic
67 then insertDB ([NodeNode nId n Nothing Nothing] :: [NodeNode])
68 else errorWith "[G.D.A.S.shareNodeWith] Can share NodeWith NodeFolderPublic only"
70 shareNodeWith _ _ = errorWith "[G.D.A.S.shareNodeWith] Not implemented for this NodeType"
72 ------------------------------------------------------------------------
73 getFolderId :: HasNodeError err => User -> NodeType -> Cmd err NodeId
76 s <- getNodesWith rootId HyperdataAny (Just nt) Nothing Nothing
78 Nothing -> errorWith "[G.D.A.S.getFolderId] No folder shared found"
79 Just f -> pure (_node_id f)
81 ------------------------------------------------------------------------
84 delFolderTeam :: HasNodeError err => User -> TeamId -> Cmd err Int
85 delFolderTeam u nId = do
86 folderSharedId <- getFolderId u NodeFolderShared
87 deleteNodeNode folderSharedId nId
90 unPublish :: HasNodeError err
93 unPublish p n = deleteNodeNode p n