]> gitweb @ CieloNegro.org - Rakka.git/commitdiff
implemented page deleting
authorpho <pho@cielonegro.org>
Mon, 7 Jan 2008 08:54:35 +0000 (17:54 +0900)
committerpho <pho@cielonegro.org>
Mon, 7 Jan 2008 08:54:35 +0000 (17:54 +0900)
darcs-hash:20080107085435-62b54-28aae5fba2378812da9b064f236a7ec87f9bc15c.gz

Rakka/Resource/PageEntity.hs
Rakka/Storage.hs
Rakka/Storage/Impl.hs
Rakka/Storage/Repos.hs
js/editPage.js

index 21d38c99e1b29319ebd25198458e0afced23d3b6..1ad3ffaf5c782b6b543497ec3b682ba600c0a93f 100644 (file)
@@ -38,11 +38,11 @@ fallbackPageEntity env path
         = return $ Just $ ResourceDef {
             resUsesNativeThread = False
           , resIsGreedy         = True
-          , resGet              = Just $ handleGet env (toPageName path)
+          , resGet              = Just $ handleGet    env (toPageName path)
           , resHead             = Nothing
           , resPost             = Nothing
-          , resPut              = Just $ handlePut env (toPageName path)
-          , resDelete           = Nothing
+          , resPut              = Just $ handlePut    env (toPageName path)
+          , resDelete           = Just $ handleDelete env (toPageName path)
           }
     where
       toPageName :: [String] -> PageName
@@ -310,3 +310,9 @@ handlePut env name
     -> do page   <- parseXmlizedPage -< (name, tree)
           status <- putPageA (envStorage env) -< page
           returnA  -< setStatus status
+
+
+handleDelete :: Environment -> PageName -> Resource ()
+handleDelete env name
+    = do status <- deletePage (envStorage env) name
+         setStatus status
index 63480de03f44fd502136e39621e1da5017b0ae32..d88a336506a23dd162278ec8b69930ab18a46879 100644 (file)
@@ -5,9 +5,11 @@ module Rakka.Storage
 
     , getPage
     , putPage
+    , deletePage
 
     , getPageA
     , putPageA
+    , deletePageA
 
     , searchPages
 
@@ -52,6 +54,13 @@ putPage sto page
                   return st
 
 
+deletePage :: MonadIO m => Storage -> PageName -> m StatusCode
+deletePage sto name
+    = liftIO $ do st <- deletePage' (stoRepository sto) name
+                  syncIndex sto
+                  return st
+
+
 getPageA :: ArrowIO a => Storage -> a (PageName, Maybe RevNum) (Maybe Page)
 getPageA = arrIO2 . getPage 
 
@@ -60,6 +69,10 @@ putPageA :: ArrowIO a => Storage -> a Page StatusCode
 putPageA = arrIO . putPage
 
 
+deletePageA :: ArrowIO a => Storage -> a PageName StatusCode
+deletePageA = arrIO . deletePage
+
+
 searchPages :: MonadIO m => Storage -> Condition -> m [(PageName, RevNum)]
 searchPages sto cond
     = liftIO $
index b1b05e34ecbeb21abbc1007d5f2522ecf6bda2e7..2c36f516c2a012dfe64189ca3adaca0fa5da924c 100644 (file)
@@ -1,6 +1,7 @@
 module Rakka.Storage.Impl
     ( getPage'
     , putPage'
+    , deletePage'
     , startIndexManager
     )
     where
@@ -47,6 +48,10 @@ putPage' :: Repository -> Page -> IO StatusCode
 putPage' = putPageIntoRepository
 
 
+deletePage' :: Repository -> PageName -> IO StatusCode
+deletePage' = deletePageFromRepository
+
+
 findAllPages :: Repository -> RevNum -> IO (Set PageName)
 findAllPages _     0   = findAllDefaultPages
 findAllPages repos rev = do reposPages   <- findAllPagesInRevision repos rev
index c9b913cb303844c1a7ee3ffa78896078120fd28d..576e5b740d5210af8db52ddaf1d845031d661d83 100644 (file)
@@ -3,6 +3,7 @@ module Rakka.Storage.Repos
     , findChangedPagesAtRevision
     , loadPageInRepository
     , putPageIntoRepository
+    , deletePageFromRepository
     )
     where
 
@@ -186,11 +187,11 @@ putPageIntoRepository repos page
                       -> do fs  <- getRepositoryFS repos
                             rev <- getYoungestRev fs
                             doReposTxn repos
-                                         rev
-                                         "[Rakka]"
-                                         (Just "Automatic commit by Rakka for page creation")
-                                         $ do createPage name
-                                              updatePage name
+                                       rev
+                                       "[Rakka]"
+                                       (Just "Automatic commit by Rakka for page creation")
+                                       $ do createPage name
+                                            updatePage name
          case ret of
            Left  _ -> return Conflict
            Right _ -> return Created
@@ -259,6 +260,33 @@ putPageIntoRepository repos page
       encodeFlag False = Nothing
 
 
+deletePageFromRepository :: Repository -> PageName -> IO StatusCode
+deletePageFromRepository repos name
+    = filterSvnError $
+      do let path = mkPagePath name
+         fs     <- getRepositoryFS repos
+         rev    <- getYoungestRev fs
+         exists <- withRevision fs rev $ isFile path
+         if exists then
+             do doReposTxn repos
+                           rev
+                           "[Rakka]"
+                           (Just "Automatic commit by Rakka for page deleting")
+                           $ do deleteEntry path
+                                deleteEmptyParentDirectories path
+                return NoContent
+           else
+             return NotFound
+    where
+      deleteEmptyParentDirectories :: FilePath -> Txn ()
+      deleteEmptyParentDirectories path
+          = do let parentPath = takeDirectory path
+               contents <- getDirEntries parentPath
+               when (null contents)
+                        $ do deleteEntry parentPath
+                             deleteEmptyParentDirectories parentPath
+
+
 filterSvnError :: IO a -> IO a
 filterSvnError f = catchDyn f rethrow
     where
index a8869fb91b6b01552be1b2341873e92475c24654..959d0889c72d5310df4c3fd3b68404331d099f7c 100644 (file)
@@ -153,7 +153,9 @@ Rakka.displayPageEditor = function (pageName, oldRevision, defaultType, source)
         = $.INPUT({type: "button", value: "Delete this page"});
     
     $(btnDelete).click(function () {
-        throw new Error("FIXME: not implemented yet");
+        if (window.confirm("Do you really want to delete this page?")) {
+            Rakka.deletePage(pageName);
+        }
     });
 
     var updateTRContent = function () {
@@ -440,4 +442,21 @@ Rakka.submitRedirection = function (pageName, oldRevision, givenPageName, destin
             $area.text("Error: " + req.status + " " + req.statusText);
         }
     });
-};
\ No newline at end of file
+};
+
+Rakka.deletePage = function (pageName) {
+    var url = Rakka.baseURI + encodeURI(pageName);
+    $.ajax({
+        type       : "DELETE",
+        url        : url,
+        success    : function () {
+            window.location.replace(url);
+        },
+        error      : function (req) {
+            Rakka.hideWaitingMessage();
+            
+            var $area = Rakka.switchScreen();
+            $area.text("Error: " + req.status + " " + req.statusText);
+        }
+    });
+};