From ab8fc26ba1178ee81b4eb17eda773787ff7f28ab Mon Sep 17 00:00:00 2001
From: Jeremy Ruston <jeremy@osmosoft.com>
Date: Sun, 10 Mar 2013 19:28:24 +0000
Subject: [PATCH] Update server command to be compatible with the TiddlyWeb
 syncer

Now TW5 in the browser can use the TiddlyWeb syncer to talk to TW5 on
the server
---
 core/modules/commands/server.js | 65 ++++++++++++++++++++++++++++-----
 1 file changed, 56 insertions(+), 9 deletions(-)

diff --git a/core/modules/commands/server.js b/core/modules/commands/server.js
index 5bcc3bb9e..bf9423f2c 100644
--- a/core/modules/commands/server.js
+++ b/core/modules/commands/server.js
@@ -35,7 +35,8 @@ Command.prototype.execute = function() {
 		renderType = this.params[2] || "text/plain",
 		serveType = this.params[3] || "text/html";
 	http.createServer(function(request, response) {
-		var path = url.parse(request.url).pathname;
+		var requestPath = url.parse(request.url).pathname,
+			text;
 		switch(request.method) {
 			case "PUT":
 				var data = "";
@@ -43,22 +44,68 @@ Command.prototype.execute = function() {
 					data += chunk.toString();
 				});
 				request.on("end",function() {
-					var title = decodeURIComponent(path.substr(1));
-					self.commander.wiki.addTiddler(new $tw.Tiddler(JSON.parse(data),{title: title}));
-					response.writeHead(204, "OK");
-					response.end();
+					var prefix = "/tiddlers/";
+					if(requestPath.indexOf(prefix) === 0) {
+						var title = decodeURIComponent(requestPath.substr(prefix.length)),
+							fields = JSON.parse(data);
+						// Use the title from the PUT URL if we don't have one
+						if(!fields.title) {
+							fields.title = title;
+						}
+						// Pull up any subfields in the `fields` object
+						if(fields.fields) {
+							$tw.utils.each(fields.fields,function(field,name) {
+								fields[name] = field;
+							});
+							delete fields.fields;
+						}
+						// Remove any revision field
+						if(fields["revision"]) {
+							delete fields["revision"];
+						}
+console.log("PUT tiddler",title,fields)
+//						self.commander.wiki.addTiddler(new $tw.Tiddler(JSON.parse(data),{title: title}));
+						response.writeHead(204, "OK");
+						response.end();
+					} else {
+						response.writeHead(404);
+						response.end();
+					}
 				});
 				break;
 			case "DELETE":
-				self.commander.wiki.deleteTiddler(decodeURIComponent(path.substr(1)));
+console.log("DELETE tiddler",requestPath.substr(1))
+//				self.commander.wiki.deleteTiddler(decodeURIComponent(requestPath.substr(1)));
 				response.writeHead(204, "OK");
 				response.end();
 				break;
 			case "GET":
-				if(path === "/") {
+				if(requestPath === "/") {
 					response.writeHead(200, {"Content-Type": serveType});
-					var text = self.commander.wiki.renderTiddler(renderType,rootTiddler);
-					response.end(text, "utf8");	
+					text = self.commander.wiki.renderTiddler(renderType,rootTiddler);
+					response.end(text,"utf8");
+				} else if(requestPath === "/status") {
+					response.writeHead(200, {"Content-Type": "application/json"});
+					text = JSON.stringify({
+						username: "ANONYMOUS",
+						tiddlywiki_version: $tw.version
+					});
+					response.end(text,"utf8");
+				} else if(requestPath === "/tiddlers.json") {
+					response.writeHead(200, {"Content-Type": "application/json"});
+					var tiddlers = [];
+					$tw.wiki.forEachTiddler("title",function(title,tiddler) {
+						var tiddlerFields = {};
+						$tw.utils.each(tiddler.fields,function(field,name) {
+							if(name !== "text") {
+								tiddlerFields[name] = tiddler.getFieldString(name);
+							}
+						});
+						tiddlerFields["revision"] = $tw.wiki.getChangeCount(title);
+						tiddlers.push(tiddlerFields);
+					});
+					text = JSON.stringify(tiddlers);
+					response.end(text,"utf8");
 				} else {
 					response.writeHead(404);
 					response.end();