]> Git — Sourcephile - gargantext.git/blob - src/Gargantext/Database/Action/Share.hs
[CLEAN] NodeError sugar (msg)
[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 module Gargantext.Database.Action.Share
13 where
14
15 import Control.Lens (view)
16 import Gargantext.Core.Types.Individu (User(..))
17 import Gargantext.Database.Action.Flow.Utils (getUserId)
18 import Gargantext.Database.Admin.Config (hasNodeType)
19 import Gargantext.Database.Admin.Types.Hyperdata (HyperdataAny(..))
20 import Gargantext.Database.Admin.Types.Node (NodeId)
21 import Gargantext.Database.Admin.Types.Node -- (NodeType(..))
22 import Gargantext.Database.Prelude (Cmd)
23 import Gargantext.Database.Query.Table.Node (getNode, getNodesWith)
24 import Gargantext.Database.Query.Table.Node.Error (HasNodeError, msg)
25 import Gargantext.Database.Query.Table.NodeNode (insertNodeNode, deleteNodeNode)
26 import Gargantext.Database.Query.Tree.Root (getRootId)
27 import Gargantext.Database.Schema.Node
28 import Gargantext.Database.Schema.NodeNode (NodeNodePoly(..))
29 import Gargantext.Prelude
30
31 ------------------------------------------------------------------------
32 shareNodeWith :: HasNodeError err
33 => NodeId
34 -> NodeType
35 -> User
36 -> Cmd err Int64
37 shareNodeWith n nt u = do
38 nodeToCheck <- getNode n
39 case nt of
40 NodeFolderShared -> do
41 userIdCheck <- getUserId u
42 if not (hasNodeType nodeToCheck NodeTeam)
43 then msg "Can share node Team only"
44 else
45 if (view node_userId nodeToCheck == userIdCheck)
46 then msg "Can share to others only"
47 else do
48 folderSharedId <- getFolderId u NodeFolderShared
49 insertNodeNode [NodeNode folderSharedId n Nothing Nothing]
50
51 NodeFolderPublic -> if not (hasNodeType nodeToCheck NodeGraph)
52 then msg "Can share node graph only"
53 else do
54 folderId <- getFolderId (UserDBId $ view node_userId nodeToCheck) NodeFolderPublic
55 insertNodeNode [NodeNode folderId n Nothing Nothing]
56
57 _ -> msg "shareNodeWith not implemented with this NodeType"
58
59 ------------------------------------------------------------------------
60 getFolderId :: HasNodeError err => User -> NodeType -> Cmd err NodeId
61 getFolderId u nt = do
62 rootId <- getRootId u
63 s <- getNodesWith rootId HyperdataAny (Just nt) Nothing Nothing
64 case head s of
65 Nothing -> msg "No folder shared found"
66 Just f -> pure (_node_id f)
67
68 ------------------------------------------------------------------------
69 type TeamId = NodeId
70
71 delFolderTeam :: HasNodeError err => User -> TeamId -> Cmd err Int
72 delFolderTeam u nId = do
73 folderSharedId <- getFolderId u NodeFolderShared
74 deleteNodeNode folderSharedId nId
75
76 unPublish :: HasNodeError err => User -> NodeId -> Cmd err Int
77 unPublish u nId = do
78 folderId <- getFolderId u NodeFolderPublic
79 deleteNodeNode folderId nId
80