chizy7 / chizy7/PinnacleMM

[FEATURE] Implement historical chart data collection and query string parsing in WebServer

Open
#32 0 comments 0 reactions 0 assignees View on GitHub
enhancement
Dominant language
C++
Stars
14
Forks
12
Avg merge
1h 27m
Merged PRs (30d)
3

Description

### Note to self to serve as reminder

## Description
The WebServer visualization system has two incomplete stub implementations which I need to properly implement for full functionality. I had made a stub implementation, to return to this later:

1. **`PerformanceCollector::getChartData()`** - Currently returns an empty vector
2. **`RestAPIServer::parseQueryString()`** - Marked as "not implemented for brevity"

## Current Behavior

### getChartData() (line 64-71)
```cpp
std::vector
PerformanceCollector::getChartData(const std::string& strategyId,
const std::string& metric,
uint64_t timeRange) const {
std::vector result;
// Return empty for now - can be implemented later
return result;
}
```
- Always returns empty chart data
- Client requests for historical data visualization receive no data
- Used by WebSocket handleGetHistory() and REST API handleGetChartData()

parseQueryString() (line 1000-1006)
```cpp
std::unordered_map
RestAPIServer::parseQueryString(const std::string& query) {
std::unordered_map params;
// Simple query string parsing (not implemented for brevity)
boost::ignore_unused(query);
return params;
}
```
- Returns empty parameters map
- REST API endpoints cannot parse URL query parameters
- Limits filtering/pagination capabilities

Expected Behavior

getChartData()

- Maintain historical time-series data for each metric (PnL, position, Sharpe ratio, etc.)
- Return data points within the specified time range
- Support configurable history size (already has m_maxHistorySize)
- Thread-safe access to historical data

parseQueryString()

- Parse URL query strings (e.g., ?start=123&end=456&limit=100)
- Return key-value map of parameters
- Handle URL decoding for special characters
- Support common query parameters: time ranges, pagination, filtering

Implementation Considerations

For getChartData():

- I can add std::deque storage per strategy/metric combination
- Implement rolling buffer with max size enforcement
- Collect data during startCollection() broadcasts
- Filter by timestamp for time range queries

For parseQueryString():

- I will use Boost string algorithms or manual parsing
- Handle URL encoding/decoding
- Support & delimiter and = key-value separator
- Return empty map for malformed queries (graceful degradation)

Affected Components

- WebSocket real-time updates (handleGetHistory())
- REST API endpoints (handleGetChartData())
- Performance visualization dashboard
- Historical data analysis features

Priority

Medium - These features are needed for complete visualization functionality but I have a graceful fallbacks (empty data/params)

Files to Modify

- visualization/WebServer.cpp
- visualization/WebServer.h ( I may need to add data structures for historical storage)

Contributor guide

Open the contributing guide

Research direction

Start in visualization/WebServer.cpp and visualization/WebServer.h, then trace PerformanceCollector::getChartData(), RestAPIServer::parseQueryString(), handleGetHistory(), and handleGetChartData(). Define how historical storage, time-range filtering, URL decoding, and thread-safe access should work before implementing; done means chart requests return retained data and REST query parameters are parsed as expected.

Written by the indexing model from the issue text.

Assessment

Tech stack
cpp
Domain
api, backend, data-visualization
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.