diff --git a/plugins/tiddlywiki/multiwikiserver/modules/routes/handlers/get-bag.js b/plugins/tiddlywiki/multiwikiserver/modules/routes/handlers/get-bag.js index e6fe7156d..afccbad9f 100644 --- a/plugins/tiddlywiki/multiwikiserver/modules/routes/handlers/get-bag.js +++ b/plugins/tiddlywiki/multiwikiserver/modules/routes/handlers/get-bag.js @@ -28,11 +28,11 @@ exports.handler = function(request,response,state) { // Get the parameters var bag_name = $tw.utils.decodeURIComponentSafe(state.params[0]), bag_name_2 = $tw.utils.decodeURIComponentSafe(state.params[1]), - titles = bag_name === bag_name_2 && $tw.mws.store.getBagTiddlers(bag_name); - if(bag_name === bag_name_2 && titles) { + bagTiddlers = bag_name === bag_name_2 && $tw.mws.store.getBagTiddlers(bag_name); + if(bag_name === bag_name_2 && bagTiddlers) { // If application/json is requested then this is an API request, and gets the response in JSON if(request.headers.accept && request.headers.accept.indexOf("application/json") !== -1) { - state.sendResponse(200,{"Content-Type": "application/json"},JSON.stringify(titles),"utf8"); + state.sendResponse(200,{"Content-Type": "application/json"},JSON.stringify(bagTiddlers),"utf8"); } else { // This is not a JSON API request, we should return the raw tiddler content response.writeHead(200, "OK",{ @@ -49,7 +49,8 @@ exports.handler = function(request,response,state) { var html = $tw.mws.store.adminWiki.renderTiddler("text/html","$:/plugins/tiddlywiki/multiwikiserver/templates/get-bag",{ variables: { "bag-name": bag_name, - "bag-titles": JSON.stringify(titles) + "bag-titles": JSON.stringify(bagTiddlers.map(bagTiddler => bagTiddler.title)), + "bag-tiddlers": JSON.stringify(bagTiddlers) } }); response.write(html); diff --git a/plugins/tiddlywiki/multiwikiserver/modules/store/sql-tiddler-database.js b/plugins/tiddlywiki/multiwikiserver/modules/store/sql-tiddler-database.js index 283bf4ceb..9beeb9c9c 100644 --- a/plugins/tiddlywiki/multiwikiserver/modules/store/sql-tiddler-database.js +++ b/plugins/tiddlywiki/multiwikiserver/modules/store/sql-tiddler-database.js @@ -121,7 +121,7 @@ SqlTiddlerDatabase.prototype.createBag = function(bag_name,description,accesscon }; /* -Returns array of {recipe_name:,description:,bag_names: []} +Returns array of {recipe_name:,recipe_id:,description:,bag_names: []} */ SqlTiddlerDatabase.prototype.listRecipes = function() { const rows = this.engine.runStatementGetAll(` @@ -375,7 +375,7 @@ Get the titles of the tiddlers in a bag. Returns an empty array for bags that do */ SqlTiddlerDatabase.prototype.getBagTiddlers = function(bag_name) { const rows = this.engine.runStatementGetAll(` - SELECT DISTINCT title + SELECT DISTINCT title, tiddler_id FROM tiddlers WHERE bag_id IN ( SELECT bag_id @@ -387,11 +387,11 @@ SqlTiddlerDatabase.prototype.getBagTiddlers = function(bag_name) { `,{ $bag_name: bag_name }); - return rows.map(value => value.title); + return rows; }; /* -Get the titles of the tiddlers in a recipe as {title:,bag_name:}. Returns null for recipes that do not exist +Get the titles of the tiddlers in a recipe as {title:,tiddler_id:,bag_name:}. Returns null for recipes that do not exist */ SqlTiddlerDatabase.prototype.getRecipeTiddlers = function(recipe_name) { const rowsCheckRecipe = this.engine.runStatementGetAll(` @@ -403,9 +403,9 @@ SqlTiddlerDatabase.prototype.getRecipeTiddlers = function(recipe_name) { return null; } const rows = this.engine.runStatementGetAll(` - SELECT title, bag_name + SELECT title, tiddler_id, bag_name FROM ( - SELECT t.title, b.bag_name, MAX(rb.position) AS position + SELECT t.title, t.tiddler_id, b.bag_name, MAX(rb.position) AS position FROM bags AS b INNER JOIN recipe_bags AS rb ON b.bag_id = rb.bag_id INNER JOIN recipes AS r ON rb.recipe_id = r.recipe_id diff --git a/plugins/tiddlywiki/multiwikiserver/modules/store/tests-sql-tiddler-database.js b/plugins/tiddlywiki/multiwikiserver/modules/store/tests-sql-tiddler-database.js index 0d280938a..04744615d 100644 --- a/plugins/tiddlywiki/multiwikiserver/modules/store/tests-sql-tiddler-database.js +++ b/plugins/tiddlywiki/multiwikiserver/modules/store/tests-sql-tiddler-database.js @@ -74,12 +74,12 @@ function runSqlDatabaseTests(engine) { }); // Verify what we've got expect(sqlTiddlerDatabase.getRecipeTiddlers("recipe-rho")).toEqual([ - { title: 'Another Tiddler', bag_name: 'bag-alpha' }, - { title: 'Hello There', bag_name: 'bag-beta' } + { title: 'Another Tiddler', tiddler_id: 1, bag_name: 'bag-alpha' }, + { title: 'Hello There', tiddler_id: 3, bag_name: 'bag-beta' } ]); expect(sqlTiddlerDatabase.getRecipeTiddlers("recipe-sigma")).toEqual([ - { title: 'Another Tiddler', bag_name: 'bag-alpha' }, - { title: 'Hello There', bag_name: 'bag-gamma' } + { title: 'Another Tiddler', tiddler_id: 1, bag_name: 'bag-alpha' }, + { title: 'Hello There', tiddler_id: 4, bag_name: 'bag-gamma' } ]); expect(sqlTiddlerDatabase.getRecipeTiddler("Hello There","recipe-rho").tiddler).toEqual({ title: "Hello There", text: "I'm in beta", tags: "four five six" }); expect(sqlTiddlerDatabase.getRecipeTiddler("Missing Tiddler","recipe-rho")).toEqual(null); @@ -90,17 +90,17 @@ function runSqlDatabaseTests(engine) { // Delete a tiddlers to ensure the underlying tiddler in the recipe shows through sqlTiddlerDatabase.deleteTiddler("Hello There","bag-beta"); expect(sqlTiddlerDatabase.getRecipeTiddlers("recipe-rho")).toEqual([ - { title: 'Another Tiddler', bag_name: 'bag-alpha' }, - { title: 'Hello There', bag_name: 'bag-alpha' } + { title: 'Another Tiddler', tiddler_id: 1, bag_name: 'bag-alpha' }, + { title: 'Hello There', tiddler_id: 2, bag_name: 'bag-alpha' } ]); expect(sqlTiddlerDatabase.getRecipeTiddlers("recipe-sigma")).toEqual([ - { title: 'Another Tiddler', bag_name: 'bag-alpha' }, - { title: 'Hello There', bag_name: 'bag-gamma' } + { title: 'Another Tiddler', tiddler_id: 1, bag_name: 'bag-alpha' }, + { title: 'Hello There', tiddler_id: 4, bag_name: 'bag-gamma' } ]); expect(sqlTiddlerDatabase.getRecipeTiddler("Hello There","recipe-beta")).toEqual(null); sqlTiddlerDatabase.deleteTiddler("Another Tiddler","bag-alpha"); - expect(sqlTiddlerDatabase.getRecipeTiddlers("recipe-rho")).toEqual([ { title: 'Hello There', bag_name: 'bag-alpha' } ]); - expect(sqlTiddlerDatabase.getRecipeTiddlers("recipe-sigma")).toEqual([ { title: 'Hello There', bag_name: 'bag-gamma' } ]); + expect(sqlTiddlerDatabase.getRecipeTiddlers("recipe-rho")).toEqual([ { title: 'Hello There', tiddler_id: 2, bag_name: 'bag-alpha' } ]); + expect(sqlTiddlerDatabase.getRecipeTiddlers("recipe-sigma")).toEqual([ { title: 'Hello There', tiddler_id: 4, bag_name: 'bag-gamma' } ]); // Save a recipe tiddler expect(sqlTiddlerDatabase.saveRecipeTiddler({title: "More", text: "None"},"recipe-rho")).toEqual({tiddler_id: 7, bag_name: 'bag-beta'}); expect(sqlTiddlerDatabase.getRecipeTiddler("More","recipe-rho").tiddler).toEqual({title: "More", text: "None"}); diff --git a/plugins/tiddlywiki/multiwikiserver/modules/store/tests-sql-tiddler-store.js b/plugins/tiddlywiki/multiwikiserver/modules/store/tests-sql-tiddler-store.js index c7d7de7fb..947ad425e 100644 --- a/plugins/tiddlywiki/multiwikiserver/modules/store/tests-sql-tiddler-store.js +++ b/plugins/tiddlywiki/multiwikiserver/modules/store/tests-sql-tiddler-store.js @@ -83,7 +83,7 @@ function runSqlStoreTests(engine) { expect(new Set(Object.keys(saveBagResult))).toEqual(new Set(["tiddler_id"])); expect(typeof(saveBagResult.tiddler_id)).toBe("number"); - expect(store.getBagTiddlers("bag-alpha")).toEqual(["Another Tiddler"]); + expect(store.getBagTiddlers("bag-alpha")).toEqual([{title: "Another Tiddler", tiddler_id: 1}]); var getBagTiddlerResult = store.getBagTiddler("Another Tiddler","bag-alpha"); expect(typeof(getBagTiddlerResult.tiddler_id)).toBe("number"); @@ -128,7 +128,7 @@ function runSqlStoreTests(engine) { expect(typeof(saveRecipeResult.tiddler_id)).toBe("number"); expect(saveRecipeResult.bag_name).toBe("bag-beta"); - expect(store.getRecipeTiddlers("recipe-rho")).toEqual([{title: "Another Tiddler", bag_name: "bag-beta"}]); + expect(store.getRecipeTiddlers("recipe-rho")).toEqual([{title: "Another Tiddler", tiddler_id: 1, bag_name: "bag-beta"}]); var getRecipeTiddlerResult = store.getRecipeTiddler("Another Tiddler","recipe-rho"); expect(typeof(getRecipeTiddlerResult.tiddler_id)).toBe("number");