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 }); |