diff --git a/modules/admin/rooms.cc b/modules/admin/rooms.cc index 9a352d84f..acdf0e78c 100644 --- a/modules/admin/rooms.cc +++ b/modules/admin/rooms.cc @@ -10,6 +10,7 @@ namespace ircd::m::admin { + static resource::response handle_get_state(client &, const resource::request &, const room::id &); static resource::response handle_get_members(client &, const resource::request &, const room::id &); static resource::response handle_delete_forward_extremis(client &, const resource::request &, const room::id &); static resource::response handle_get_forward_extremis(client &, const resource::request &, const room::id &); @@ -87,6 +88,9 @@ ircd::m::admin::handle(client &client, if(request.head.method == "GET" && cmd == "members") return handle_get_members(client, request, room_id); + if(request.head.method == "GET" && cmd == "state") + return handle_get_state(client, request, room_id); + throw m::NOT_FOUND { "/admin/rooms command not found" @@ -204,3 +208,36 @@ ircd::m::admin::handle_get_members(client &client, return response; } + +ircd::m::resource::response +ircd::m::admin::handle_get_state(client &client, + const resource::request &request, + const room::id &room_id) +{ + const m::room::state state + { + room_id + }; + + m::resource::response::chunked::json response + { + client, http::OK + }; + + json::stack::array array + { + response, "state" + }; + + m::event::fetch event; + state.for_each([&array, &event] + (const auto &type, const auto &state_key, const auto &event_idx) + { + if(likely(seek(std::nothrow, event, event_idx))) + array.append(event); + + return true; + }); + + return response; +}