inspiren-sem-tool/app/Http/Controllers/GoogleController.php
brian-inspiren 221d3f8173
Some checks failed
linter / quality (push) Has been cancelled
tests / ci (push) Has been cancelled
feat: sem codebase
2026-05-21 11:28:03 +08:00

87 lines
3.0 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\Client;
use App\Services\GoogleAdsService;
use App\Services\UserHierarchyService;
use Inertia\Inertia;
use Inertia\Response;
// use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Log;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Carbon\Carbon;
class GoogleController extends Controller
{
protected $adsService;
public function __construct(
GoogleAdsService $adsService,
private UserHierarchyService $hierarchyService,
)
{
$this->adsService = $adsService;
}
public function campaigns($id)
{
$campaigns = $this->adsService->listCampaigns($id);
return response()->json($campaigns);
}
public function listCampaignsMetrics(Request $request)
{
$clientCustomerId = $request->clientCustomerId;
$startDate = $request->startDate;
$endDate = $request->endDate;
$client = Client::where('customer_id', $clientCustomerId)->firstOrFail();
abort_unless($this->hierarchyService->canViewClient(Auth::user(), $client), 403);
$campaigns = $this->adsService->listCampaigns($clientCustomerId);
$campaignsWithMetrics = [];
foreach ($campaigns as $campaign) {
$metrics = $this->adsService->listCampaignsMetrics(
$clientCustomerId,
$campaign['id'],
$startDate,
$endDate
);
$campaign['total_actual_spend'] = 0;
$campaign['total_impressions'] = 0;
$campaign['total_clicks'] = 0;
$campaign['metrics'] = [];
foreach ($metrics as $metric) {
$campaign['total_actual_spend'] += $metric['actual_spend'] ?? 0;
$campaign['total_impressions'] += $metric['impressions'] ?? 0;
$campaign['total_clicks'] += $metric['clicks'] ?? 0;
}
// CPC calculation
$campaign['cpc'] = $campaign['total_clicks'] > 0
? $campaign['total_actual_spend'] / $campaign['total_clicks']
: 0;
$campaign['total_actual_spend'] = number_format($campaign['total_actual_spend'], 2, '.', '');
$campaign['metrics'] = $metrics;
$campaignsWithMetrics[] = $campaign;
}
$totalSpend = array_sum(array_column($campaignsWithMetrics, 'total_actual_spend'));
$totalClicks = array_sum(array_column($campaignsWithMetrics, 'total_clicks'));
return response()->json([
'campaigns' => $campaignsWithMetrics,
'summary' => [
'total_actual_spend' => number_format(array_sum(array_column($campaignsWithMetrics, 'total_actual_spend')), 2, '.', ''),
'total_impressions' => array_sum(array_column($campaignsWithMetrics, 'total_impressions')),
'total_clicks' => array_sum(array_column($campaignsWithMetrics, 'total_clicks')),
]
]);
}
}