206 lines
11 KiB
PHP
206 lines
11 KiB
PHP
<?php
|
||
|
||
declare(strict_types=1);
|
||
|
||
namespace App;
|
||
|
||
use OpenApi\Attributes as OA;
|
||
|
||
#[OA\Info(
|
||
version: '1.0.0',
|
||
title: 'Datahub API',
|
||
description: 'Datahub API documentation'
|
||
)]
|
||
#[OA\Server(url: '/api/v1', description: 'API v1')]
|
||
#[OA\SecurityScheme(
|
||
securityScheme: 'bearerAuth',
|
||
type: 'http',
|
||
scheme: 'bearer',
|
||
bearerFormat: 'JWT'
|
||
)]
|
||
#[OA\SecurityScheme(
|
||
securityScheme: 'apiKeyAuth',
|
||
type: 'apiKey',
|
||
in: 'header',
|
||
name: 'X-API-Key'
|
||
)]
|
||
#[OA\Schema(
|
||
schema: 'ApiResponse',
|
||
type: 'object',
|
||
properties: [
|
||
new OA\Property(property: 'code', type: 'integer', example: 0),
|
||
new OA\Property(property: 'message', type: 'string', example: 'success'),
|
||
new OA\Property(property: 'data', type: 'object', nullable: true),
|
||
]
|
||
)]
|
||
#[OA\Schema(
|
||
schema: 'PaginatedData',
|
||
type: 'object',
|
||
properties: [
|
||
new OA\Property(property: 'items', type: 'array', items: new OA\Items()),
|
||
new OA\Property(property: 'total', type: 'integer', example: 0),
|
||
new OA\Property(property: 'page', type: 'integer', example: 1),
|
||
new OA\Property(property: 'per_page', type: 'integer', example: 15),
|
||
]
|
||
)]
|
||
#[OA\Schema(
|
||
schema: 'ErrorResponse',
|
||
type: 'object',
|
||
properties: [
|
||
new OA\Property(property: 'code', type: 'integer', example: 400),
|
||
new OA\Property(property: 'message', type: 'string', example: 'Bad request'),
|
||
new OA\Property(property: 'data', type: 'object', nullable: true),
|
||
]
|
||
)]
|
||
#[OA\Schema(
|
||
schema: 'MqQueueInfo',
|
||
type: 'object',
|
||
description: '单个队列的状态信息',
|
||
properties: [
|
||
new OA\Property(property: 'queue', type: 'string', example: 'orders.queue', description: '队列名称'),
|
||
new OA\Property(property: 'messages', description: '消息数量(异常时为 N/A)', oneOf: [new OA\Schema(type: 'integer'), new OA\Schema(type: 'string')], example: 5),
|
||
new OA\Property(property: 'consumers', description: '消费者数量(异常时为 N/A)', oneOf: [new OA\Schema(type: 'integer'), new OA\Schema(type: 'string')], example: 1),
|
||
new OA\Property(property: 'status', type: 'string', enum: ['high_load', 'processing', 'active', 'empty', 'error'], example: 'active', description: '队列状态'),
|
||
]
|
||
)]
|
||
#[OA\Schema(
|
||
schema: 'MqQueueStatus',
|
||
type: 'object',
|
||
description: '消息队列全量状态',
|
||
properties: [
|
||
new OA\Property(property: 'business_queues', type: 'array', items: new OA\Items(ref: '#/components/schemas/MqQueueInfo'), description: '业务队列列表'),
|
||
new OA\Property(property: 'retry_queues', type: 'array', items: new OA\Items(ref: '#/components/schemas/MqQueueInfo'), description: '重试队列列表'),
|
||
new OA\Property(property: 'error_queue', ref: '#/components/schemas/MqQueueInfo', description: '错误队列(筛选时为空数组)'),
|
||
new OA\Property(property: 'summary', properties: [
|
||
new OA\Property(property: 'total_messages', type: 'integer', example: 7, description: '消息总数'),
|
||
new OA\Property(property: 'total_consumers', type: 'integer', example: 1, description: '消费者总数'),
|
||
], type: 'object', description: '汇总统计'),
|
||
new OA\Property(property: 'fetched_at', type: 'string', format: 'date-time', example: '2026-03-13 12:00:00', description: '数据获取时间'),
|
||
]
|
||
)]
|
||
#[OA\Schema(
|
||
schema: 'FailedMessageList',
|
||
type: 'object',
|
||
description: '失败消息列表项',
|
||
properties: [
|
||
new OA\Property(property: 'id', type: 'integer', example: 1),
|
||
new OA\Property(property: 'error_id', type: 'string', example: 'err_67890abc'),
|
||
new OA\Property(property: 'data_type', type: 'string', enum: ['order', 'product', 'refund'], example: 'order'),
|
||
new OA\Property(property: 'platform', type: 'string', example: 'Tmall', nullable: true),
|
||
new OA\Property(property: 'platform_id', type: 'integer', example: 1, nullable: true),
|
||
new OA\Property(property: 'company_id', type: 'integer', example: 1, nullable: true),
|
||
new OA\Property(property: 'store_id', type: 'integer', example: 1, nullable: true),
|
||
new OA\Property(property: 'error_type', type: 'string', example: 'RuntimeException'),
|
||
new OA\Property(property: 'error_message', type: 'string', example: 'Connection refused'),
|
||
new OA\Property(property: 'retry_count', type: 'integer', example: 3),
|
||
new OA\Property(property: 'message_id', type: 'string', example: 'msg_12345', nullable: true),
|
||
new OA\Property(property: 'failed_at', type: 'string', format: 'date-time'),
|
||
new OA\Property(property: 'created_at', type: 'string', format: 'date-time'),
|
||
]
|
||
)]
|
||
#[OA\Schema(
|
||
schema: 'FailedMessageDetail',
|
||
type: 'object',
|
||
description: '失败消息详情(含完整错误堆栈和原始消息体)',
|
||
properties: [
|
||
new OA\Property(property: 'id', type: 'integer', example: 1),
|
||
new OA\Property(property: 'error_id', type: 'string', example: 'err_67890abc'),
|
||
new OA\Property(property: 'data_type', type: 'string', enum: ['order', 'product', 'refund'], example: 'order'),
|
||
new OA\Property(property: 'platform', type: 'string', example: 'Tmall', nullable: true),
|
||
new OA\Property(property: 'platform_id', type: 'integer', example: 1, nullable: true),
|
||
new OA\Property(property: 'company_id', type: 'integer', example: 1, nullable: true),
|
||
new OA\Property(property: 'store_id', type: 'integer', example: 1, nullable: true),
|
||
new OA\Property(property: 'error_type', type: 'string', example: 'RuntimeException'),
|
||
new OA\Property(property: 'error_message', type: 'string', example: 'Connection refused'),
|
||
new OA\Property(property: 'error_code', type: 'integer', example: 0),
|
||
new OA\Property(property: 'error_trace', type: 'string', description: '完整异常堆栈'),
|
||
new OA\Property(property: 'original_message', type: 'object', description: '原始消息体 JSON'),
|
||
new OA\Property(property: 'retry_count', type: 'integer', example: 3),
|
||
new OA\Property(property: 'message_id', type: 'string', example: 'msg_12345', nullable: true),
|
||
new OA\Property(property: 'failed_at', type: 'string', format: 'date-time'),
|
||
new OA\Property(property: 'created_at', type: 'string', format: 'date-time'),
|
||
]
|
||
)]
|
||
#[OA\Schema(
|
||
schema: 'DashboardOverview',
|
||
type: 'object',
|
||
description: 'Dashboard 概览统计',
|
||
properties: [
|
||
new OA\Property(property: 'today', properties: [
|
||
new OA\Property(property: 'success', type: 'integer', example: 120),
|
||
new OA\Property(property: 'failed', type: 'integer', example: 3),
|
||
], type: 'object', description: '今日统计'),
|
||
new OA\Property(property: 'this_week', properties: [
|
||
new OA\Property(property: 'success', type: 'integer', example: 850),
|
||
new OA\Property(property: 'failed', type: 'integer', example: 15),
|
||
], type: 'object', description: '本周统计'),
|
||
new OA\Property(property: 'this_month', properties: [
|
||
new OA\Property(property: 'success', type: 'integer', example: 3200),
|
||
new OA\Property(property: 'failed', type: 'integer', example: 42),
|
||
], type: 'object', description: '本月统计'),
|
||
new OA\Property(property: 'by_type', type: 'array', items: new OA\Items(properties: [
|
||
new OA\Property(property: 'data_type', type: 'string', enum: ['order', 'product', 'refund', 'inventory'], example: 'order'),
|
||
new OA\Property(property: 'success', type: 'integer', example: 1000),
|
||
new OA\Property(property: 'failed', type: 'integer', example: 10),
|
||
], type: 'object'), description: '按数据类型分组统计(本月窗口)'),
|
||
]
|
||
)]
|
||
#[OA\Schema(
|
||
schema: 'DashboardTrendItem',
|
||
type: 'object',
|
||
description: '趋势数据点',
|
||
properties: [
|
||
new OA\Property(property: 'date', type: 'string', format: 'date', example: '2026-03-17'),
|
||
new OA\Property(property: 'success', type: 'integer', example: 120),
|
||
new OA\Property(property: 'failed', type: 'integer', example: 3),
|
||
]
|
||
)]
|
||
#[OA\Schema(
|
||
schema: 'DashboardBreakdownItem',
|
||
type: 'object',
|
||
description: '分组统计项',
|
||
properties: [
|
||
new OA\Property(property: 'id', type: 'integer', example: 1, description: '维度 ID(公司/平台/店铺)'),
|
||
new OA\Property(property: 'name', type: 'string', example: 'Tmall', description: '维度名称'),
|
||
new OA\Property(property: 'success', type: 'integer', example: 500),
|
||
new OA\Property(property: 'failed', type: 'integer', example: 8),
|
||
]
|
||
)]
|
||
#[OA\Schema(
|
||
schema: 'ApiRequestLogList',
|
||
type: 'object',
|
||
description: 'API 请求日志列表项',
|
||
properties: [
|
||
new OA\Property(property: 'id', type: 'integer', example: 1),
|
||
new OA\Property(property: 'user_id', type: 'integer', example: 1, nullable: true),
|
||
new OA\Property(property: 'method', type: 'string', example: 'GET'),
|
||
new OA\Property(property: 'path', type: 'string', example: '/api/v1/users'),
|
||
new OA\Property(property: 'status_code', type: 'integer', example: 200),
|
||
new OA\Property(property: 'ip', type: 'string', example: '127.0.0.1', nullable: true),
|
||
new OA\Property(property: 'response_code', type: 'integer', example: 0, nullable: true),
|
||
new OA\Property(property: 'duration_ms', type: 'integer', example: 42),
|
||
new OA\Property(property: 'created_at', type: 'string', format: 'date-time'),
|
||
]
|
||
)]
|
||
#[OA\Schema(
|
||
schema: 'ApiRequestLogDetail',
|
||
type: 'object',
|
||
description: 'API 请求日志详情(含完整请求体和 User-Agent)',
|
||
properties: [
|
||
new OA\Property(property: 'id', type: 'integer', example: 1),
|
||
new OA\Property(property: 'user_id', type: 'integer', example: 1, nullable: true),
|
||
new OA\Property(property: 'method', type: 'string', example: 'POST'),
|
||
new OA\Property(property: 'path', type: 'string', example: '/api/v1/users'),
|
||
new OA\Property(property: 'status_code', type: 'integer', example: 200),
|
||
new OA\Property(property: 'ip', type: 'string', example: '127.0.0.1', nullable: true),
|
||
new OA\Property(property: 'user_agent', type: 'string', example: 'Mozilla/5.0', nullable: true),
|
||
new OA\Property(property: 'request_body', type: 'object', description: '请求体(脱敏后)', nullable: true),
|
||
new OA\Property(property: 'response_code', type: 'integer', example: 0, nullable: true),
|
||
new OA\Property(property: 'duration_ms', type: 'integer', example: 42),
|
||
new OA\Property(property: 'created_at', type: 'string', format: 'date-time'),
|
||
]
|
||
)]
|
||
class OpenApiSpec
|
||
{
|
||
}
|