Skip to content

Commit e6f0633

Browse files
committed
Fixes for stock price charts, insider trading, and analyst ratings
1 parent d3169ac commit e6f0633

16 files changed

+1394
-77
lines changed

php-symfony-neuron/.env.example

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ RAPID_API_KEY=your_rapid_api_key
2626
NEWS_API_KEY=your_news_api_key
2727
# Kaleidoscope API (used for all SEC filings)
2828
KALEIDOSCOPE_API_KEY=your_kaleidoscope_api_key
29+
# TradeFeeds API (used for analyst ratings) - optional, if not provided analyst ratings will be unavailable
30+
TRADEFEEDS_API_KEY=your_tradefeeds_api_key
2931
###< Financial API Keys ###
3032

3133
###> LinkedIn API Integration ###

php-symfony-neuron/ci/bitbucket/bitbucket-pipelines.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -132,8 +132,8 @@ pipelines:
132132
fi
133133
134134
# Set environment variables
135-
if [ -n "$STOCK_API_KEY" ]; then
136-
cf set-env "$APP_NAME" "STOCK_API_KEY" "$STOCK_API_KEY"
135+
if [ -n "$ALPHA_VANTAGE_API_KEY" ]; then
136+
cf set-env "$APP_NAME" "ALPHA_VANTAGE_API_KEY" "$ALPHA_VANTAGE_API_KEY"
137137
fi
138138
139139
if [ -n "$NEWS_API_KEY" ]; then
@@ -173,7 +173,7 @@ options:
173173
# CF_ORG: Cloud Foundry organization
174174
# CF_SPACE: Cloud Foundry space
175175
# RANDOM_ROUTE: Whether to use a random route (true/false)
176-
# STOCK_API_KEY: Stock API key
176+
# ALPHA_VANTAGE_API_KEY: Stock API key
177177
# NEWS_API_KEY: News API key
178178
# KALEIDOSCOPE_API_KEY: Kaleidoscope API key
179179
# OPENAI_API_KEY: OpenAI API key

php-symfony-neuron/ci/gitlab/.gitlab-ci.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ deploy:
124124
CF_ORG: ""
125125
CF_SPACE: ""
126126
RANDOM_ROUTE: "false"
127-
STOCK_API_KEY: ""
127+
ALPHA_VANTAGE_API_KEY: ""
128128
NEWS_API_KEY: ""
129129
KALEIDOSCOPE_API_KEY: ""
130130
OPENAI_API_KEY: ""
@@ -172,8 +172,8 @@ deploy:
172172
fi
173173
174174
# Set environment variables
175-
if [ -n "$STOCK_API_KEY" ]; then
176-
cf set-env "$APP_NAME" "STOCK_API_KEY" "$STOCK_API_KEY"
175+
if [ -n "$ALPHA_VANTAGE_API_KEY" ]; then
176+
cf set-env "$APP_NAME" "ALPHA_VANTAGE_API_KEY" "$ALPHA_VANTAGE_API_KEY"
177177
fi
178178
179179
if [ -n "$NEWS_API_KEY" ]; then

