Add id-slug lookup and restrict slugs endpoints to superadmins (#1279)
Fixes #1278 - Adds `GET /orgs/slug-lookup` endpoint returning `{id: slug}` for all orgs - Restricts new endpoint and existing `GET /orgs/slugs` to superadmins
This commit is contained in:
parent
8466caf1d9
commit
c5ca250f37
@ -402,6 +402,13 @@ class OrgOps:
|
||||
slugs = await self.orgs.distinct("slug", {})
|
||||
return {"slugs": slugs}
|
||||
|
||||
async def get_all_org_slugs_with_ids(self):
|
||||
"""Return dict with {id: slug} for all orgs."""
|
||||
slug_id_map = {}
|
||||
async for org in self.orgs.find({}):
|
||||
slug_id_map[org["_id"]] = org["slug"]
|
||||
return slug_id_map
|
||||
|
||||
|
||||
# ============================================================================
|
||||
# pylint: disable=too-many-statements
|
||||
@ -671,7 +678,15 @@ def init_orgs_api(app, mdb, user_manager, invites, user_dep):
|
||||
return await ops.get_org_metrics(org)
|
||||
|
||||
@app.get("/orgs/slugs", tags=["organizations"])
|
||||
async def get_all_org_slugs():
|
||||
async def get_all_org_slugs(user: User = Depends(user_dep)):
|
||||
if not user.is_superuser:
|
||||
raise HTTPException(status_code=403, detail="Not Allowed")
|
||||
return await ops.get_all_org_slugs()
|
||||
|
||||
@app.get("/orgs/slug-lookup", tags=["organizations"])
|
||||
async def get_all_org_slugs_with_ids(user: User = Depends(user_dep)):
|
||||
if not user.is_superuser:
|
||||
raise HTTPException(status_code=403, detail="Not Allowed")
|
||||
return await ops.get_all_org_slugs_with_ids()
|
||||
|
||||
return ops
|
||||
|
@ -409,3 +409,29 @@ def test_get_org_slugs(admin_auth_headers):
|
||||
assert len(slugs) == org_count
|
||||
for slug in slugs:
|
||||
assert slug in org_slugs
|
||||
|
||||
|
||||
def test_get_org_slugs_non_superadmin(crawler_auth_headers):
|
||||
r = requests.get(f"{API_PREFIX}/orgs/slugs", headers=crawler_auth_headers)
|
||||
assert r.status_code == 403
|
||||
assert r.json()["detail"] == "Not Allowed"
|
||||
|
||||
|
||||
def test_get_org_slug_lookup(admin_auth_headers):
|
||||
# Build an expected return from /orgs list to compare against
|
||||
expected_return = {}
|
||||
r = requests.get(f"{API_PREFIX}/orgs", headers=admin_auth_headers)
|
||||
assert r.status_code == 200
|
||||
for org in r.json()["items"]:
|
||||
expected_return[org["id"]] = org["slug"]
|
||||
|
||||
# Fetch data from /orgs/slug-lookup and verify data is correct
|
||||
r = requests.get(f"{API_PREFIX}/orgs/slug-lookup", headers=admin_auth_headers)
|
||||
assert r.status_code == 200
|
||||
assert r.json() == expected_return
|
||||
|
||||
|
||||
def test_get_org_slug_lookup_non_superadmin(crawler_auth_headers):
|
||||
r = requests.get(f"{API_PREFIX}/orgs/slug-lookup", headers=crawler_auth_headers)
|
||||
assert r.status_code == 403
|
||||
assert r.json()["detail"] == "Not Allowed"
|
||||
|
Loading…
Reference in New Issue
Block a user