From bb3ce47246e31ebf076c92b0da2cf5079bbbc04c Mon Sep 17 00:00:00 2001 From: Beda Schmid Date: Wed, 15 Oct 2025 13:01:22 -0300 Subject: [PATCH] Add schema definitions --- src/sonobarr_app/__init__.py | 113 ++++++++++++++++++++++++++++++++--- 1 file changed, 104 insertions(+), 9 deletions(-) diff --git a/src/sonobarr_app/__init__.py b/src/sonobarr_app/__init__.py index c7cbaee..cdef51a 100644 --- a/src/sonobarr_app/__init__.py +++ b/src/sonobarr_app/__init__.py @@ -23,7 +23,7 @@ def _configure_swagger(app: Flask) -> None: { "endpoint": "openapi", "route": "/api/docs.json", - "rule_filter": lambda rule: rule.rule.startswith("/api/"), + "rule_filter": lambda rule: rule.endpoint.startswith("api.") and rule.endpoint != "api.api_docs_index", "model_filter": lambda tag: True, } ], @@ -39,16 +39,111 @@ def _configure_swagger(app: Flask) -> None: "version": app.config.get("APP_VERSION", "unknown"), "description": "Sonobarr REST API documentation.", }, - "components": { - "securitySchemes": { - "ApiKeyAuth": { - "type": "apiKey", - "name": "X-API-Key", - "in": "header", - } + "securityDefinitions": { + "ApiKeyAuth": { + "type": "apiKey", + "name": "X-API-Key", + "in": "header", + }, + "ApiKeyQuery": { + "type": "apiKey", + "name": "api_key", + "in": "query", } }, - "security": [{"ApiKeyAuth": []}], + "definitions": { + "Error": { + "type": "object", + "properties": { + "error": { + "type": "string", + "description": "Error message" + } + } + }, + "StatusResponse": { + "type": "object", + "properties": { + "status": {"type": "string", "example": "healthy"}, + "version": {"type": "string", "example": "1.0.0"}, + "users": { + "type": "object", + "properties": { + "total": {"type": "integer"}, + "admins": {"type": "integer"} + } + }, + "artist_requests": { + "type": "object", + "properties": { + "total": {"type": "integer"}, + "pending": {"type": "integer"} + } + }, + "services": { + "type": "object", + "properties": { + "lidarr_connected": {"type": "boolean"} + } + } + } + }, + "ArtistRequest": { + "type": "object", + "properties": { + "id": {"type": "integer"}, + "artist_name": {"type": "string"}, + "status": {"type": "string", "enum": ["pending", "approved", "rejected"]}, + "requested_by": {"type": "string"}, + "created_at": {"type": "string", "format": "date-time"}, + "approved_by": {"type": "string", "nullable": True}, + "approved_at": {"type": "string", "format": "date-time", "nullable": True} + } + }, + "ArtistRequestListResponse": { + "type": "object", + "properties": { + "count": {"type": "integer"}, + "requests": { + "type": "array", + "items": {"$ref": "#/definitions/ArtistRequest"} + } + } + }, + "StatsResponse": { + "type": "object", + "properties": { + "users": { + "type": "object", + "properties": { + "total": {"type": "integer"}, + "admins": {"type": "integer"}, + "active": {"type": "integer"} + } + }, + "artist_requests": { + "type": "object", + "properties": { + "total": {"type": "integer"}, + "pending": {"type": "integer"}, + "approved": {"type": "integer"}, + "rejected": {"type": "integer"}, + "recent_week": {"type": "integer"} + } + }, + "top_requesters": { + "type": "array", + "items": { + "type": "object", + "properties": { + "username": {"type": "string"}, + "requests": {"type": "integer"} + } + } + } + } + } + } } # Initialize Swagger with the app directly from flasgger import Swagger