{ "components": { "schemas": { "DeleteOut": { "properties": { "ok": { "const": true, "default": true, "title": "Ok", "type": "boolean" } }, "title": "DeleteOut", "type": "object" }, "HTTPValidationError": { "properties": { "detail": { "items": { "$ref": "#/components/schemas/ValidationError" }, "title": "Detail", "type": "array" } }, "title": "HTTPValidationError", "type": "object" }, "HealthError": { "properties": { "error": { "title": "Error", "type": "string" }, "ok": { "const": false, "default": false, "title": "Ok", "type": "boolean" } }, "required": [ "error" ], "title": "HealthError", "type": "object" }, "HealthOk": { "properties": { "ok": { "const": true, "default": true, "title": "Ok", "type": "boolean" } }, "title": "HealthOk", "type": "object" }, "TaskCreate": { "properties": { "description": { "default": "", "maxLength": 10000, "title": "Description", "type": "string" }, "due_at": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "title": "Due At" }, "labels": { "items": { "type": "string" }, "maxItems": 20, "title": "Labels", "type": "array" }, "priority": { "default": 0, "maximum": 100.0, "minimum": -100.0, "title": "Priority", "type": "integer" }, "status": { "default": "todo", "enum": [ "todo", "in_progress", "done", "canceled" ], "title": "Status", "type": "string" }, "title": { "maxLength": 240, "minLength": 1, "title": "Title", "type": "string" } }, "required": [ "title" ], "title": "TaskCreate", "type": "object" }, "TaskListOut": { "properties": { "limit": { "title": "Limit", "type": "integer" }, "offset": { "title": "Offset", "type": "integer" }, "tasks": { "items": { "$ref": "#/components/schemas/TaskOut" }, "title": "Tasks", "type": "array" }, "total": { "title": "Total", "type": "integer" } }, "required": [ "tasks", "total", "limit", "offset" ], "title": "TaskListOut", "type": "object" }, "TaskOut": { "properties": { "completed_at": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "title": "Completed At" }, "created_at": { "format": "date-time", "title": "Created At", "type": "string" }, "description": { "title": "Description", "type": "string" }, "due_at": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "title": "Due At" }, "id": { "title": "Id", "type": "string" }, "labels": { "items": { "type": "string" }, "title": "Labels", "type": "array" }, "priority": { "title": "Priority", "type": "integer" }, "status": { "enum": [ "todo", "in_progress", "done", "canceled" ], "title": "Status", "type": "string" }, "title": { "title": "Title", "type": "string" }, "updated_at": { "format": "date-time", "title": "Updated At", "type": "string" } }, "required": [ "id", "title", "description", "status", "priority", "labels", "due_at", "completed_at", "created_at", "updated_at" ], "title": "TaskOut", "type": "object" }, "TaskUpdate": { "properties": { "description": { "anyOf": [ { "maxLength": 10000, "type": "string" }, { "type": "null" } ], "title": "Description" }, "due_at": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "title": "Due At" }, "labels": { "anyOf": [ { "items": { "type": "string" }, "maxItems": 20, "type": "array" }, { "type": "null" } ], "title": "Labels" }, "priority": { "anyOf": [ { "maximum": 100.0, "minimum": -100.0, "type": "integer" }, { "type": "null" } ], "title": "Priority" }, "status": { "anyOf": [ { "enum": [ "todo", "in_progress", "done", "canceled" ], "type": "string" }, { "type": "null" } ], "title": "Status" }, "title": { "anyOf": [ { "maxLength": 240, "minLength": 1, "type": "string" }, { "type": "null" } ], "title": "Title" } }, "title": "TaskUpdate", "type": "object" }, "ValidationError": { "properties": { "ctx": { "title": "Context", "type": "object" }, "input": { "title": "Input" }, "loc": { "items": { "anyOf": [ { "type": "string" }, { "type": "integer" } ] }, "title": "Location", "type": "array" }, "msg": { "title": "Message", "type": "string" }, "type": { "title": "Error Type", "type": "string" } }, "required": [ "loc", "msg", "type" ], "title": "ValidationError", "type": "object" } }, "securitySchemes": { "apiKeyAuth": { "description": "Use the configured `TASKS_API_KEY` value.", "in": "header", "name": "x-api-key", "type": "apiKey" }, "bearerAuth": { "description": "Use `Authorization: Bearer $TASKS_API_KEY`.", "scheme": "bearer", "type": "http" } } }, "info": { "description": "API-only service for tracking tasks in Postgres.", "title": "Tasks API", "version": "0.1.0" }, "openapi": "3.1.0", "paths": { "/api/tasks": { "get": { "operationId": "listTasks", "parameters": [ { "in": "query", "name": "status", "required": false, "schema": { "anyOf": [ { "enum": [ "todo", "in_progress", "done", "canceled" ], "type": "string" }, { "type": "null" } ], "title": "Status" } }, { "in": "query", "name": "q", "required": false, "schema": { "anyOf": [ { "maxLength": 120, "minLength": 1, "type": "string" }, { "type": "null" } ], "title": "Q" } }, { "in": "query", "name": "due_before", "required": false, "schema": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "title": "Due Before" } }, { "in": "query", "name": "limit", "required": false, "schema": { "default": 50, "maximum": 200, "minimum": 1, "title": "Limit", "type": "integer" } }, { "in": "query", "name": "offset", "required": false, "schema": { "default": 0, "minimum": 0, "title": "Offset", "type": "integer" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TaskListOut" } } }, "description": "Successful Response" }, "422": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/HTTPValidationError" } } }, "description": "Validation Error" } }, "security": [ { "bearerAuth": [] }, { "apiKeyAuth": [] } ], "summary": "List Tasks", "tags": [ "Tasks" ] }, "post": { "operationId": "createTask", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TaskCreate" } } }, "required": true }, "responses": { "201": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TaskOut" } } }, "description": "Successful Response" }, "422": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/HTTPValidationError" } } }, "description": "Validation Error" } }, "security": [ { "bearerAuth": [] }, { "apiKeyAuth": [] } ], "summary": "Create Task", "tags": [ "Tasks" ] } }, "/api/tasks/{task_id}": { "delete": { "operationId": "deleteTask", "parameters": [ { "in": "path", "name": "task_id", "required": true, "schema": { "title": "Task Id", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DeleteOut" } } }, "description": "Successful Response" }, "422": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/HTTPValidationError" } } }, "description": "Validation Error" } }, "security": [ { "bearerAuth": [] }, { "apiKeyAuth": [] } ], "summary": "Delete Task", "tags": [ "Tasks" ] }, "get": { "operationId": "getTask", "parameters": [ { "in": "path", "name": "task_id", "required": true, "schema": { "title": "Task Id", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TaskOut" } } }, "description": "Successful Response" }, "422": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/HTTPValidationError" } } }, "description": "Validation Error" } }, "security": [ { "bearerAuth": [] }, { "apiKeyAuth": [] } ], "summary": "Get Task", "tags": [ "Tasks" ] }, "patch": { "operationId": "updateTask", "parameters": [ { "in": "path", "name": "task_id", "required": true, "schema": { "title": "Task Id", "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TaskUpdate" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TaskOut" } } }, "description": "Successful Response" }, "422": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/HTTPValidationError" } } }, "description": "Validation Error" } }, "security": [ { "bearerAuth": [] }, { "apiKeyAuth": [] } ], "summary": "Update Task", "tags": [ "Tasks" ] } }, "/healthz": { "get": { "operationId": "getTasksHealth", "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/HealthOk" } } }, "description": "Successful Response" }, "503": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/HealthError" } } }, "description": "Service Unavailable" } }, "summary": "Healthz", "tags": [ "Health" ] } } } }