diff mod_http_admin_api/mod_http_admin_api.lua @ 6330:4e63151010bf

mod_http_admin_api: Convert remaining HTTP errors to util.error
author Matthew Wild <mwild1@gmail.com>
date Wed, 01 Oct 2025 12:00:09 +0100
parents 5571c75a4fed
children 6a3b38051d74
line wrap: on
line diff
--- a/mod_http_admin_api/mod_http_admin_api.lua	Wed Oct 01 11:25:57 2025 +0100
+++ b/mod_http_admin_api/mod_http_admin_api.lua	Wed Oct 01 12:00:09 2025 +0100
@@ -134,7 +134,7 @@
 function get_invite_by_id(event, invite_id)
 	local invite = invites.get_account_invite_info(invite_id);
 	if not invite then
-		return 404;
+		return nil, "item-not-found";
 	end
 
 	event.response.headers["Content-Type"] = json_content_type;
@@ -148,12 +148,12 @@
 	if request.body and #request.body > 0 then
 		if request.headers.content_type ~= json_content_type then
 			module:log("warn", "Invalid content type");
-			return 400;
+			return nil, "invalid-json";
 		end
 		options = json.decode(event.request.body);
 		if not options then
 			module:log("warn", "Invalid JSON");
-			return 400;
+			return nil, "invalid-json";
 		end
 	else
 		options = {};
@@ -164,12 +164,12 @@
 	local invite;
 	if invite_type == "reset" then
 		if not options.username then
-			return 400;
+			return nil, "bad-request";
 		end
 		invite = invites.create_account_reset(options.username, options.ttl);
 	elseif invite_type == "group" then
 		if not options.groups then
-			return 400;
+			return nil, "bad-request";
 		end
 		invite = invites.create_group(options.groups, {
 			source = source;
@@ -194,8 +194,9 @@
 end
 
 function delete_invite(event, invite_id) --luacheck: ignore 212/event
-	if not invites.delete_account_invite(invite_id) then
-		return 404;
+	local ok, err = invites.delete_account_invite(invite_id);
+	if not ok then
+		return nil, err;
 	end
 	return 200;
 end
@@ -443,7 +444,7 @@
 
 	local user_info = get_user_info(username);
 	if not user_info then
-		return 404;
+		return nil, "user-not-found";
 	end
 
 	event.response.headers["Content-Type"] = json_content_type;
@@ -488,7 +489,7 @@
 	local updated_attributes = set.new(array.collect(it.keys(new_user)));
 	if not (updated_attributes - writable_user_attributes):empty() then
 		module:log("warn", "Unable to service PATCH user request, unsupported attributes: %s", (updated_attributes - writable_user_attributes));
-		return 400;
+		return nil, "feature-not-implemented";
 	end
 
 	if new_user.enabled ~= nil and new_user.enabled ~= current_user.enabled then
@@ -503,21 +504,21 @@
 
 function update_user(event, username)
 	if not username then
-		return 400;
+		return nil, "bad-request";
 	end
 
 	local request = event.request;
 	if request.headers.content_type ~= json_content_type
 	or (not request.body or #request.body == 0) then
-		return 400;
+		return nil, "invalid-json";
 	end
 	local new_user = json.decode(event.request.body);
 	if not new_user then
-		return 400;
+		return nil, "invalid-json";
 	end
 
 	if new_user.username and new_user.username ~= username then
-		return 400;
+		return nil, "bad-request"; -- Cannot change the username
 	end
 
 	if new_user.display_name then
@@ -596,7 +597,7 @@
 function get_group_by_id(event, group_id)
 	local group = mod_groups.get_info(group_id);
 	if not group then
-		return 404;
+		return nil, "group-not-found";
 	end
 
 	event.response.headers["Content-Type"] = json_content_type;
@@ -613,11 +614,11 @@
 	local request = event.request;
 	if request.headers.content_type ~= json_content_type
 	or (not request.body or #request.body == 0) then
-		return 400;
+		return nil, "invalid-json";
 	end
 	local group = json.decode(event.request.body);
 	if not group then
-		return 400;
+		return nil, "invalid-json";
 	end
 
 	local create_muc = group.create_muc and true or false;
@@ -690,16 +691,16 @@
 	if group_id then
 		local muc_params = json.decode(event.request.body);
 		if not muc_params then
-			return 400;
+			return nil, "invalid-json";
 		end
-		local muc = mod_groups.add_group_chat(group_id, muc_params.name);
+		local muc, err = mod_groups.add_group_chat(group_id, muc_params.name);
 		if not muc then
-			return 500;
+			return nil, err;
 		end
 		return json.encode(muc);
 	end
 
-	return 404;
+	return nil, "group-not-found";
 end
 
 function delete_group(event, subpath) --luacheck: ignore 212/event
@@ -708,19 +709,19 @@
 	if group_id then
 		-- Operation is on a sub-resource
 		if sub_resource_type == "members" then
-			if mod_groups.remove_member(group_id, sub_resource_id) then
-				return 204;
-			else
-				return 500;
+			local ok, err = mod_groups.remove_member(group_id, sub_resource_id);
+			if not ok then
+				return nil, err;
 			end
+			return 204;
 		elseif sub_resource_type == "chats" then
-			if mod_groups.remove_group_chat(group_id, sub_resource_id) then
-				return 204;
-			else
-				return 500;
+			local ok, err = mod_groups.remove_group_chat(group_id, sub_resource_id);
+			if not ok then
+				return nil, err;
 			end
+			return 204;
 		else
-			return 404;
+			return nil, "item-not-found";
 		end
 	else
 		-- Action refers to the group
@@ -728,15 +729,16 @@
 	end
 
 	if not group_id then
-		return 400;
+		return nil, "bad-request";
 	end
 
 	if not mod_groups.exists(group_id) then
-		return 404;
+		return nil, "group-not-found";
 	end
 
-	if not mod_groups.delete(group_id) then
-		return 500;
+	local ok, err = mod_groups.delete(group_id);
+	if not ok then
+		return nil, err;
 	end
 	return 204;
 end
@@ -800,19 +802,19 @@
 	local request = event.request;
 	if request.headers.content_type ~= json_content_type
 	or (not request.body or #request.body == 0) then
-		return 400;
+		return nil, "invalid-json";
 	end
 	local body = json.decode(event.request.body);
 	if not body then
-		return 400;
+		return nil, "invalid-json";
 	end
 
 	if type(body.recipients) ~= "table" and body.recipients ~= "online" and body.recipients ~= "all" then
-		return 400;
+		return nil, "bad-request";
 	end
 
 	if not body.body or #body.body == 0 then
-		return 400;
+		return nil, "bad-request";
 	end
 
 	local message = st.message():tag("body"):text(body.body):up();