- BrentPriceFetcher owns ingestion (fetchFromEia / fetchFromFred, each throws on failure) - BrentPricePredictor owns prediction and marks latest brent_prices row as generated - oil:fetch command tries EIA, falls back to FRED, fails loudly if both fail - oil:predict command prompts if latest price already has a prediction; --force bypasses - add prediction_generated_at column to brent_prices - delete OilPriceService (replaced by the two focused services)
38 lines
1.1 KiB
PHP
38 lines
1.1 KiB
PHP
<?php
|
|
|
|
namespace App\Console\Commands;
|
|
|
|
use App\Services\BrentPriceFetcher;
|
|
use App\Services\BrentPriceSources\BrentPriceFetchException;
|
|
use Illuminate\Console\Attributes\Description;
|
|
use Illuminate\Console\Attributes\Signature;
|
|
use Illuminate\Console\Command;
|
|
|
|
#[Signature('oil:fetch')]
|
|
#[Description('Fetch latest Brent crude prices (EIA primary, FRED fallback)')]
|
|
class FetchOilPrices extends Command
|
|
{
|
|
public function handle(BrentPriceFetcher $fetcher): int
|
|
{
|
|
try {
|
|
$fetcher->fetchFromEia();
|
|
$this->info('Fetched Brent prices from EIA.');
|
|
|
|
return self::SUCCESS;
|
|
} catch (BrentPriceFetchException $e) {
|
|
$this->warn('EIA fetch failed: '.$e->getMessage().'. Trying FRED...');
|
|
}
|
|
|
|
try {
|
|
$fetcher->fetchFromFred();
|
|
$this->info('Fetched Brent prices from FRED.');
|
|
|
|
return self::SUCCESS;
|
|
} catch (BrentPriceFetchException $e) {
|
|
$this->error('Both EIA and FRED failed: '.$e->getMessage());
|
|
|
|
return self::FAILURE;
|
|
}
|
|
}
|
|
}
|