feat: 重构项目心跳数据结构并实现项目列表API
- 新增统一项目列表Redis键和迁移工具 - 实现GET /api/projects端点获取项目列表 - 实现POST /api/projects/migrate端点支持数据迁移 - 更新前端ProjectSelector组件使用真实项目数据 - 扩展projectStore状态管理 - 更新相关文档和OpenSpec规范 - 添加测试用例验证新功能
This commit is contained in:
@@ -1,48 +1,59 @@
|
||||
# Redis Connection Capability Specification
|
||||
|
||||
## Overview
|
||||
|
||||
This specification defines the Redis connection capability for the BLS Project Console, which manages the connection between the system and the Redis server for reading logs and sending commands.
|
||||
|
||||
## Requirements
|
||||
|
||||
### Requirement: Redis Connection Establishment
|
||||
|
||||
The system SHALL establish a connection to the Redis server.
|
||||
|
||||
#### Scenario: Establishing Redis connection on server start
|
||||
|
||||
- **WHEN** the server starts
|
||||
- **THEN** it SHALL attempt to connect to the Redis server
|
||||
- **AND** it SHALL log the connection status
|
||||
|
||||
### Requirement: Redis Connection Configuration
|
||||
|
||||
The system SHALL allow configuration of Redis connection parameters.
|
||||
|
||||
#### Scenario: Configuring Redis connection via environment variables
|
||||
|
||||
- **WHEN** the server starts with Redis environment variables set
|
||||
- **THEN** it SHALL use those variables to configure the Redis connection
|
||||
- **AND** it SHALL override default values
|
||||
|
||||
### Requirement: Redis Connection Reconnection
|
||||
|
||||
The system SHALL automatically reconnect to Redis if the connection is lost.
|
||||
|
||||
#### Scenario: Reconnecting to Redis after connection loss
|
||||
|
||||
- **WHEN** the Redis connection is lost
|
||||
- **THEN** the system SHALL attempt to reconnect with exponential backoff
|
||||
- **AND** it SHALL log each reconnection attempt
|
||||
- **AND** it SHALL notify the user when connection is restored
|
||||
|
||||
### Requirement: Redis Connection Error Handling
|
||||
|
||||
The system SHALL handle Redis connection errors gracefully.
|
||||
|
||||
#### Scenario: Handling Redis connection failure
|
||||
|
||||
- **WHEN** the system fails to connect to Redis
|
||||
- **THEN** it SHALL log the error
|
||||
- **AND** it SHALL display an error message to the user
|
||||
- **AND** it SHALL continue attempting to reconnect
|
||||
|
||||
### Requirement: Redis Connection Monitoring
|
||||
|
||||
The system SHALL monitor the Redis connection status.
|
||||
|
||||
#### Scenario: Monitoring Redis connection status
|
||||
|
||||
- **WHEN** the Redis connection status changes
|
||||
- **THEN** the system SHALL update the connection status in the UI
|
||||
- **AND** it SHALL log the status change
|
||||
@@ -50,6 +61,7 @@ The system SHALL monitor the Redis connection status.
|
||||
## Data Model
|
||||
|
||||
### Redis Connection Configuration
|
||||
|
||||
```json
|
||||
{
|
||||
"host": "string",
|
||||
@@ -65,6 +77,7 @@ The system SHALL monitor the Redis connection status.
|
||||
```
|
||||
|
||||
### Redis Connection Status
|
||||
|
||||
```json
|
||||
{
|
||||
"status": "string", // e.g., connecting, connected, disconnected, error
|
||||
@@ -77,6 +90,7 @@ The system SHALL monitor the Redis connection status.
|
||||
## API Endpoints
|
||||
|
||||
### GET /api/redis/status
|
||||
|
||||
- **Description**: Get Redis connection status
|
||||
- **Response**:
|
||||
```json
|
||||
@@ -84,11 +98,12 @@ The system SHALL monitor the Redis connection status.
|
||||
"status": "string",
|
||||
"lastConnectedAt": "ISO-8601 string",
|
||||
"lastDisconnectedAt": "ISO-8601 string",
|
||||
"error": "string" // optional
|
||||
"error": "string"
|
||||
}
|
||||
```
|
||||
|
||||
### POST /api/redis/reconnect
|
||||
|
||||
- **Description**: Manually reconnect to Redis
|
||||
- **Response**:
|
||||
```json
|
||||
@@ -97,3 +112,47 @@ The system SHALL monitor the Redis connection status.
|
||||
"message": "Reconnection attempt initiated"
|
||||
}
|
||||
```
|
||||
|
||||
### GET /api/projects
|
||||
|
||||
- **Description**: Get list of all projects from Redis
|
||||
- **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
|
||||
}
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user