mod_http_admin_api/mod_http_admin_api.lua
changeset 4372 e0c8d866d58c
parent 4370 83370df0ce4a
child 4373 29b7f445aec5
equal deleted inserted replaced
4371:33f82988d7a9 4372:e0c8d866d58c
     1 local usermanager = require "core.usermanager";
     1 local usermanager = require "core.usermanager";
     2 
     2 
       
     3 local id = require "util.id";
     3 local json = require "util.json";
     4 local json = require "util.json";
     4 
     5 
     5 module:depends("http");
     6 module:depends("http");
     6 
     7 
     7 local invites = module:depends("invites");
     8 local invites = module:depends("invites");
     8 local tokens = module:depends("tokenauth");
     9 local tokens = module:depends("tokenauth");
     9 local mod_pep = module:depends("pep");
    10 local mod_pep = module:depends("pep");
    10 
    11 
    11 local group_store = module:open_store("groups");
    12 local group_info_store = module:open_store("group_info");
       
    13 local group_members_store = module:open_store("groups");
    12 local group_memberships = module:open_store("groups", "map");
    14 local group_memberships = module:open_store("groups", "map");
    13 local push_errors = module:shared("cloud_notify/push_errors");
    15 local push_errors = module:shared("cloud_notify/push_errors");
    14 
    16 
    15 local json_content_type = "application/json";
    17 local json_content_type = "application/json";
    16 
    18 
   364 	return 200;
   366 	return 200;
   365 end
   367 end
   366 
   368 
   367 function list_groups(event)
   369 function list_groups(event)
   368 	local group_list = {};
   370 	local group_list = {};
   369 	for group_id in group_store:users() do
   371 	for group_id in group_info_store:users() do
       
   372 		local group_info = group_info_store:get(group_id);
   370 		table.insert(group_list, {
   373 		table.insert(group_list, {
   371 			id = group_id;
   374 			id = group_id;
   372 			name = group_id;
   375 			name = group_info.name;
   373 			members = group_store:get(group_id);
   376 			members = group_members_store:get(group_id);
   374 		});
   377 		});
   375 	end
   378 	end
   376 
   379 
   377 	event.response.headers["Content-Type"] = json_content_type;
   380 	event.response.headers["Content-Type"] = json_content_type;
   378 	return json.encode_array(group_list);
   381 	return json.encode_array(group_list);
   379 end
   382 end
   380 
   383 
   381 function get_group_by_id(event, group_id)
   384 function get_group_by_id(event, group_id)
   382 	local group = group_store:get(group_id);
   385 	local group = group_info_store:get(group_id);
   383 	if not group then
   386 	if not group then
   384 		return 404;
   387 		return 404;
   385 	end
   388 	end
   386 
   389 
   387 	event.response.headers["Content-Type"] = json_content_type;
   390 	event.response.headers["Content-Type"] = json_content_type;
   388 
   391 
   389 	return json.encode({
   392 	return json.encode({
   390 		id = group_id;
   393 		id = group_id;
   391 		name = group_id;
   394 		name = group.name;
   392 		members = group;
   395 		members = group_members_store:get(group_id);
   393 	});
   396 	});
   394 end
   397 end
   395 
   398 
   396 function create_group(event)
   399 function create_group(event)
   397 	local request = event.request;
   400 	local request = event.request;
   402 	local group = json.decode(event.request.body);
   405 	local group = json.decode(event.request.body);
   403 	if not group then
   406 	if not group then
   404 		return 400;
   407 		return 400;
   405 	end
   408 	end
   406 
   409 
   407 	local ok = group_store:set(group.id, {});
   410 	if not group.name then
       
   411 		module:log("warn", "Group missing name property");
       
   412 		return 400;
       
   413 	end
       
   414 
       
   415 	local group_id = id.short();
       
   416 
       
   417 	local ok = group_info_store:set(group_id, {
       
   418 		name = group.name;
       
   419 	});
   408 	if not ok then
   420 	if not ok then
   409 		return 500;
   421 		return 500;
   410 	end
   422 	end
   411 
   423 
   412 	event.response.headers["Content-Type"] = json_content_type;
   424 	event.response.headers["Content-Type"] = json_content_type;
   413 	return json.encode({
   425 	return json.encode({
   414 		id = group.id or group.name;
   426 		id = group_id;
   415 		name = group.name;
   427 		name = group.name;
       
   428 		members = {};
   416 	});
   429 	});
   417 end
   430 end
   418 
   431 
   419 function delete_group(event, group_id) --luacheck: ignore 212/event
   432 function update_group(event, group) --luacheck: ignore 212/event
       
   433 	local group_id, member_name = group:match("^([^/]+)/members/([^/]+)$");
       
   434 	if group_id and member_name then
       
   435 		if not group_info_store:get(group_id) then
       
   436 			return 404;
       
   437 		elseif not group_memberships:set(group_id, member_name, true) then
       
   438 			return 500;
       
   439 		end
       
   440 		return 200;
       
   441 	end
       
   442 	return 400;
       
   443 end
       
   444 
       
   445 function delete_group(event, subpath) --luacheck: ignore 212/event
       
   446 	-- Check if this is a membership deletion and handle it
       
   447 	local group_id, member_name = subpath:match("^([^/]+)/members/([^/]+)$");
       
   448 	if group_id and member_name then
       
   449 		if not group_info_store:get(group_id) then
       
   450 			return 404;
       
   451 		end
       
   452 		if group_memberships:set(group_id, member_name, nil) then
       
   453 			return 200;
       
   454 		else
       
   455 			return 500;
       
   456 		end
       
   457 	else
       
   458 		group_id = subpath;
       
   459 	end
       
   460 
   420 	if not group_id then
   461 	if not group_id then
   421 		return 400;
   462 		return 400;
   422 	end
   463 	end
   423 	if not group_store:set(group_id, nil) then
   464 
       
   465 	if not group_info_store:get(group_id) then
       
   466 		return 404;
       
   467 	end
       
   468 
       
   469 	if not group_members_store:set(group_id, nil) then
   424 		return 500;
   470 		return 500;
       
   471 	else
       
   472 		if not group_info_store:set(group_id, nil) then
       
   473 			return 500;
       
   474 		end
   425 	end
   475 	end
   426 	return 200;
   476 	return 200;
   427 end
   477 end
   428 
   478 
   429 module:provides("http", {
   479 module:provides("http", {
   438 		["DELETE /users/*"] = delete_user;
   488 		["DELETE /users/*"] = delete_user;
   439 
   489 
   440 		["GET /groups"] = list_groups;
   490 		["GET /groups"] = list_groups;
   441 		["GET /groups/*"] = get_group_by_id;
   491 		["GET /groups/*"] = get_group_by_id;
   442 		["POST /groups"] = create_group;
   492 		["POST /groups"] = create_group;
       
   493 		["PUT /groups/*"] = update_group;
   443 		["DELETE /groups/*"] = delete_group;
   494 		["DELETE /groups/*"] = delete_group;
   444 	};
   495 	};
   445 });
   496 });