Skip to content

Commit 5dbceec

Browse files
committed
Continuing to fix what was broken
1 parent 1ee06c1 commit 5dbceec

23 files changed

+1166
-1410
lines changed

php-symfony-neuron/.env.example

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,38 @@ APP_ENV=dev
33
APP_SECRET=your_app_secret_here
44
###< symfony/framework-bundle ###
55

6-
###> Database Configuration ###
7-
DATABASE_URL="mysql://db_user:[email protected]:3306/db_name"
8-
###< Database Configuration ###
6+
###> doctrine/doctrine-bundle ###
7+
# Format described at https://www.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url
8+
DATABASE_URL="sqlite:///%kernel.project_dir%/var/data.db"
9+
#DATABASE_URL="mysql://db_user:[email protected]:3306/db_name"
10+
###< doctrine/doctrine-bundle ###
11+
12+
###> LLM Configuration ###
13+
# These values are for local development only
14+
# In production on Cloud Foundry, these will be provided by service binding
15+
GENAI_API_KEY=your_genai_api_key
16+
GENAI_BASE_URL=https://api.openai.com/v1
17+
GENAI_MODEL=gpt-4o-mini
18+
###< LLM Configuration ###
919

1020
###> Financial API Keys ###
11-
STOCK_API_KEY=your_stock_api_key
21+
# Alpha Vantage API key (used as the primary stock data provider)
22+
ALPHA_VANTAGE_API_KEY=your_alpha_vantage_api_key
23+
# Yahoo Finance API key (used as a fallback for stock data)
24+
YAHOO_FINANCE_API_KEY=your_yahoo_finance_api_key
25+
# News API key (used for fetching financial news)
1226
NEWS_API_KEY=your_news_api_key
13-
EDGAR_API_KEY=your_edgar_api_key
27+
# SEC EDGAR API (no API key required, but requires a User-Agent with contact info)
28+
SEC_EDGAR_USER_AGENT="PHP/Symfony/NeuronAI Company Research Assistant [email protected]"
1429
###< Financial API Keys ###
1530

16-
###> AI Services ###
17-
OPENAI_API_KEY=your_openai_api_key
18-
###< AI Services ###
19-
2031
###> LinkedIn API Integration ###
2132
LINKEDIN_CLIENT_ID=your_linkedin_client_id
2233
LINKEDIN_CLIENT_SECRET=your_linkedin_client_secret
2334
LINKEDIN_REDIRECT_URI=https://your-app.com/linkedin/callback
2435
###< LinkedIn API Integration ###
2536

37+
###> Feature Flags ###
38+
# Set to 'true' to use mock data instead of real API calls
2639
USE_MOCK_DATA=true
40+
###< Feature Flags ###
Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,17 @@
1+
# FILE: php-symfony-neuron/config/packages/edgar_api.yaml
2+
# Purpose: Configuration for the SEC EDGAR API integration
3+
14
parameters:
2-
edgar_api.api_key: '%env(resolve:EDGAR_API_KEY)%'
5+
# User-Agent header for SEC EDGAR API requests
6+
# This should follow SEC guidelines: organization name and email
7+
# See: https://www.sec.gov/os/webmaster-faq#code-of-conduct
8+
edgar_api.user_agent: 'Research Application ([email protected])'
9+
10+
# These environment variables can be overridden in .env.local
11+
# We don't need an API key for the SEC EDGAR API - only a proper User-Agent header
312

413
services:
5-
# Configure the EDGAR API client
6-
App\Service\ApiClient\EdgarApiClient:
7-
arguments:
8-
$params: '@parameter_bag'
9-
$logger: '@logger'
10-
calls:
11-
- [initialize, []]
14+
# Add any specific services needed for the EDGAR API here
1215

13-
# Configure the SEC filing service
14-
App\Service\SecFilingService:
15-
arguments:
16-
$edgarApiClient: '@App\Service\ApiClient\EdgarApiClient'
17-
$neuronAiService: '@App\Service\NeuronAiService'
18-
$entityManager: '@doctrine.orm.entity_manager'
19-
$secFilingRepository: '@App\Repository\SecFilingRepository'
20-
$logger: '@logger'
16+
# Note: The ApiClient\EdgarClientFactory and related services are
17+
# defined in config/services.yaml for consistency with other API clients

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

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,32 @@
11
framework:
22
secret: '%env(APP_SECRET)%'
3+
#csrf_protection: true
34