php-symfony-neuron/ci/jenkins/Jenkinsfile

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ pipeline {
147147
string(name: 'CF_ORG', defaultValue: '', description: 'Cloud Foundry Organization')
148148
string(name: 'CF_SPACE', defaultValue: '', description: 'Cloud Foundry Space')
149149
booleanParam(name: 'RANDOM_ROUTE', defaultValue: false, description: 'Use random route for the application')
150-
password(name: 'STOCK_API_KEY', defaultValue: '', description: 'Stock API Key')
150+
password(name: 'ALPHA_VANTAGE_API_KEY', defaultValue: '', description: 'Stock API Key')
151151
password(name: 'NEWS_API_KEY', defaultValue: '', description: 'News API Key')
152152
password(name: 'KALEIDOSCOPE_API_KEY', defaultValue: '', description: 'Kaleidoscope API Key')
153153
password(name: 'OPENAI_API_KEY', defaultValue: '', description: 'OpenAI API Key')
@@ -206,8 +206,8 @@ pipeline {
206206
fi
207207
208208
# Set environment variables
209-
if [ -n "${STOCK_API_KEY}" ]; then
210-
cf set-env "$APP_NAME" "STOCK_API_KEY" "${STOCK_API_KEY}"
209+
if [ -n "${ALPHA_VANTAGE_API_KEY}" ]; then
210+
cf set-env "$APP_NAME" "ALPHA_VANTAGE_API_KEY" "${ALPHA_VANTAGE_API_KEY}"
211211
fi
212212
213213
if [ -n "${NEWS_API_KEY}" ]; then

php-symfony-neuron/config/packages/stock_api.yaml

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
parameters:
2-
alpha_vantage.api_key: '%env(default:STOCK_API_KEY:ALPHA_VANTAGE_API_KEY)%'
3-
yahoo_finance.api_key: '%env(default::RAPID_API_KEY)%'
4-
news_api.api_key: '%env(NEWS_API_KEY)%'
5-
sec_api.api_key: '%env(default::SEC_API_KEY)%'
2+
# Stock and financial APIs
3+
alpha_vantage.api_key: '%env(resolve:ALPHA_VANTAGE_API_KEY)%'
4+
yahoo_finance.api_key: '%env(resolve:RAPID_API_KEY)%'
5+
news_api.api_key: '%env(resolve:NEWS_API_KEY)%'
6+
kaleidoscope_api.key: '%env(resolve:KALEIDOSCOPE_API_KEY)%'
7+
kaleidoscope_api.base_url_default: 'https://api.kscope.io/v2'
8+
kaleidoscope_api.base_url: '%env(default:kaleidoscope_api.base_url_default:KALEIDOSCOPE_BASE_URL)%'
69

710
services:
811
# Configure cache for the stock data service
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# TradeFeeds API configuration
2+
parameters:
3+
# Map the environment variable to the parameter used by TradeFeedsApiClient
4+
tradefeeds.api_key: '%env(TRADEFEEDS_API_KEY)%'
5+
6+
services:
7+
# Configure the TradeFeedsApiClient service
8+
App\Service\ApiClient\TradeFeedsApiClient:
9+
arguments:
10+
$client: '@http_client'
11+
$params: '@parameter_bag'
12+
$logger: '@logger'
13+
tags: ['app.api_client']
14+
15+
# Configure the MockTradeFeedsApiClient service for development/testing
16+
App\Service\ApiClient\MockTradeFeedsApiClient:
17+
arguments:
18+
$client: '@http_client'
19+
$params: '@parameter_bag'
20+
$logger: '@logger'
21+
tags: ['app.api_client']

php-symfony-neuron/config/services.yaml

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
parameters:
2-
app.rapid_api_key: '%env(resolve:RAPID_API_KEY)%'
3-
app.genai_api_key: '%env(resolve:GENAI_API_KEY)%'
4-
app.genai_base_url: '%env(resolve:GENAI_BASE_URL)%'
5-
app.genai_model: '%env(resolve:GENAI_MODEL)%'
2+
# General services
3+
rapid_api.api_key: '%env(resolve:RAPID_API_KEY)%'
4+
5+
# GenAI/LLM Integration
6+
genai.api_key: '%env(resolve:GENAI_API_KEY)%'
7+
genai.base_url: '%env(resolve:GENAI_BASE_URL)%'
8+
genai.model: '%env(resolve:GENAI_MODEL)%'
69

710
services:
811
# default configuration for services in *this* file
@@ -36,25 +39,25 @@ services:
3639
# Yahoo Finance API Service using the client
3740
App\Service\YahooFinanceService:
3841
arguments:
39-
$rapidApiKey: '%app.rapid_api_key%'
40-
$useMockData: '%env(default:false:bool:USE_MOCK_DATA)%'
42+
$rapidApiKey: '%rapid_api.api_key%'
43+
$useMockData: '%env(default::bool:USE_MOCK_DATA)%'
4144

4245
# Stock Clients Factory Configuration
4346
App\Service\ApiClient\StockClientsFactory:
4447
arguments:
45-
$useMockData: '%env(default:false:bool:USE_MOCK_DATA)%'
48+
$useMockData: '%env(default::bool:USE_MOCK_DATA)%'
4649

4750
# LinkedIn Client Factory Configuration
4851
App\Service\ApiClient\LinkedInClientFactory:
4952
arguments:
50-
$useMockData: '%env(default:false:bool:USE_MOCK_DATA)%'
53+
$useMockData: '%env(default::bool:USE_MOCK_DATA)%'
5154

5255
# LLM Client Factory Configuration
5356
App\Service\LlmClientFactory:
5457
arguments:
55-
$apiKey: '%app.genai_api_key%'
56-
$baseUrl: '%app.genai_base_url%'
57-
$model: '%app.genai_model%'
58+
$apiKey: '%genai.api_key%'
59+
$baseUrl: '%genai.base_url%'
60+
$model: '%genai.model%'
5861

5962
# Neuron AI Service Configuration
6063
App\Service\NeuronAiService:

php-symfony-neuron/src/Controller/CompanyController.php

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,18 @@
2020
use Symfony\Component\HttpFoundation\BinaryFileResponse;
2121
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
2222
use Symfony\Component\Routing\Annotation\Route;
23+
use Psr\Log\LoggerInterface;
2324

2425
#[Route('/company')]
2526
class CompanyController extends AbstractController
2627
{
28+
private LoggerInterface $logger;
29+
30+
public function __construct(LoggerInterface $logger)
31+
{
32+
$this->logger = $logger;
33+
}
34+
2735
#[Route('/', name: 'company_index', methods: ['GET'])]
2836
public function index(CompanyRepository $companyRepository): Response
2937
{
@@ -358,7 +366,22 @@ public function stockPrices(
358366
default => 365,
359367
};
360368

361-
$stockDataService->importHistoricalPrices($company, $interval, $importLimit);
369+
try {
370+
$count = $stockDataService->importHistoricalPrices($company, $interval, $importLimit);
371+
$this->logger->info("Imported {$count} {$interval} price records for {$company->getTickerSymbol()}");
372+
373+
// Force refresh if we need daily data but got no results
374+
if ($count === 0 && $interval === 'daily') {
375+
// Try weekly as fallback
376+
$this->logger->warning("No daily data available, trying weekly as fallback");
377+
$stockDataService->importHistoricalPrices($company, 'weekly', 260);
378+
}
379+
} catch (\Exception $e) {
380+
$this->logger->error("Error importing historical prices: " . $e->getMessage(), [
381+
'symbol' => $company->getTickerSymbol(),
382+
'interval' => $interval
383+
]);
384+
}
362385
}
363386

364387
// Get date range based on selected period

0 commit comments

Comments
 (0)