This is an automated email from the ASF dual-hosted git repository.
sbp pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tooling-trusted-release.git
The following commit(s) were added to refs/heads/main by this push:
new 442fed8 Add API endpoints for public signing keys
442fed8 is described below
commit 442fed8fc8f2eb86c5bd80739244485a6c71e8f1
Author: Sean B. Palmer <[email protected]>
AuthorDate: Wed Jul 2 19:08:24 2025 +0100
Add API endpoints for public signing keys
---
atr/blueprints/api/api.py | 30 ++++++++++++++++++++++++++++++
1 file changed, 30 insertions(+)
diff --git a/atr/blueprints/api/api.py b/atr/blueprints/api/api.py
index 311f172..6379984 100644
--- a/atr/blueprints/api/api.py
+++ b/atr/blueprints/api/api.py
@@ -58,6 +58,36 @@ async def committees() -> tuple[list[Mapping], int]:
return [committee.model_dump() for committee in committees], 200
[email protected]("/keys")
+@quart_schema.validate_querystring(Pagination)
+async def public_keys(query_args: Pagination) -> quart.Response:
+ """List all public signing keys with pagination support."""
+ _pagination_args_validate(query_args)
+ via = models.validate_instrumented_attribute
+ async with db.session() as data:
+ statement = (
+ sqlmodel.select(models.PublicSigningKey)
+ .limit(query_args.limit)
+ .offset(query_args.offset)
+ .order_by(via(models.PublicSigningKey.fingerprint).asc())
+ )
+ paged_keys = (await data.execute(statement)).scalars().all()
+ count = (
+ await
data.execute(sqlalchemy.select(sqlalchemy.func.count(via(models.PublicSigningKey.fingerprint))))
+ ).scalar_one()
+ result = {"data": [key.model_dump() for key in paged_keys], "count":
count}
+ return quart.jsonify(result)
+
+
[email protected]("/keys/<fingerprint>")
+@quart_schema.validate_response(models.PublicSigningKey, 200)
+async def public_keys_fingerprint(fingerprint: str) -> tuple[Mapping, int]:
+ """Return a single public signing key by fingerprint."""
+ async with db.session() as data:
+ key = await
data.public_signing_key(fingerprint=fingerprint.lower()).demand(exceptions.NotFound())
+ return key.model_dump(), 200
+
+
@api.BLUEPRINT.route("/projects")
@quart_schema.validate_response(list[models.Committee], 200)
async def projects() -> tuple[list[Mapping], int]:
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]