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.User (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 PhyloConfig of Gargantext
31 publicNodeTypes :: [NodeType]
32 publicNodeTypes = [NodeDashboard, NodeGraph, NodePhylo, NodeFile]
34 ------------------------------------------------------------------------
35 data ShareNodeWith = ShareNodeWith_User { snwu_nodetype :: NodeType
38 | ShareNodeWith_Node { snwn_nodetype :: NodeType
39 , snwn_node_id :: NodeId
41 ------------------------------------------------------------------------
42 shareNodeWith :: HasNodeError err
46 shareNodeWith (ShareNodeWith_User NodeFolderShared u) n = do
47 nodeToCheck <- getNode n
48 userIdCheck <- getUserId u
49 if not (hasNodeType nodeToCheck NodeTeam)
50 then errorWith "[G.D.A.S.shareNodeWith] Can share node Team only"
52 if (view node_user_id nodeToCheck == userIdCheck)
53 then errorWith "[G.D.A.S.shareNodeWith] Can share to others only"
55 folderSharedId <- getFolderId u NodeFolderShared
56 insertDB ([NodeNode { _nn_node1_id = folderSharedId
59 , _nn_category = Nothing }]:: [NodeNode])
61 shareNodeWith (ShareNodeWith_Node NodeFolderPublic nId) n = do
62 nodeToCheck <- getNode n
63 if not (isInNodeTypes nodeToCheck publicNodeTypes)
64 then errorWith $ "[G.D.A.S.shareNodeWith] Can share this nodesTypes only: "
65 <> (cs $ show publicNodeTypes)
67 folderToCheck <- getNode nId
68 if hasNodeType folderToCheck NodeFolderPublic
69 then insertDB ([NodeNode { _nn_node1_id = nId
72 , _nn_category = Nothing }] :: [NodeNode])
73 else errorWith "[G.D.A.S.shareNodeWith] Can share NodeWith NodeFolderPublic only"
75 shareNodeWith _ _ = errorWith "[G.D.A.S.shareNodeWith] Not implemented for this NodeType"
77 ------------------------------------------------------------------------
78 getFolderId :: HasNodeError err => User -> NodeType -> Cmd err NodeId
81 s <- getNodesWith rootId HyperdataAny (Just nt) Nothing Nothing
83 Nothing -> errorWith "[G.D.A.S.getFolderId] No folder shared found"
84 Just f -> pure (_node_id f)
86 ------------------------------------------------------------------------
89 delFolderTeam :: HasNodeError err => User -> TeamId -> Cmd err Int
90 delFolderTeam u nId = do
91 folderSharedId <- getFolderId u NodeFolderShared
92 deleteNodeNode folderSharedId nId
94 unPublish :: HasNodeError err
97 unPublish p n = deleteNodeNode p n