@@ -77,9 +77,13 @@ server = mkRouter $ do
7777 , " tasks" -: ((" tasks" `at` oldproj) :: [ObjectId ]) ]
7878 pdoc
7979 liftLIO $ withTaskPolicyModule $ save " projects" project
80- alldocs <- liftLIO $ withTaskPolicyModule $ findAll $ select [] " users"
81- let memDocs = filter (\ u -> (" name" `at` u) `elem` members) alldocs
80+ alldocs <- liftLIO $ withTaskPolicyModule $ findAllL $ select [] " users"
81+ memDocs <- liftLIO $ filterM (\ ldoc -> do
82+ doc <- liftLIO $ unlabel ldoc
83+ return ((" name" `at` doc) `elem` members) :: LIO DCLabel Bool )
84+ alldocs
8285 liftLIO $ withTaskPolicyModule $ addProjects memDocs pid
86+ -- to do: remove project from the documents of users who were removed
8387 respond $ redirectTo (" /projects/" ++ show pid)
8488
8589 -- Display the Project Page
@@ -116,8 +120,11 @@ server = mkRouter $ do
116120 , " tasks" -: ([] :: [ObjectId ])]
117121 pdoc
118122 pid <- liftLIO $ withTaskPolicyModule $ insert " projects" project
119- alldocs <- liftLIO $ withTaskPolicyModule $ findAll $ select [] " users"
120- let memDocs = filter (\ doc -> (" name" `at` doc) `elem` members) alldocs
123+ alldocs <- liftLIO $ withTaskPolicyModule $ findAllL $ select [] " users"
124+ memDocs <- liftLIO $ filterM (\ ldoc -> do
125+ doc <- liftLIO $ unlabel ldoc
126+ return ((" name" `at` doc) `elem` members) :: LIO DCLabel Bool )
127+ alldocs
121128 liftLIO $ withTaskPolicyModule $ addProjects memDocs pid
122129 modifieddocs <- liftLIO $ withTaskPolicyModule $ findAll $ select [] " users"
123130 let modifiedMemDocs = filter (\ doc -> (" name" `at` doc) `elem` members) modifieddocs
@@ -215,7 +222,7 @@ server = mkRouter $ do
215222 taskdoc <- include [" name" , " members" , " project" , " completed" , " priority" ] `liftM` (request >>= labeledRequestToHson >>= (liftLIO. unlabel))
216223 let members = (" members" `at` taskdoc)
217224 let task = merge [" members" -: (members :: [String ])] taskdoc
218- tid <- liftLIO $ withTaskPolicyModule $ insert " tasks" task
225+ tid <- liftLIO $ withTaskPolicyModule $ insert " tasks" task -- todo: move to policy
219226 mlpdoc <- liftLIO $ withTaskPolicyModule $ findOne $ select [ " _id" -: pid ] " projects"
220227 pdoc <- liftLIO $ unlabel $ fromJust mlpdoc
221228 let curTasks = " tasks" `at` pdoc
@@ -353,21 +360,6 @@ addTasks memDocs taskId = do
353360 save " users" newDoc
354361 addTasks (tail memDocs) taskId
355362
356- -- Modifies the database by adding the second argument pId to each user document's "projects" field
357- addProjects :: [HsonDocument ] -> ObjectId -> DBAction ()
358- addProjects memDocs pId = do
359- if memDocs == []
360- then return ()
361- else do
362- let doc = head memDocs
363- let curProjects = " projects" `at` doc
364- if (pId `elem` curProjects) then addProjects (tail memDocs) pId
365- else do
366- let newProjects = pId: curProjects
367- let newDoc = merge [" projects" -: newProjects] doc
368- save " users" newDoc
369- addProjects (tail memDocs) pId
370-
371363-- Modifies the database by removing the second argument proj from each uer document's "projects" field
372364removeProj :: [UserName ] -> ObjectId -> DBAction ()
373365removeProj users proj = do
@@ -383,6 +375,18 @@ removeProj users proj = do
383375 liftLIO $ withTaskPolicyModule $ save " users" newdoc
384376 removeProj (tail users) proj
385377
378+ -- Returns a list of all labeled documents in the database satisfying the Query
379+ findAllL :: Query -> DBAction [LabeledHsonDocument ]
380+ findAllL q = do
381+ cur <- find q
382+ getAll cur []
383+ where getAll cur list = do
384+ mldoc <- next cur
385+ case mldoc of
386+ Nothing -> return list
387+ Just ldoc -> do
388+ getAll cur (list ++ [ldoc])
389+
386390-- Returns a list of all documents in the database satisfying the Query
387391findAll :: Query -> DBAction [HsonDocument ]
388392findAll q = do
0 commit comments