feat: 重构项目心跳数据结构并实现项目列表API
- 新增统一项目列表Redis键和迁移工具 - 实现GET /api/projects端点获取项目列表 - 实现POST /api/projects/migrate端点支持数据迁移 - 更新前端ProjectSelector组件使用真实项目数据 - 扩展projectStore状态管理 - 更新相关文档和OpenSpec规范 - 添加测试用例验证新功能
This commit is contained in:
@@ -1,44 +1,54 @@
|
||||
# Command Capability Specification
|
||||
|
||||
## Overview
|
||||
|
||||
This specification defines the command capability for the BLS Project Console, which allows users to send console commands to Redis queues for other programs to read and execute.
|
||||
|
||||
## Requirements
|
||||
|
||||
### Requirement: Command Sending to Redis
|
||||
|
||||
The system SHALL send commands to a Redis queue.
|
||||
|
||||
#### Scenario: Sending a command to Redis queue
|
||||
|
||||
- **WHEN** the user enters a command in the console
|
||||
- **AND** clicks the "Send" button
|
||||
- **THEN** the command SHALL be sent to the Redis queue
|
||||
- **AND** the user SHALL receive a success confirmation
|
||||
|
||||
### Requirement: Command Validation
|
||||
|
||||
The system SHALL validate commands before sending them to Redis.
|
||||
|
||||
#### Scenario: Validating an empty command
|
||||
|
||||
- **WHEN** the user tries to send an empty command
|
||||
- **THEN** the system SHALL display an error message
|
||||
- **AND** the command SHALL NOT be sent to Redis
|
||||
|
||||
#### Scenario: Validating a command with invalid characters
|
||||
|
||||
- **WHEN** the user tries to send a command with invalid characters
|
||||
- **THEN** the system SHALL display an error message
|
||||
- **AND** the command SHALL NOT be sent to Redis
|
||||
|
||||
### Requirement: Command History
|
||||
|
||||
The system SHALL maintain a history of sent commands.
|
||||
|
||||
#### Scenario: Viewing command history
|
||||
|
||||
- **WHEN** the user opens the command history
|
||||
- **THEN** the system SHALL display a list of previously sent commands
|
||||
- **AND** the user SHALL be able to select a command from the history to resend
|
||||
|
||||
### Requirement: Command Response Handling
|
||||
|
||||
The system SHALL handle responses from commands sent to Redis.
|
||||
|
||||
#### Scenario: Receiving a command response
|
||||
|
||||
- **WHEN** a command response is received from Redis
|
||||
- **THEN** the system SHALL display the response in the console
|
||||
- **AND** the response SHALL be associated with the original command
|
||||
@@ -46,6 +56,7 @@ The system SHALL handle responses from commands sent to Redis.
|
||||
## Data Model
|
||||
|
||||
### Command
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "string",
|
||||
@@ -56,6 +67,7 @@ The system SHALL handle responses from commands sent to Redis.
|
||||
```
|
||||
|
||||
### Command Response
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "string",
|
||||
@@ -69,29 +81,80 @@ The system SHALL handle responses from commands sent to Redis.
|
||||
## API Endpoints
|
||||
|
||||
### POST /api/commands
|
||||
- **Description**: Send a command to the Redis queue
|
||||
|
||||
- **Description**: Send a command to a project's API endpoint
|
||||
- **Request Body**:
|
||||
```json
|
||||
{
|
||||
"content": "string" // the command to send
|
||||
"targetProjectName": "string",
|
||||
"command": "string"
|
||||
}
|
||||
```
|
||||
- **Response**:
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"message": "Command sent successfully",
|
||||
"commandId": "string"
|
||||
"message": "已调用目标项目 API",
|
||||
"commandId": "string",
|
||||
"targetUrl": "string",
|
||||
"upstreamStatus": 200,
|
||||
"upstreamData": "object"
|
||||
}
|
||||
```
|
||||
|
||||
### GET /api/projects
|
||||
|
||||
- **Description**: Get list of all projects with their heartbeat status
|
||||
- **Response**:
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"projects": [
|
||||
{
|
||||
"id": "string",
|
||||
"name": "string",
|
||||
"apiBaseUrl": "string",
|
||||
"lastActiveAt": "number",
|
||||
"status": "online|offline|unknown",
|
||||
"isOnline": "boolean",
|
||||
"ageMs": "number"
|
||||
}
|
||||
],
|
||||
"count": 10
|
||||
}
|
||||
```
|
||||
|
||||
### POST /api/projects/migrate
|
||||
|
||||
- **Description**: Migrate heartbeat data from old structure to new unified structure
|
||||
- **Request Body**:
|
||||
```json
|
||||
{
|
||||
"deleteOldKeys": false,
|
||||
"dryRun": false
|
||||
}
|
||||
```
|
||||
- **Response**:
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"message": "数据迁移完成",
|
||||
"migrated": 5,
|
||||
"projects": [...],
|
||||
"listKey": "项目心跳",
|
||||
"deleteOldKeys": false
|
||||
}
|
||||
```
|
||||
|
||||
### GET /api/commands/history
|
||||
- **Description**: Get command history
|
||||
|
||||
- **Description**: Get command history (deprecated - use project logs instead)
|
||||
- **Query Parameters**:
|
||||
- `limit`: Maximum number of commands to return (default: 50)
|
||||
- `offset`: Offset for pagination (default: 0)
|
||||
- **Response**: Array of command objects
|
||||
|
||||
### GET /api/commands/:id/response
|
||||
- **Description**: Get response for a specific command
|
||||
|
||||
- **Description**: Get response for a specific command (deprecated - use project logs instead)
|
||||
- **Response**: Command response object
|
||||
|
||||
Reference in New Issue
Block a user