diff --git a/plugins/tiddlywiki/multiwikiserver/modules/routes/handlers/get-users.js b/plugins/tiddlywiki/multiwikiserver/modules/routes/handlers/get-users.js index fea50ba19..435c6546f 100644 --- a/plugins/tiddlywiki/multiwikiserver/modules/routes/handlers/get-users.js +++ b/plugins/tiddlywiki/multiwikiserver/modules/routes/handlers/get-users.js @@ -34,8 +34,6 @@ GET /admin/users last_login: user.last_login ? new Date(user.last_login).toISOString() : '' })); - console.log("Processed userList =>", userList); - response.writeHead(200, "OK", { "Content-Type": "text/html" }); @@ -45,10 +43,12 @@ GET /admin/users variables: { "page-content": "$:/plugins/tiddlywiki/multiwikiserver/templates/get-users", "user-list": JSON.stringify(userList), + "username": state.authenticatedUser ? state.authenticatedUser.username : "Guest", + "user-is-admin": state.authenticatedUser && state.authenticatedUser.isAdmin ? "yes" : "no" } }); response.write(html); response.end(); }; - }()); \ No newline at end of file +}()); \ No newline at end of file diff --git a/plugins/tiddlywiki/multiwikiserver/modules/routes/handlers/manage-roles.js b/plugins/tiddlywiki/multiwikiserver/modules/routes/handlers/manage-roles.js new file mode 100644 index 000000000..b1ec774b8 --- /dev/null +++ b/plugins/tiddlywiki/multiwikiserver/modules/routes/handlers/manage-roles.js @@ -0,0 +1,36 @@ +/*\ +title: $:/plugins/tiddlywiki/multiwikiserver/routes/handlers/manage-roles.js +type: application/javascript +module-type: mws-route + +GET /admin/roles + +\*/ +(function() { + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +exports.method = "GET"; + +exports.path = /^\/admin\/roles\/?$/; + +exports.handler = function(request, response, state) { + var roles = state.server.sqlTiddlerDatabase.listRoles(); + + response.writeHead(200, "OK", {"Content-Type": "text/html"}); + + var html = $tw.mws.store.adminWiki.renderTiddler("text/plain", "$:/plugins/tiddlywiki/multiwikiserver/templates/page", { + variables: { + "page-content": "$:/plugins/tiddlywiki/multiwikiserver/templates/manage-roles", + "roles-list": JSON.stringify(roles), + "username": state.authenticatedUser ? state.authenticatedUser.username : "Guest", + "user-is-admin": state.authenticatedUser && state.authenticatedUser.isAdmin ? "yes" : "no" + } + }); + response.write(html); + response.end(); +}; + +}()); \ No newline at end of file diff --git a/plugins/tiddlywiki/multiwikiserver/modules/routes/handlers/manage-user.js b/plugins/tiddlywiki/multiwikiserver/modules/routes/handlers/manage-user.js new file mode 100644 index 000000000..daff1f254 --- /dev/null +++ b/plugins/tiddlywiki/multiwikiserver/modules/routes/handlers/manage-user.js @@ -0,0 +1,70 @@ +/*\ +title: $:/plugins/tiddlywiki/multiwikiserver/routes/handlers/manage-user.js +type: application/javascript +module-type: mws-route + +GET /admin/users/:user_id + +\*/ +(function() { + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +exports.method = "GET"; + +exports.path = /^\/admin\/users\/([^\/]+)\/?$/; + + +exports.handler = function(request,response,state) { + var user_id = $tw.utils.decodeURIComponentSafe(state.params[0]); + console.log("user_id =>", user_id) + + var userData = state.server.sqlTiddlerDatabase.getUser(user_id); + + if(!userData) { + response.writeHead(404, "Not Found", {"Content-Type": "text/html"}); + var errorHtml = $tw.mws.store.adminWiki.renderTiddler("text/plain", "$:/plugins/tiddlywiki/multiwikiserver/templates/error", { + variables: { + "error-message": "User not found" + } + }); + response.write(errorHtml); + response.end(); + return; + } + + // Convert dates to strings and ensure all necessary fields are present + const user = { + user_id: userData.user_id || '', + username: userData.username || '', + email: userData.email || '', + created_at: userData.created_at ? new Date(userData.created_at).toISOString() : '', + last_login: userData.last_login ? new Date(userData.last_login).toISOString() : '' + }; + + // Get all roles which the user has been assigned + var userRoles = state.server.sqlTiddlerDatabase.getUserRoles(user_id); + var allRoles = state.server.sqlTiddlerDatabase.listRoles(); + + response.writeHead(200, "OK", { + "Content-Type": "text/html" + }); + + // Render the html + var html = $tw.mws.store.adminWiki.renderTiddler("text/plain", "$:/plugins/tiddlywiki/multiwikiserver/templates/page", { + variables: { + "page-content": "$:/plugins/tiddlywiki/multiwikiserver/templates/manage-user", + "user": JSON.stringify(user), + "user-roles": JSON.stringify(userRoles), + "all-roles": JSON.stringify(allRoles), + "username": state.authenticatedUser ? state.authenticatedUser.username : "Guest", + "user-is-admin": state.authenticatedUser && state.authenticatedUser.isAdmin ? "yes" : "no" + } + }); + response.write(html); + response.end(); +}; + +}()); \ No newline at end of file diff --git a/plugins/tiddlywiki/multiwikiserver/modules/store/sql-tiddler-database.js b/plugins/tiddlywiki/multiwikiserver/modules/store/sql-tiddler-database.js index 4f91f9375..cdf37d936 100644 --- a/plugins/tiddlywiki/multiwikiserver/modules/store/sql-tiddler-database.js +++ b/plugins/tiddlywiki/multiwikiserver/modules/store/sql-tiddler-database.js @@ -1156,6 +1156,17 @@ SqlTiddlerDatabase.prototype.removePermissionFromRole = function(roleId, permiss }); }; +SqlTiddlerDatabase.prototype.getUserRoles = function(userId) { + const query = ` + SELECT r.role_id, r.role_name + FROM user_roles ur + JOIN roles r ON ur.role_id = r.role_id + WHERE ur.user_id = $userId + `; + + return this.engine.runStatementGetAll(query, { $userId: userId }); +}; + exports.SqlTiddlerDatabase = SqlTiddlerDatabase; })(); \ No newline at end of file diff --git a/plugins/tiddlywiki/multiwikiserver/templates/add-user-modal.tid b/plugins/tiddlywiki/multiwikiserver/templates/add-user-modal.tid new file mode 100644 index 000000000..b4444f470 --- /dev/null +++ b/plugins/tiddlywiki/multiwikiserver/templates/add-user-modal.tid @@ -0,0 +1,40 @@ +title: $:/plugins/tiddlywiki/multiwikiserver/templates/add-user-modal + +\define add-user-actions() +<$action-sendmessage $message="tm-server-request" + method="POST" + url="/admin/users" + headers="Content-Type: application/json" + body={{{ [{"username": "$(newUsername)$", "email": "$(newEmail)$", "password": "$(newPassword)$"}jsonify[]] }}} + redirectAfterSuccess="/admin/users"/> +<$action-deletetiddler $tiddler="$:/temp/newUsername"/> +<$action-deletetiddler $tiddler="$:/temp/newEmail"/> +<$action-deletetiddler $tiddler="$:/temp/newPassword"/> +\end + +