Commit f58dad0d authored by Alexandre Delanoë's avatar Alexandre Delanoë

[FEAT] public node sharing/unpublish implemented (need api and web rights)

parent 55b37efd
#!/bin/bash
psql postgresql://gargantua:C8kdcUrAQy66U@localhost/gargandbV5
...@@ -31,7 +31,8 @@ import Test.QuickCheck (elements) ...@@ -31,7 +31,8 @@ import Test.QuickCheck (elements)
import Test.QuickCheck.Arbitrary import Test.QuickCheck.Arbitrary
------------------------------------------------------------------------ ------------------------------------------------------------------------
data ShareNode = ShareNode { username :: Text } data ShareNode = ShareTeam { username :: Text }
| SharePublic { rights :: Text}
deriving (Generic) deriving (Generic)
------------------------------------------------------------------------ ------------------------------------------------------------------------
-- TODO unPrefix "pn_" FromJSON, ToJSON, ToSchema, adapt frontend. -- TODO unPrefix "pn_" FromJSON, ToJSON, ToSchema, adapt frontend.
...@@ -39,8 +40,8 @@ instance FromJSON ShareNode ...@@ -39,8 +40,8 @@ instance FromJSON ShareNode
instance ToJSON ShareNode instance ToJSON ShareNode
instance ToSchema ShareNode instance ToSchema ShareNode
instance Arbitrary ShareNode where instance Arbitrary ShareNode where
arbitrary = elements [ ShareNode "user1" arbitrary = elements [ ShareTeam "user1"
, ShareNode "user2" , SharePublic "public"
] ]
------------------------------------------------------------------------ ------------------------------------------------------------------------
-- TODO permission -- TODO permission
...@@ -48,8 +49,10 @@ api :: HasNodeError err ...@@ -48,8 +49,10 @@ api :: HasNodeError err
=> NodeId => NodeId
-> ShareNode -> ShareNode
-> Cmd err Int -> Cmd err Int
api nId (ShareNode user) = api nId (ShareTeam user) =
fromIntegral <$> shareNodeWith nId (UserName user) fromIntegral <$> shareNodeWith nId NodeFolderShared (UserName user)
api nId (SharePublic _rights) =
fromIntegral <$> shareNodeWith nId NodeFolderPublic UserPublic
------------------------------------------------------------------------ ------------------------------------------------------------------------
type API = Summary " Share Node with username" type API = Summary " Share Node with username"
......
...@@ -224,7 +224,7 @@ serverPrivateGargAPI' (AuthenticatedUser (NodeId uid)) ...@@ -224,7 +224,7 @@ serverPrivateGargAPI' (AuthenticatedUser (NodeId uid))
:<|> withAccess (Proxy :: Proxy TreeAPI) Proxy uid :<|> withAccess (Proxy :: Proxy TreeAPI) Proxy uid
<$> PathNode <*> treeAPI <$> PathNode <*> treeAPI
-- TODO access -- TODO access
:<|> addCorpusWithForm (UserDBId uid) :<|> addCorpusWithForm (RootId (NodeId uid))
:<|> addCorpusWithQuery (RootId (NodeId uid)) :<|> addCorpusWithQuery (RootId (NodeId uid))
-- :<|> addAnnuaireWithForm -- :<|> addAnnuaireWithForm
......
...@@ -25,7 +25,7 @@ import Gargantext.Prelude hiding (reverse) ...@@ -25,7 +25,7 @@ import Gargantext.Prelude hiding (reverse)
import qualified Gargantext.Core.Auth as Auth import qualified Gargantext.Core.Auth as Auth
-- FIXME UserName used twice -- FIXME UserName used twice
data User = UserDBId UserId | UserName Text | RootId NodeId data User = UserDBId UserId | UserName Text | RootId NodeId | UserPublic
deriving (Eq) deriving (Eq)
type Username = Text type Username = Text
......
...@@ -29,6 +29,7 @@ import Gargantext.Prelude ...@@ -29,6 +29,7 @@ import Gargantext.Prelude
import qualified Gargantext.Database.Query.Table.Node as N (getNode, deleteNode) import qualified Gargantext.Database.Query.Table.Node as N (getNode, deleteNode)
import Gargantext.Database.Action.Share (delFolderTeam) import Gargantext.Database.Action.Share (delFolderTeam)
------------------------------------------------------------------------
deleteNode :: HasNodeError err deleteNode :: HasNodeError err
=> User => User
-> NodeId -> NodeId
...@@ -46,3 +47,4 @@ deleteNode u nodeId = do ...@@ -46,3 +47,4 @@ deleteNode u nodeId = do
else N.deleteNode nodeId else N.deleteNode nodeId
...@@ -40,6 +40,7 @@ getUserId (UserName u ) = do ...@@ -40,6 +40,7 @@ getUserId (UserName u ) = do
case muser of case muser of
Just user -> pure $ userLight_id user Just user -> pure $ userLight_id user
Nothing -> nodeError NoUserFound Nothing -> nodeError NoUserFound
getUserId UserPublic = nodeError NoUserFound
toMaps :: Hyperdata a toMaps :: Hyperdata a
......
...@@ -31,24 +31,36 @@ import Gargantext.Prelude ...@@ -31,24 +31,36 @@ import Gargantext.Prelude
------------------------------------------------------------------------ ------------------------------------------------------------------------
shareNodeWith :: HasNodeError err shareNodeWith :: HasNodeError err
=> NodeId => NodeId
-> NodeType
-> User -> User
-> Cmd err Int64 -> Cmd err Int64
shareNodeWith n u = do shareNodeWith n nt u = do
nodeToCheck <- getNode n nodeToCheck <- getNode n
case nt of
NodeFolderShared -> do
userIdCheck <- getUserId u userIdCheck <- getUserId u
if not (hasNodeType nodeToCheck NodeTeam) if not (hasNodeType nodeToCheck NodeTeam)
then panic "Can share node Team only" then panic "Can share node Team only"
else if (view node_userId nodeToCheck == userIdCheck) else
if (view node_userId nodeToCheck == userIdCheck)
then panic "Can share to others only" then panic "Can share to others only"
else do else do
folderSharedId <- getFolderSharedId u folderSharedId <- getFolderId u NodeFolderShared
insertNodeNode [NodeNode folderSharedId n Nothing Nothing] insertNodeNode [NodeNode folderSharedId n Nothing Nothing]
------------------------------------------------------------------------
getFolderSharedId :: User -> Cmd err NodeId NodeFolderPublic -> if not (hasNodeType nodeToCheck NodeGraph)
getFolderSharedId u = do then panic "Can share node graph only"
else do
folderId <- getFolderId (UserDBId $ view node_userId nodeToCheck) NodeFolderPublic
insertNodeNode [NodeNode folderId n Nothing Nothing]
_ -> panic "shareNodeWith not implemented with this NodeType"
------------------------------------------------------------------------
getFolderId :: User -> NodeType -> Cmd err NodeId
getFolderId u nt = do
rootId <- getRootId u rootId <- getRootId u
s <- getNodesWith rootId HyperdataAny (Just NodeFolderShared) Nothing Nothing s <- getNodesWith rootId HyperdataAny (Just nt) Nothing Nothing
case head s of case head s of
Nothing -> panic "No folder shared found" Nothing -> panic "No folder shared found"
Just f -> pure (_node_id f) Just f -> pure (_node_id f)
...@@ -57,7 +69,12 @@ type TeamId = NodeId ...@@ -57,7 +69,12 @@ type TeamId = NodeId
delFolderTeam :: User -> TeamId -> Cmd err Int delFolderTeam :: User -> TeamId -> Cmd err Int
delFolderTeam u nId = do delFolderTeam u nId = do
folderSharedId <- getFolderSharedId u folderSharedId <- getFolderId u NodeFolderShared
deleteNodeNode folderSharedId nId deleteNodeNode folderSharedId nId
unPublish :: User -> NodeId -> Cmd err Int
unPublish u nId = do
folderId <- getFolderId u NodeFolderPublic
deleteNodeNode folderId nId
...@@ -84,11 +84,10 @@ nodeTypeId n = ...@@ -84,11 +84,10 @@ nodeTypeId n =
-- Node management -- Node management
-- NodeFavorites -> 15 -- NodeFavorites -> 15
hasNodeType :: forall a. Node a -> NodeType -> Bool hasNodeType :: forall a. Node a -> NodeType -> Bool
hasNodeType n nt = (view node_typename n) == (nodeTypeId nt) hasNodeType n nt = (view node_typename n) == (nodeTypeId nt)
--
-- | Nodes are typed in the database according to a specific ID -- | Nodes are typed in the database according to a specific ID
-- --
nodeTypeInv :: [(NodeTypeId, NodeType)] nodeTypeInv :: [(NodeTypeId, NodeType)]
......
...@@ -89,18 +89,19 @@ tree_advanced :: HasTreeError err ...@@ -89,18 +89,19 @@ tree_advanced :: HasTreeError err
-> Cmd err (Tree NodeTree) -> Cmd err (Tree NodeTree)
tree_advanced r nodeTypes = do tree_advanced r nodeTypes = do
mainRoot <- dbTree r nodeTypes mainRoot <- dbTree r nodeTypes
sharedRoots <- findShared r nodeTypes sharedRoots <- findShared r NodeFolderShared nodeTypes
toTree $ toTreeParent (mainRoot <> sharedRoots) publicRoots <- findShared r NodeFolderPublic nodeTypes
toTree $ toTreeParent (mainRoot <> sharedRoots <> publicRoots)
------------------------------------------------------------------------ ------------------------------------------------------------------------
-- | Collaborative Nodes in the Tree -- | Collaborative Nodes in the Tree
findShared :: RootId -> [NodeType] -> Cmd err [DbTreeNode] findShared :: RootId -> NodeType -> [NodeType] -> Cmd err [DbTreeNode]
findShared r nt = do findShared r nt nts = do
folderSharedId <- maybe (panic "no folder found") identity folderSharedId <- maybe (panic "no folder found") identity
<$> head <$> head
<$> findNodesId r [NodeFolderShared] <$> findNodesId r [nt]
folders <- getNodeNode folderSharedId folders <- getNodeNode folderSharedId
nodesSharedId <- mapM (\child -> sharedTree folderSharedId child nt) nodesSharedId <- mapM (\child -> sharedTree folderSharedId child nts)
$ map _nn_node2_id folders $ map _nn_node2_id folders
pure $ concat nodesSharedId pure $ concat nodesSharedId
......
...@@ -147,4 +147,4 @@ selectRoot (RootId nid) = ...@@ -147,4 +147,4 @@ selectRoot (RootId nid) =
restrict -< _node_typename row .== (pgInt4 $ nodeTypeId NodeUser) restrict -< _node_typename row .== (pgInt4 $ nodeTypeId NodeUser)
restrict -< _node_id row .== (pgNodeId nid) restrict -< _node_id row .== (pgNodeId nid)
returnA -< row returnA -< row
selectRoot UserPublic = panic "No root for Public"
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment