Skip to content

Commit 25e96b0

Browse files
continue refactor
1 parent 9b30844 commit 25e96b0

File tree

5 files changed

+49
-9
lines changed

5 files changed

+49
-9
lines changed

api/specs/web-server/_auth.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,29 @@ async def list_api_keys():
287287
"""lists display names of API keys by this user"""
288288

289289

290+
@router.get(
291+
"/auth/api-keys/{id_}",
292+
operation_id="get_api_key",
293+
responses={
294+
status.HTTP_200_OK: {
295+
"description": "returns the api key or None",
296+
"model": ApiKeyGet | None,
297+
},
298+
status.HTTP_400_BAD_REQUEST: {
299+
"description": "key name requested is invalid",
300+
},
301+
status.HTTP_401_UNAUTHORIZED: {
302+
"description": "requires login to get the keu",
303+
},
304+
status.HTTP_403_FORBIDDEN: {
305+
"description": "not enough permissions to get the keu",
306+
},
307+
},
308+
)
309+
async def get_api_key(id_: int):
310+
"""returns the key or None"""
311+
312+
290313
@router.post(
291314
"/auth/api-keys",
292315
operation_id="create_api_key",

services/web/server/src/simcore_service_webserver/api_keys/_api.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,10 @@ async def create_api_key(
6868

6969

7070
async def get_api_key(
71-
app: web.Application, *, name: str, user_id: UserID, product_name: ProductName
71+
app: web.Application, *, api_key_id: int, user_id: UserID, product_name: ProductName
7272
) -> ApiKeyGet | None:
7373
row = await db.get(
74-
app, display_name=name, user_id=user_id, product_name=product_name
74+
app, api_key_id=api_key_id, user_id=user_id, product_name=product_name
7575
)
7676
return ApiKeyGet.model_validate(row) if row else None
7777

services/web/server/src/simcore_service_webserver/api_keys/_db.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,14 +69,14 @@ async def get(
6969
app: web.Application,
7070
connection: AsyncConnection | None = None,
7171
*,
72-
display_name: str,
72+
api_key_id: int,
7373
user_id: UserID,
7474
product_name: ProductName,
7575
) -> ApiKeyInDB | None:
7676
async with transaction_context(get_asyncpg_engine(app), connection) as conn:
7777
stmt = sa.select(api_keys).where(
7878
(api_keys.c.user_id == user_id)
79-
& (api_keys.c.display_name == display_name)
79+
& (api_keys.c.id == api_key_id)
8080
& (api_keys.c.product_name == product_name)
8181
)
8282

services/web/server/src/simcore_service_webserver/api_keys/_rest.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,21 @@ async def list_api_keys(request: web.Request):
3939
return envelope_json_response(api_keys_names)
4040

4141

42+
@routes.get(f"/{API_VTAG}/auth/api-keys/{{api_key_id}}", name="api_key_get")
43+
@login_required
44+
@permission_required("user.apikey.*")
45+
async def api_key_get(request: web.Request):
46+
req_ctx = RequestContext.model_validate(request)
47+
path_params = parse_request_path_parameters_as(ApiKeysPathParams, request)
48+
key = await _api.get_api_key(
49+
request.app,
50+
api_key_id=path_params.api_key_id,
51+
user_id=req_ctx.user_id,
52+
product_name=req_ctx.product_name,
53+
)
54+
return envelope_json_response(key)
55+
56+
4257
@routes.post(f"/{API_VTAG}/auth/api-keys", name="create_api_key")
4358
@login_required
4459
@permission_required("user.apikey.*")

services/web/server/tests/unit/with_dbs/01/test_api_keys.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -183,19 +183,21 @@ async def test_get_or_create_api_key(
183183
assert client.app
184184

185185
options = {
186-
"name": "repeated_name",
187186
"user_id": user["id"],
188187
"product_name": "osparc",
189188
}
190189

191190
# does not exist
192-
assert await get_api_key(client.app, **options) is None
191+
assert await get_api_key(client.app, **options | {"api_key_id": 1}) is None
193192

194193
# create once
195-
created = await get_or_create_api_key(client.app, **options)
196-
assert created.display_name == options["name"]
194+
created = await get_or_create_api_key(client.app, **options | {"name": "foo"})
195+
assert created.display_name == "foo"
197196
assert created.api_key != created.api_secret
198197

199198
# idempottent
200199
for _ in range(3):
201-
assert await get_or_create_api_key(client.app, **options) == created
200+
assert (
201+
await get_or_create_api_key(client.app, **options | {"name": "foo"})
202+
== created
203+
)

0 commit comments

Comments
 (0)