Mercurial > prosody-modules
comparison mod_http_admin_api/mod_http_admin_api.lua @ 4353:535d80be110d
mod_http_admin_api: Add groups management endpoints
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Sun, 17 Jan 2021 17:52:03 +0000 |
parents | f6da234b21b8 |
children | d61d7d30f38d |
comparison
equal
deleted
inserted
replaced
4352:f6da234b21b8 | 4353:535d80be110d |
---|---|
6 | 6 |
7 local invites = module:depends("invites"); | 7 local invites = module:depends("invites"); |
8 local tokens = module:depends("tokenauth"); | 8 local tokens = module:depends("tokenauth"); |
9 local mod_pep = module:depends("pep"); | 9 local mod_pep = module:depends("pep"); |
10 | 10 |
11 local group_store = module:open_store("groups"); | |
11 local group_memberships = module:open_store("groups", "map"); | 12 local group_memberships = module:open_store("groups", "map"); |
12 | 13 |
13 local json_content_type = "application/json"; | 14 local json_content_type = "application/json"; |
14 | 15 |
15 local www_authenticate_header = ("Bearer realm=%q"):format(module.host.."/"..module.name); | 16 local www_authenticate_header = ("Bearer realm=%q"):format(module.host.."/"..module.name); |
194 return 404; | 195 return 404; |
195 end | 196 end |
196 return 200; | 197 return 200; |
197 end | 198 end |
198 | 199 |
200 function list_groups(event) | |
201 local group_list = {}; | |
202 for group_id in group_store:users() do | |
203 table.insert(group_list, { | |
204 id = group_id; | |
205 name = group_id; | |
206 }); | |
207 end | |
208 | |
209 event.response.headers["Content-Type"] = json_content_type; | |
210 return json.encode_array(group_list); | |
211 end | |
212 | |
213 function get_group_by_id(event, group_id) | |
214 local property; | |
215 do | |
216 local id, sub_path = group_id:match("^[^/]+/(%w+)$"); | |
217 if id then | |
218 group_id = id; | |
219 property = sub_path; | |
220 end | |
221 end | |
222 | |
223 local group = group_store:get(group_id); | |
224 if not group then | |
225 return 404; | |
226 end | |
227 | |
228 event.response.headers["Content-Type"] = json_content_type; | |
229 | |
230 if property == "members" then | |
231 return json.encode(group); | |
232 end | |
233 | |
234 return json.encode({ | |
235 id = group_id; | |
236 name = group_id; | |
237 }); | |
238 end | |
239 | |
240 function create_group(event) | |
241 local request = event.request; | |
242 if request.headers.content_type ~= json_content_type | |
243 or (not request.body or #request.body == 0) then | |
244 return 400; | |
245 end | |
246 local group = json.decode(event.request.body); | |
247 if not group then | |
248 return 400; | |
249 end | |
250 | |
251 local ok = group_store:set(group.id, {}); | |
252 if not ok then | |
253 return 500; | |
254 end | |
255 return 200; | |
256 end | |
257 | |
258 function delete_group(event, group_id) --luacheck: ignore 212/event | |
259 if not group_id then | |
260 return 400; | |
261 end | |
262 if not group_store:set(group_id, nil) then | |
263 return 500; | |
264 end | |
265 return 200; | |
266 end | |
267 | |
199 module:provides("http", { | 268 module:provides("http", { |
200 route = check_auth { | 269 route = check_auth { |
201 ["GET /invites"] = list_invites; | 270 ["GET /invites"] = list_invites; |
202 ["GET /invites/*"] = get_invite_by_id; | 271 ["GET /invites/*"] = get_invite_by_id; |
203 ["PUT /invites"] = create_invite; | 272 ["PUT /invites"] = create_invite; |
204 ["DELETE /invites/*"] = delete_invite; | 273 ["DELETE /invites/*"] = delete_invite; |
205 | 274 |
206 ["GET /users"] = list_users; | 275 ["GET /users"] = list_users; |
207 ["GET /users/*"] = get_user_by_name; | 276 ["GET /users/*"] = get_user_by_name; |
208 ["DELETE /users/*"] = delete_user; | 277 ["DELETE /users/*"] = delete_user; |
278 | |
279 ["GET /groups"] = list_groups; | |
280 ["GET /groups/*"] = get_group_by_id; | |
281 ["PUT /groups"] = create_group; | |
282 ["DELETE /groups/*"] = delete_group; | |
209 }; | 283 }; |
210 }); | 284 }); |