Commit ee0a337c authored by Alfredo Di Napoli's avatar Alfredo Di Napoli

WIP3

parent 8a63378a
...@@ -29,6 +29,7 @@ import Gargantext.Core.NodeStory.Types ...@@ -29,6 +29,7 @@ import Gargantext.Core.NodeStory.Types
import Gargantext.Core.Text.Ngrams (NgramsType) import Gargantext.Core.Text.Ngrams (NgramsType)
import Gargantext.Core.Types.Main ( ListType(..) ) import Gargantext.Core.Types.Main ( ListType(..) )
import Gargantext.Database.Admin.Types.Node ( NodeId, ListId ) import Gargantext.Database.Admin.Types.Node ( NodeId, ListId )
import Gargantext.Database.Prelude
import Gargantext.Prelude import Gargantext.Prelude
...@@ -39,10 +40,10 @@ type RootTerm = NgramsTerm ...@@ -39,10 +40,10 @@ type RootTerm = NgramsTerm
getRepo :: HasNodeStory env err m getRepo :: HasNodeStory env err m
=> [ListId] -> m NodeListStory => [ListId] -> m (DBQuery err x NodeListStory)
getRepo listIds = do getRepo listIds = do
f <- getNodeListStoryMulti f <- getNodeListStoryMulti
liftBase $ f listIds pure $ f listIds
-- v <- liftBase $ f listIds -- v <- liftBase $ f listIds
-- v' <- liftBase $ atomically $ readTVar v -- v' <- liftBase $ atomically $ readTVar v
-- pure $ v' -- pure $ v'
...@@ -58,24 +59,23 @@ repoSize repo node_id = Map.map Map.size state' ...@@ -58,24 +59,23 @@ repoSize repo node_id = Map.map Map.size state'
. a_state . a_state
getNodeStory :: HasNodeStory env err m getNodeStory :: HasNodeStory env err m => ListId -> m (DBQuery err x ArchiveList)
=> ListId -> m ArchiveList
getNodeStory l = do getNodeStory l = do
f <- getNodeListStory f <- getNodeListStory
liftBase $ f l pure $ f l
-- v <- liftBase $ f l -- v <- liftBase $ f l
-- pure v -- pure v
getNodeListStory :: HasNodeStory env err m getNodeListStory :: HasNodeStory env err m
=> m (NodeId -> IO ArchiveList) => m (NodeId -> DBQuery err x ArchiveList)
getNodeListStory = do getNodeListStory = do
env <- view hasNodeStory env <- view hasNodeStory
pure $ view nse_getter env pure $ view nse_getter env
getNodeListStoryMulti :: HasNodeStory env err m getNodeListStoryMulti :: HasNodeStory env err m
=> m ([NodeId] -> IO NodeListStory) => m ([NodeId] -> DBQuery err x NodeListStory)
getNodeListStoryMulti = do getNodeListStoryMulti = do
env <- view hasNodeStory env <- view hasNodeStory
pure $ view nse_getter_multi env pure $ view nse_getter_multi env
...@@ -104,23 +104,24 @@ listNgramsFromRepo nodeIds ngramsType repo = ...@@ -104,23 +104,24 @@ listNgramsFromRepo nodeIds ngramsType repo =
-- be properly guarded. -- be properly guarded.
getListNgrams :: HasNodeStory env err m getListNgrams :: HasNodeStory env err m
=> [ListId] -> NgramsType => [ListId] -> NgramsType
-> m (HashMap NgramsTerm NgramsRepoElement) -> m (DBQuery err x (HashMap NgramsTerm NgramsRepoElement))
getListNgrams nodeIds ngramsType = listNgramsFromRepo nodeIds ngramsType getListNgrams nodeIds ngramsType = fmap (listNgramsFromRepo nodeIds ngramsType)
<$> getRepo nodeIds <$> getRepo nodeIds
-- | Fetch terms from repo, gathering terms under the same root (parent). -- | Fetch terms from repo, gathering terms under the same root (parent).
getTermsWith :: forall a env err m. getTermsWith :: forall a env err m x.
(HasNodeStory env err m, Eq a, Hashable a) (HasNodeStory env err m, Eq a, Hashable a)
=> (NgramsTerm -> a) -> [ListId] => (NgramsTerm -> a) -> [ListId]
-> NgramsType -> Set ListType -> NgramsType -> Set ListType
-> m (HashMap a [a]) -> m (DBQuery err x (HashMap a [a]))
getTermsWith f ls ngt lts = HM.fromListWith (<>) getTermsWith f ls ngt lts =
<$> map toTreeWith let func = HM.fromListWith (<>)
<$> HM.toList . map toTreeWith
<$> HM.filter (\f' -> Set.member (fst f') lts) . HM.toList
<$> mapTermListRoot ls ngt . HM.filter (\f' -> Set.member (fst f') lts)
<$> getRepo ls . mapTermListRoot ls ngt
in fmap func <$> getRepo ls
where where
toTreeWith :: (NgramsTerm, (b, Maybe NgramsTerm)) -> (a, [a]) toTreeWith :: (NgramsTerm, (b, Maybe NgramsTerm)) -> (a, [a])
toTreeWith (t, (_lt, maybeRoot)) = case maybeRoot of toTreeWith (t, (_lt, maybeRoot)) = case maybeRoot of
......
...@@ -72,10 +72,21 @@ api userInviting nId (ShareTeamParams user') = do ...@@ -72,10 +72,21 @@ api userInviting nId (ShareTeamParams user') = do
pure () pure ()
pure u pure u
fromIntegral <$> DB.shareNodeWith (ShareNodeWith_User NodeFolderShared (UserName user)) nId fromIntegral <$> shareNodeAndNotify (ShareNodeWith_User NodeFolderShared (UserName user)) nId
api _uId nId2 (SharePublicParams nId1) = api _uId nId2 (SharePublicParams nId1) =
fromIntegral <$> DB.shareNodeWith (ShareNodeWith_Node NodeFolderPublic nId1) nId2 fromIntegral <$> shareNodeAndNotify (ShareNodeWith_Node NodeFolderPublic nId1) nId2
shareNodeAndNotify :: ( HasNodeError err
, IsDBCmdExtra env err m
, MonadRandom m
)
-> DBUpdate err (Int, [CEMessage])
-> m Int
shareNodeAndNotify dbTx = do
(res, msgs) <- runDbTx dbTx
forM_ msgs CE.ce_notify
pure res
-- | Unshare a previously shared node via the /share endpoint. -- | Unshare a previously shared node via the /share endpoint.
unShare :: IsGargServer env err m => NodeId -> Named.UnshareNode (AsServerT m) unShare :: IsGargServer env err m => NodeId -> Named.UnshareNode (AsServerT m)
......
...@@ -204,7 +204,7 @@ type HasNodeStory env err m = ( IsDBCmd env err m ...@@ -204,7 +204,7 @@ type HasNodeStory env err m = ( IsDBCmd env err m
) )
class (HasNodeStoryImmediateSaver err env) class (HasNodeStoryImmediateSaver err env)
=> HasNodeStoryEnv err env where => HasNodeStoryEnv env err where
hasNodeStory :: Getter env (NodeStoryEnv err) hasNodeStory :: Getter env (NodeStoryEnv err)
class HasNodeStoryImmediateSaver err env where class HasNodeStoryImmediateSaver err env where
......
...@@ -27,7 +27,7 @@ import Gargantext.Database.Action.User (getUserId) ...@@ -27,7 +27,7 @@ import Gargantext.Database.Action.User (getUserId)
import Gargantext.Database.Admin.Types.Hyperdata.File ( HyperdataFile(..) ) import Gargantext.Database.Admin.Types.Hyperdata.File ( HyperdataFile(..) )
import Gargantext.Database.Admin.Types.Node ( NodeId, NodeType(..) ) -- (NodeType(..)) import Gargantext.Database.Admin.Types.Node ( NodeId, NodeType(..) ) -- (NodeType(..))
import Gargantext.Database.GargDB qualified as GargDB import Gargantext.Database.GargDB qualified as GargDB
import Gargantext.Database.Prelude (Cmd, IsDBEnvExtra) import Gargantext.Database.Prelude
import Gargantext.Database.Query.Table.Node (getNodeWith) import Gargantext.Database.Query.Table.Node (getNodeWith)
import Gargantext.Database.Query.Table.Node qualified as N (getNode, deleteNode) import Gargantext.Database.Query.Table.Node qualified as N (getNode, deleteNode)
import Gargantext.Database.Query.Table.Node.Error (HasNodeError) import Gargantext.Database.Query.Table.Node.Error (HasNodeError)
...@@ -38,16 +38,18 @@ import Gargantext.Prelude ...@@ -38,16 +38,18 @@ import Gargantext.Prelude
-- TODO -- TODO
-- Delete Corpus children accoring its types -- Delete Corpus children accoring its types
-- Delete NodeList (NodeStory + cbor file) -- Delete NodeList (NodeStory + cbor file)
deleteNode :: (IsDBEnvExtra env, HasNodeError err) -- FIXME(adinapoli): this function mixes db queries with side effects, we can
-- probably make it more compositional.
deleteNode :: (HasNodeError err)
=> User => User
-> NodeId -> NodeId
-> Cmd env err Int -> DBCmd err Int
deleteNode u nodeId = do deleteNode u nodeId = do
node' <- N.getNode nodeId node' <- runDBQuery $ N.getNode nodeId
num <- case (view node_typename node') of num <- case (view node_typename node') of
nt | nt == toDBid NodeUser -> panicTrace "[G.D.A.D.deleteNode] Not allowed to delete NodeUser (yet)" nt | nt == toDBid NodeUser -> panicTrace "[G.D.A.D.deleteNode] Not allowed to delete NodeUser (yet)"
nt | nt == toDBid NodeTeam -> do nt | nt == toDBid NodeTeam -> do
uId <- getUserId u uId <- runDBQuery $ getUserId u
if _node_user_id node' == uId if _node_user_id node' == uId
then N.deleteNode nodeId then N.deleteNode nodeId
else delFolderTeam u nodeId else delFolderTeam u nodeId
......
...@@ -44,7 +44,7 @@ data ShareNodeWith = ShareNodeWith_User !NodeType !User ...@@ -44,7 +44,7 @@ data ShareNodeWith = ShareNodeWith_User !NodeType !User
| ShareNodeWith_Node !NodeType !NodeId | ShareNodeWith_Node !NodeType !NodeId
------------------------------------------------------------------------ ------------------------------------------------------------------------
deleteMemberShip :: HasNodeError err => [(SharedFolderId, TeamNodeId)] -> DBCmdExtra err [Int] deleteMemberShip :: HasNodeError err => [(SharedFolderId, TeamNodeId)] -> DBUpdate err [Int]
deleteMemberShip xs = mapM (\(s,t) -> deleteNodeNode s t) xs deleteMemberShip xs = mapM (\(s,t) -> deleteNodeNode s t) xs
------------------------------------------------------------------------ ------------------------------------------------------------------------
...@@ -56,9 +56,9 @@ type TeamNodeId = NodeId ...@@ -56,9 +56,9 @@ type TeamNodeId = NodeId
-- Result gives the username and its SharedFolderId that has to be eventually -- Result gives the username and its SharedFolderId that has to be eventually
-- used for the membership -- used for the membership
membersOf :: HasNodeError err membersOf :: HasNodeError err
=> TeamNodeId -> DBCmdExtra err [(Text, SharedFolderId)] => TeamNodeId -> DBQuery err x [(Text, SharedFolderId)]
membersOf nId = do membersOf nId = do
res <- runOpaQuery $ membersOfQuery nId res <- mkOpaQuery $ membersOfQuery nId
pure $ catMaybes (uncurryMaybe <$> res) pure $ catMaybes (uncurryMaybe <$> res)
...@@ -91,7 +91,9 @@ shareNodeWith :: HasNodeError err ...@@ -91,7 +91,9 @@ shareNodeWith :: HasNodeError err
-> NodeId -> NodeId
-- ^ The target node we would like to share, it has -- ^ The target node we would like to share, it has
-- to be a 'NodeFolderShared'. -- to be a 'NodeFolderShared'.
-> DBCmdExtra err Int -> DBUpdate err (Int, [CE.CEMessage])
-- ^ Returns as the second argument the list of messages
-- we need to submit to the central exchange.
shareNodeWith (ShareNodeWith_User NodeFolderShared u) n = do shareNodeWith (ShareNodeWith_User NodeFolderShared u) n = do
nodeToCheck <- getNode n nodeToCheck <- getNode n
userIdCheck <- getUserId u userIdCheck <- getUserId u
...@@ -103,9 +105,8 @@ shareNodeWith (ShareNodeWith_User NodeFolderShared u) n = do ...@@ -103,9 +105,8 @@ shareNodeWith (ShareNodeWith_User NodeFolderShared u) n = do
else do else do
folderSharedId <- getFolderId u NodeFolderShared folderSharedId <- getFolderId u NodeFolderShared
ret <- shareNode (SourceId folderSharedId) (TargetId n) ret <- shareNode (SourceId folderSharedId) (TargetId n)
void $ CE.ce_notify $ CE.UpdateTreeFirstLevel folderSharedId let msgs = [CE.UpdateTreeFirstLevel folderSharedId, CE.UpdateTreeFirstLevel n]
void $ CE.ce_notify $ CE.UpdateTreeFirstLevel n pure (ret, msgs)
pure ret
shareNodeWith (ShareNodeWith_Node NodeFolderPublic nId) n = do shareNodeWith (ShareNodeWith_Node NodeFolderPublic nId) n = do
nodeToCheck <- getNode n nodeToCheck <- getNode n
...@@ -117,15 +118,14 @@ shareNodeWith (ShareNodeWith_Node NodeFolderPublic nId) n = do ...@@ -117,15 +118,14 @@ shareNodeWith (ShareNodeWith_Node NodeFolderPublic nId) n = do
if hasNodeType folderToCheck NodeFolderPublic if hasNodeType folderToCheck NodeFolderPublic
then do then do
ret <- shareNode (SourceId nId) (TargetId n) ret <- shareNode (SourceId nId) (TargetId n)
void $ CE.ce_notify $ CE.UpdateTreeFirstLevel nId let msgs = [CE.UpdateTreeFirstLevel nId, CE.UpdateTreeFirstLevel n]
void $ CE.ce_notify $ CE.UpdateTreeFirstLevel n pure (ret, msgs)
pure ret
else errorWith "[G.D.A.S.shareNodeWith] Can share NodeWith NodeFolderPublic only" else errorWith "[G.D.A.S.shareNodeWith] Can share NodeWith NodeFolderPublic only"
shareNodeWith _ _ = errorWith "[G.D.A.S.shareNodeWith] Not implemented for this NodeType" shareNodeWith _ _ = errorWith "[G.D.A.S.shareNodeWith] Not implemented for this NodeType"
------------------------------------------------------------------------ ------------------------------------------------------------------------
getFolderId :: HasNodeError err => User -> NodeType -> DBCmd err NodeId getFolderId :: HasNodeError err => User -> NodeType -> DBQuery err x NodeId
getFolderId u nt = do getFolderId u nt = do
rootId <- getRootId u rootId <- getRootId u
s <- getNodesWith rootId HyperdataAny (Just nt) Nothing Nothing s <- getNodesWith rootId HyperdataAny (Just nt) Nothing Nothing
...@@ -136,12 +136,12 @@ getFolderId u nt = do ...@@ -136,12 +136,12 @@ getFolderId u nt = do
------------------------------------------------------------------------ ------------------------------------------------------------------------
type TeamId = NodeId type TeamId = NodeId
delFolderTeam :: HasNodeError err => User -> TeamId -> DBCmdExtra err Int delFolderTeam :: HasNodeError err => User -> TeamId -> DBUpdate err Int
delFolderTeam u nId = do delFolderTeam u nId = do
folderSharedId <- getFolderId u NodeFolderShared folderSharedId <- getFolderId u NodeFolderShared
deleteNodeNode folderSharedId nId deleteNodeNode folderSharedId nId
unshare :: HasNodeError err unshare :: HasNodeError err
=> ParentId -> NodeId => ParentId -> NodeId
-> DBCmdExtra err Int -> DBUpdate err Int
unshare p n = deleteNodeNode p n unshare p n = deleteNodeNode p n
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