4-
# Note that the session will be started ONLY if you read or write from it.
5-
session: true
5+
# Enable HTTP Client with proper configuration
6+
http_client:
7+
default_options:
8+
headers:
9+
'User-Agent': 'Symfony/NeuronAI Financial Research Application'
10+
# We don't need any scoped clients - just use the default http_client
11+
12+
# Enabled the trusted proxies
13+
# trusted_proxies: '127.0.0.1,REMOTE_ADDR'
14+
# trusted_headers: ['x-forwarded-for', 'x-forwarded-host', 'x-forwarded-proto', 'x-forwarded-port', 'x-forwarded-prefix']
15+
16+
# Enabled the trusted hosts
17+
# trusted_hosts: ~
18+
19+
# Set a session cookie secure if you are accessing app via https
20+
session:
21+
handler_id: null
22+
cookie_secure: auto
23+
cookie_samesite: lax
24+
storage_factory_id: session.storage.factory.native
625

726
#esi: true
827
#fragments: true
28+
php_errors:
29+
log: true
930

1031
when@test:
1132
framework:
Lines changed: 7 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
parameters:
2-
alpha_vantage.api_key: '%env(resolve:ALPHA_VANTAGE_API_KEY)%'
3-
yahoo_finance.api_key: '%env(resolve:YAHOO_FINANCE_API_KEY)%'
4-
news_api.api_key: '%env(resolve:NEWS_API_KEY)%'
5-
sec_api.api_key: '%env(resolve:SEC_API_KEY)%'
2+
alpha_vantage.api_key: '%env(default:STOCK_API_KEY:ALPHA_VANTAGE_API_KEY)%'
3+
yahoo_finance.api_key: '%env(default::YAHOO_FINANCE_API_KEY)%'
4+
news_api.api_key: '%env(NEWS_API_KEY)%'
5+
sec_api.api_key: '%env(default::SEC_API_KEY)%'
66

77
services:
88
# Configure cache for the stock data service
@@ -13,42 +13,7 @@ services:
1313
$defaultLifetime: 3600
1414
$directory: '%kernel.cache_dir%/stock_data'
1515

16-
# API clients
17-
App\Service\ApiClient\AlphaVantageClient:
18-
arguments:
19-
$params: '@parameter_bag'
20-
$logger: '@logger'
21-
calls:
22-
- [initialize, []]
23-
24-
App\Service\ApiClient\YahooFinanceClient:
25-
arguments:
26-
$params: '@parameter_bag'
27-
$logger: '@logger'
28-
calls:
29-
- [initialize, []]
30-
31-
App\Service\ApiClient\NewsApiClient:
32-
arguments:
33-
$params: '@parameter_bag'
34-
$logger: '@logger'
35-
calls:
36-
- [initialize, []]
37-
38-
App\Service\ApiClient\SecApiClient:
39-
arguments:
40-
$params: '@parameter_bag'
41-
$logger: '@logger'
42-
calls:
43-
- [initialize, []]
16+
# API clients - removed explicit service definition since we're using factories now
4417

45-
# Stock data service
46-
App\Service\StockDataService:
47-
arguments:
48-
$alphaVantageClient: '@App\Service\ApiClient\AlphaVantageClient'
49-
$yahooFinanceClient: '@App\Service\ApiClient\YahooFinanceClient'
50-
$newsApiClient: '@App\Service\ApiClient\NewsApiClient'
51-
$secApiClient: '@App\Service\ApiClient\SecApiClient'
52-
$entityManager: '@doctrine.orm.entity_manager'
53-
$cache: '@stock_data.cache'
54-
$logger: '@logger'
18+
# Stock data cache definition only
19+
# The StockDataService is now defined in services.yaml using the factory pattern

php-symfony-neuron/config/services.yaml

Lines changed: 120 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ parameters:
66
llm.base_url: '%env(GENAI_BASE_URL)%'
77
llm.model: '%env(GENAI_MODEL)%'
88
env(USE_MOCK_DATA): '%env(bool:USE_MOCK_DATA)%'
9+
alpha_vantage.api_key: '%env(ALPHA_VANTAGE_API_KEY)%'
10+
edgar_api.user_agent: '%env(SEC_EDGAR_USER_AGENT)%' # User-Agent for SEC EDGAR API from environment
911

