|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458 |
- {
- "openapi": "3.1.0",
- "info": {
- "title": "rust-template",
- "description": "Axum API server",
- "license": {
- "name": "MIT",
- "identifier": "MIT"
- },
- "version": "0.1.0"
- },
- "paths": {
- "/api/v1/items": {
- "get": {
- "tags": [
- "items"
- ],
- "summary": "List items, newest first.",
- "operationId": "list_items",
- "parameters": [
- {
- "name": "page",
- "in": "query",
- "description": "1-based page index.",
- "required": false,
- "schema": {
- "type": "integer",
- "format": "int32",
- "minimum": 0
- }
- },
- {
- "name": "per_page",
- "in": "query",
- "description": "Page size (max 100).",
- "required": false,
- "schema": {
- "type": "integer",
- "format": "int32",
- "minimum": 0
- }
- }
- ],
- "responses": {
- "200": {
- "description": "Paged item list",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/ItemPage"
- }
- }
- }
- }
- }
- },
- "post": {
- "tags": [
- "items"
- ],
- "summary": "Create an item.",
- "operationId": "create_item",
- "requestBody": {
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/CreateItemRequest"
- }
- }
- },
- "required": true
- },
- "responses": {
- "201": {
- "description": "Created item",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/ItemResponse"
- }
- }
- }
- },
- "400": {
- "description": "Validation error",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/ErrorBody"
- }
- }
- }
- }
- }
- }
- },
- "/api/v1/items/{id}": {
- "get": {
- "tags": [
- "items"
- ],
- "summary": "Fetch a single item.",
- "operationId": "get_item",
- "parameters": [
- {
- "name": "id",
- "in": "path",
- "description": "Item id",
- "required": true,
- "schema": {
- "type": "string",
- "format": "uuid"
- }
- }
- ],
- "responses": {
- "200": {
- "description": "Item",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/ItemResponse"
- }
- }
- }
- },
- "404": {
- "description": "Missing item",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/ErrorBody"
- }
- }
- }
- }
- }
- },
- "delete": {
- "tags": [
- "items"
- ],
- "summary": "Delete an item.",
- "operationId": "delete_item",
- "parameters": [
- {
- "name": "id",
- "in": "path",
- "description": "Item id",
- "required": true,
- "schema": {
- "type": "string",
- "format": "uuid"
- }
- }
- ],
- "responses": {
- "204": {
- "description": "Deleted"
- },
- "404": {
- "description": "Missing item",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/ErrorBody"
- }
- }
- }
- }
- }
- },
- "patch": {
- "tags": [
- "items"
- ],
- "summary": "Replace selected item fields.",
- "operationId": "update_item",
- "parameters": [
- {
- "name": "id",
- "in": "path",
- "description": "Item id",
- "required": true,
- "schema": {
- "type": "string",
- "format": "uuid"
- }
- }
- ],
- "requestBody": {
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/UpdateItemRequest"
- }
- }
- },
- "required": true
- },
- "responses": {
- "200": {
- "description": "Updated item",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/ItemResponse"
- }
- }
- }
- },
- "404": {
- "description": "Missing item",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/ErrorBody"
- }
- }
- }
- }
- }
- }
- },
- "/health/live": {
- "get": {
- "tags": [
- "health"
- ],
- "summary": "Liveness probe. Process is up.",
- "operationId": "live",
- "responses": {
- "200": {
- "description": "Process is running",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/HealthResponse"
- }
- }
- }
- }
- }
- }
- },
- "/health/ready": {
- "get": {
- "tags": [
- "health"
- ],
- "summary": "Readiness probe. Database is reachable.",
- "operationId": "ready",
- "responses": {
- "200": {
- "description": "Database is reachable",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/ReadyResponse"
- }
- }
- }
- },
- "500": {
- "description": "Database is unreachable",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/ErrorBody"
- }
- }
- }
- }
- }
- }
- }
- },
- "components": {
- "schemas": {
- "CreateItemRequest": {
- "type": "object",
- "required": [
- "name"
- ],
- "properties": {
- "description": {
- "type": [
- "string",
- "null"
- ]
- },
- "name": {
- "type": "string"
- }
- }
- },
- "ErrorBody": {
- "type": "object",
- "description": "Stable JSON error envelope returned by every handler.",
- "required": [
- "error"
- ],
- "properties": {
- "error": {
- "$ref": "#/components/schemas/ErrorDetail"
- }
- }
- },
- "ErrorDetail": {
- "type": "object",
- "required": [
- "status",
- "code",
- "message"
- ],
- "properties": {
- "code": {
- "type": "string"
- },
- "message": {
- "type": "string"
- },
- "status": {
- "type": "integer",
- "format": "int32",
- "minimum": 0
- },
- "trace_id": {
- "type": [
- "string",
- "null"
- ]
- }
- }
- },
- "HealthResponse": {
- "type": "object",
- "required": [
- "status",
- "service"
- ],
- "properties": {
- "service": {
- "type": "string"
- },
- "status": {
- "type": "string"
- }
- }
- },
- "ItemPage": {
- "type": "object",
- "required": [
- "items",
- "page",
- "per_page",
- "total"
- ],
- "properties": {
- "items": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/ItemResponse"
- }
- },
- "page": {
- "type": "integer",
- "format": "int32",
- "minimum": 0
- },
- "per_page": {
- "type": "integer",
- "format": "int32",
- "minimum": 0
- },
- "total": {
- "type": "integer",
- "format": "int64"
- }
- }
- },
- "ItemResponse": {
- "type": "object",
- "required": [
- "id",
- "name",
- "created_at",
- "updated_at"
- ],
- "properties": {
- "created_at": {
- "type": "string",
- "format": "date-time"
- },
- "description": {
- "type": [
- "string",
- "null"
- ]
- },
- "id": {
- "type": "string",
- "format": "uuid"
- },
- "name": {
- "type": "string"
- },
- "updated_at": {
- "type": "string",
- "format": "date-time"
- }
- }
- },
- "ReadyResponse": {
- "type": "object",
- "required": [
- "status",
- "database"
- ],
- "properties": {
- "database": {
- "type": "string"
- },
- "status": {
- "type": "string"
- }
- }
- },
- "UpdateItemRequest": {
- "type": "object",
- "properties": {
- "description": {
- "type": [
- "string",
- "null"
- ]
- },
- "name": {
- "type": [
- "string",
- "null"
- ]
- }
- }
- }
- }
- },
- "tags": [
- {
- "name": "health",
- "description": "Liveness and readiness"
- },
- {
- "name": "items",
- "description": "Example CRUD resource"
- }
- ]
- }
|