Viewing file: HilltopAdsService.php (8.05 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?php
namespace App\Services;
use App\Models\Campaign; use App\Models\CampaignPerformance; use Illuminate\Support\Facades\Http; use Illuminate\Support\Facades\Log; use Carbon\Carbon;
class HilltopAdsService { protected $baseUrl; protected $apiKey;
public function __construct() { $this->baseUrl = env('HILLTOP_API_URL', 'https://api.hilltopads.com'); $this->apiKey = env('HILLTOP_API_KEY', ''); }
/** * Fetch campaign performance data from HilltopAds API * * @param string $hilltopCampaignId * @param string $dateRange (e.g., '7d', '30d', '90d') * @return array|null */ public function fetchCampaignPerformance($hilltopCampaignId, $dateRange = '7d') { try { $dates = $this->parseDateRange($dateRange); // TODO: Replace with actual HilltopAds API endpoint $response = Http::withHeaders([ 'Authorization' => 'Bearer ' . $this->apiKey, 'Accept' => 'application/json', ])->get("{$this->baseUrl}/campaigns/{$hilltopCampaignId}/performance", [ 'start_date' => $dates['start'], 'end_date' => $dates['end'], ]);
if ($response->successful()) { return $response->json(); }
Log::error('HilltopAds API Error', [ 'campaign_id' => $hilltopCampaignId, 'status' => $response->status(), 'response' => $response->body() ]);
return null; } catch (\Exception $e) { Log::error('HilltopAds API Exception', [ 'campaign_id' => $hilltopCampaignId, 'error' => $e->getMessage() ]); return null; } }
/** * Fetch performance data for all campaigns * * @param string $dateRange * @return array */ public function fetchAllCampaignsPerformance($dateRange = '7d') { try { $dates = $this->parseDateRange($dateRange); // TODO: Replace with actual HilltopAds API endpoint $response = Http::withHeaders([ 'Authorization' => 'Bearer ' . $this->apiKey, 'Accept' => 'application/json', ])->get("{$this->baseUrl}/campaigns/performance", [ 'start_date' => $dates['start'], 'end_date' => $dates['end'], ]);
if ($response->successful()) { return $response->json(); }
return []; } catch (\Exception $e) { Log::error('HilltopAds API Exception (All Campaigns)', [ 'error' => $e->getMessage() ]); return []; } }
/** * Sync campaign data to database * * @param int $campaignId - Local campaign ID * @param string $dateRange * @return bool */ public function syncCampaignData($campaignId, $dateRange = '7d') { $campaign = Campaign::find($campaignId); if (!$campaign) { Log::error('Campaign not found', ['campaign_id' => $campaignId]); return false; }
// Get HilltopAds campaign ID from campaign metadata // For now, we'll use a mock approach - you may need to add a hilltop_campaign_id field to campaigns table $hilltopCampaignId = $campaign->id; // Replace with actual mapping
$performanceData = $this->fetchCampaignPerformance($hilltopCampaignId, $dateRange);
if (!$performanceData) { return false; }
// Parse and store the performance data // This structure depends on the actual HilltopAds API response $this->storePerformanceData($campaign, $performanceData);
return true; }
/** * Store performance data in database * * @param Campaign $campaign * @param array $performanceData */ protected function storePerformanceData($campaign, $performanceData) { // This is a sample implementation - adjust based on actual API response structure // Example: If API returns daily breakdown if (isset($performanceData['data'])) { foreach ($performanceData['data'] as $dayData) { $date = $dayData['date'] ?? now()->toDateString(); CampaignPerformance::updateOrCreate( [ 'campaign_id' => $campaign->id, 'date' => $date, 'country' => $dayData['country'] ?? null, 'device_type' => $dayData['device_type'] ?? null, ], [ 'spend' => $dayData['spend'] ?? 0, 'impressions' => $dayData['impressions'] ?? 0, 'clicks' => $dayData['clicks'] ?? 0, 'conversions' => $dayData['conversions'] ?? 0, 'ctr' => $dayData['ctr'] ?? 0, 'revenue' => $dayData['revenue'] ?? 0, 'roi' => $dayData['roi'] ?? 0, 'hilltop_campaign_id' => $dayData['hilltop_campaign_id'] ?? null, ] ); } } }
/** * Generate mock data for testing (when API is not available) * * @param int $campaignId * @param string $dateRange */ public function generateMockData($campaignId, $dateRange = '7d') { $campaign = Campaign::find($campaignId); if (!$campaign) { return; }
$dates = $this->parseDateRange($dateRange); $startDate = Carbon::parse($dates['start']); $endDate = Carbon::parse($dates['end']);
$countries = ['United States', 'Canada', 'United Kingdom', 'Australia', 'Germany']; $devices = ['Desktop', 'Mobile', 'Tablet'];
while ($startDate->lte($endDate)) { // Generate aggregated data for the day $impressions = rand(5000, 50000); $clicks = rand(250, 2500); $conversions = rand(25, 250); $spend = rand(500, 5000); $revenue = $spend * rand(15, 40) / 10; // Pick a random country and device for this day's record $country = $countries[array_rand($countries)]; $device = $devices[array_rand($devices)]; CampaignPerformance::updateOrCreate( [ 'campaign_id' => $campaign->id, 'date' => $startDate->toDateString(), ], [ 'spend' => $spend, 'impressions' => $impressions, 'clicks' => $clicks, 'conversions' => $conversions, 'ctr' => round(($clicks / $impressions) * 100, 2), 'revenue' => $revenue, 'roi' => round($revenue / $spend, 2), 'country' => $country, 'device_type' => $device, 'hilltop_campaign_id' => 'HT-' . $campaign->id, ] ); $startDate->addDay(); } }
/** * Parse date range string to start and end dates * * @param string $dateRange * @return array */ protected function parseDateRange($dateRange) { $end = Carbon::now(); switch ($dateRange) { case '24h': $start = Carbon::now()->subDay(); break; case '7d': $start = Carbon::now()->subDays(7); break; case '30d': $start = Carbon::now()->subDays(30); break; case '90d': $start = Carbon::now()->subDays(90); break; default: $start = Carbon::now()->subDays(7); }
return [ 'start' => $start->toDateString(), 'end' => $end->toDateString(), ]; } }
|