1012
services:
1113
# Default configuration for services in *this* file
@@ -23,60 +25,134 @@ services:
2325
- '../src/DependencyInjection/'
2426
- '../src/Entity/'
2527
- '../src/Kernel.php'
26-
# Exclude API client implementations AND factories - we define them explicitly
27-
- '../src/Service/ApiClient/'
28+
# Removed exclusion of API client implementations AND factories to enable autowiring
29+
# - '../src/Service/ApiClient/'
2830

2931
# --- Define ALL Concrete Implementations (Real & Mock) ---
30-
# These need to be defined so the factories can locate them.
31-
App\Service\ApiClient\AlphaVantageClient: ~ # ~ uses _defaults
32-
App\Service\ApiClient\YahooFinanceClient: ~
33-
App\Service\ApiClient\SecApiClient: ~
34-
App\Service\ApiClient\NewsApiClient: ~
35-
App\Service\ApiClient\EdgarApiClient: ~
36-
App\Service\ApiClient\LinkedInApiClient: ~
37-
38-
App\Service\ApiClient\MockAlphaVantageClient: ~
39-
App\Service\ApiClient\MockYahooFinanceClient: ~
40-
App\Service\ApiClient\MockSecApiClient: ~
41-
App\Service\ApiClient\MockNewsApiClient: ~
42-
App\Service\ApiClient\MockEdgarApiClient: ~
43-
App\Service\ApiClient\MockLinkedInApiClient: ~
32+
# These need to be defined with proper arguments for the factories to locate them
33+
# Alpha Vantage
34+
App\Service\ApiClient\AlphaVantageClient:
35+
public: true
36+
arguments:
37+
$httpClient: '@http_client'
38+
$params: '@parameter_bag'
39+
$logger: '@logger'
40+
41+
App\Service\ApiClient\MockAlphaVantageClient:
42+
public: true
43+
44+
# Yahoo Finance
45+
App\Service\ApiClient\YahooFinanceClient:
46+
public: true
47+
arguments:
48+
$httpClient: '@http_client'
49+
$params: '@parameter_bag'
50+
$logger: '@logger'
51+
52+
App\Service\ApiClient\MockYahooFinanceClient:
53+
public: true
54+
55+
# SEC API (Edgar)
56+
App\Service\ApiClient\SecApiClient:
57+
public: true
58+
arguments:
59+
$httpClient: '@http_client'
60+
$params: '@parameter_bag'
61+
$logger: '@logger'
62+
63+
App\Service\ApiClient\MockSecApiClient:
64+
public: true
65+
66+
# News API
67+
App\Service\ApiClient\NewsApiClient:
68+
public: true
69+
arguments:
70+
$httpClient: '@http_client'
71+
$params: '@parameter_bag'
72+
$logger: '@logger'
73+
74+
App\Service\ApiClient\MockNewsApiClient:
75+
public: true
76+
77+
# Edgar API
78+
App\Service\ApiClient\EdgarApiClient:
79+
public: true
80+
arguments:
81+
$httpClient: '@http_client'
82+
$params: '@parameter_bag'
83+
$logger: '@logger'
84+
85+
App\Service\ApiClient\MockEdgarApiClient:
86+
public: true
87+
88+
# LinkedIn API
89+
App\Service\ApiClient\LinkedInApiClient:
90+
public: true
91+
arguments:
92+
$params: '@parameter_bag'
93+
$logger: '@logger'
94+
$requestStack: '@request_stack'
95+
96+
App\Service\ApiClient\MockLinkedInApiClient:
97+
public: true
4498

