]> Git — Sourcephile - gargantext.git/blob - src/Gargantext/Database/Action/Share.hs
Merge branch 'dev-phylo' of https://gitlab.iscpif.fr/gargantext/haskell-gargantext...
[gargantext.git] / src / Gargantext / Database / Action / Share.hs
1 {-|
2 Module : Gargantext.Database.Action.Share
3 Description :
4 Copyright : (c) CNRS, 2017-Present
5 License : AGPL + CECILL v3
6 Maintainer : team@gargantext.org
7 Stability : experimental
8 Portability : POSIX
9
10 -}
11
12
13 module Gargantext.Database.Action.Share
14 where
15
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
29
30 -- | TODO move in PhyloConfig of Gargantext
31 publicNodeTypes :: [NodeType]
32 publicNodeTypes = [NodeDashboard, NodeGraph, NodePhylo, NodeFile]
33
34 ------------------------------------------------------------------------
35 data ShareNodeWith = ShareNodeWith_User { snwu_nodetype :: NodeType
36 , snwu_user :: User
37 }
38 | ShareNodeWith_Node { snwn_nodetype :: NodeType
39 , snwn_node_id :: NodeId
40 }
41 ------------------------------------------------------------------------
42 shareNodeWith :: HasNodeError err
43 => ShareNodeWith
44 -> NodeId
45 -> Cmd err Int
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"
51 else
52 if (view node_user_id nodeToCheck == userIdCheck)
53 then errorWith "[G.D.A.S.shareNodeWith] Can share to others only"
54 else do
55 folderSharedId <- getFolderId u NodeFolderShared
56 insertDB ([NodeNode { _nn_node1_id = folderSharedId
57 , _nn_node2_id = n
58 , _nn_score = Nothing
59 , _nn_category = Nothing }]:: [NodeNode])
60
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)
66 else do
67 folderToCheck <- getNode nId
68 if hasNodeType folderToCheck NodeFolderPublic
69 then insertDB ([NodeNode { _nn_node1_id = nId
70 , _nn_node2_id = n
71 , _nn_score = Nothing
72 , _nn_category = Nothing }] :: [NodeNode])
73 else errorWith "[G.D.A.S.shareNodeWith] Can share NodeWith NodeFolderPublic only"
74
75 shareNodeWith _ _ = errorWith "[G.D.A.S.shareNodeWith] Not implemented for this NodeType"
76
77 ------------------------------------------------------------------------
78 getFolderId :: HasNodeError err => User -> NodeType -> Cmd err NodeId
79 getFolderId u nt = do
80 rootId <- getRootId u
81 s <- getNodesWith rootId HyperdataAny (Just nt) Nothing Nothing
82 case head s of
83 Nothing -> errorWith "[G.D.A.S.getFolderId] No folder shared found"
84 Just f -> pure (_node_id f)
85
86 ------------------------------------------------------------------------
87 type TeamId = NodeId
88
89 delFolderTeam :: HasNodeError err => User -> TeamId -> Cmd err Int
90 delFolderTeam u nId = do
91 folderSharedId <- getFolderId u NodeFolderShared
92 deleteNodeNode folderSharedId nId
93
94 unPublish :: HasNodeError err
95 => ParentId -> NodeId
96 -> Cmd err Int
97 unPublish p n = deleteNodeNode p n
98