4599
# --- Define the Factories ---
46100
# We use a service locator for the factories to avoid circular dependencies
47101
# and allow the factories to access the correct client service.
102+
# Define explicit service locators for factories to avoid YAML !service_locator tag issues
103+
App\Service\ApiClient\EdgarClientFactory.locator:
104+
public: true
105+
class: Symfony\Component\DependencyInjection\ServiceLocator
106+
tags: ['container.service_locator']
107+
arguments:
108+
-
109+
App\Service\ApiClient\EdgarApiClient: '@App\Service\ApiClient\EdgarApiClient'
110+
App\Service\ApiClient\MockEdgarApiClient: '@App\Service\ApiClient\MockEdgarApiClient'
111+
48112
App\Service\ApiClient\EdgarClientFactory:
113+
public: true
49114
arguments:
50-
$locator: !service_locator # Use a service locator
51-
# List the services this factory needs access to
52-
- App\Service\ApiClient\EdgarApiClient
53-
- App\Service\ApiClient\MockEdgarApiClient
115+
$locator: '@App\Service\ApiClient\EdgarClientFactory.locator'
54116
$useMockData: '%env(bool:USE_MOCK_DATA)%'
55-
tags: ['container.service_subscriber'] # Tag for service locator
117+
tags: ['container.service_subscriber']
118+
119+
App\Service\ApiClient\LinkedInClientFactory.locator:
120+
public: true
121+
class: Symfony\Component\DependencyInjection\ServiceLocator
122+
tags: ['container.service_locator']
123+
arguments:
124+
-
125+
App\Service\ApiClient\LinkedInApiClient: '@App\Service\ApiClient\LinkedInApiClient'
126+
App\Service\ApiClient\MockLinkedInApiClient: '@App\Service\ApiClient\MockLinkedInApiClient'
56127

57128
App\Service\ApiClient\LinkedInClientFactory:
129+
public: true
58130
arguments:
59-
$locator: !service_locator
60-
# List the services this factory needs access to
61-
- App\Service\ApiClient\LinkedInApiClient
62-
- App\Service\ApiClient\MockLinkedInApiClient
131+
$locator: '@App\Service\ApiClient\LinkedInClientFactory.locator'
63132
$useMockData: '%env(bool:USE_MOCK_DATA)%'
64133
tags: ['container.service_subscriber']
65134

135+
App\Service\ApiClient\StockClientsFactory.locator:
136+
public: true
137+
class: Symfony\Component\DependencyInjection\ServiceLocator
138+
tags: ['container.service_locator']
139+
arguments:
140+
-
141+
App\Service\ApiClient\AlphaVantageClient: '@App\Service\ApiClient\AlphaVantageClient'
142+
App\Service\ApiClient\MockAlphaVantageClient: '@App\Service\ApiClient\MockAlphaVantageClient'
143+
App\Service\ApiClient\YahooFinanceClient: '@App\Service\ApiClient\YahooFinanceClient'
144+
App\Service\ApiClient\MockYahooFinanceClient: '@App\Service\ApiClient\MockYahooFinanceClient'
145+
App\Service\ApiClient\NewsApiClient: '@App\Service\ApiClient\NewsApiClient'
146+
App\Service\ApiClient\MockNewsApiClient: '@App\Service\ApiClient\MockNewsApiClient'
147+
App\Service\ApiClient\SecApiClient: '@App\Service\ApiClient\SecApiClient'
148+
App\Service\ApiClient\MockSecApiClient: '@App\Service\ApiClient\MockSecApiClient'
149+
66150
App\Service\ApiClient\StockClientsFactory:
67-
arguments:
68-
$locator: !service_locator
69-
# List the services this factory needs access to
70-
- App\Service\ApiClient\AlphaVantageClient
71-
- App\Service\ApiClient\MockAlphaVantageClient
72-
- App\Service\ApiClient\YahooFinanceClient
73-
- App\Service\ApiClient\MockYahooFinanceClient
74-
- App\Service\ApiClient\NewsApiClient
75-
- App\Service\ApiClient\MockNewsApiClient
76-
- App\Service\ApiClient\SecApiClient
77-
- App\Service\ApiClient\MockSecApiClient
151+
public: true
152+
arguments:
153+
$locator: '@App\Service\ApiClient\StockClientsFactory.locator'
78154
$useMockData: '%env(bool:USE_MOCK_DATA)%'
79-
tags: ['container.service_subscriber']
155+
tags: ['container.service_subscriber']
80156

81157
# --- Service Definitions that USE the API Clients ---
82158
# Inject the FACTORIES now, not the clients directly.
@@ -127,4 +203,10 @@ services:
127203
arguments:
128204
$projectDir: '%kernel.project_dir%'
129205

130-
# Cache definition should remain in stock_api.yaml or cache.yaml
206+
# Define the stock data cache service
207+
stock_data.cache:
208+
class: Symfony\Component\Cache\Adapter\FilesystemAdapter
209+
arguments:
210+
$namespace: 'stock_data'
211+
$defaultLifetime: 3600
212+
$directory: '%kernel.cache_dir%/stock_data'

0 commit comments

Comments
 (0)