Viewing file: CampaignController.php (3.92 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?php
namespace App\Http\Controllers;
use App\Models\Campaign; use App\Models\AuditLog; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth;
class CampaignController extends Controller { public function index() { return response()->json(Auth::user()->campaigns()->latest()->get()); }
public function store(Request $request) { $validated = $request->validate([ 'name' => 'required|string|max:255', 'landing_url' => 'required|url', 'type' => 'required|string', 'description' => 'nullable|string', 'creatives' => 'nullable|array', 'geo_targeting' => 'nullable|array', 'device_targeting' => 'nullable|array', 'daily_budget' => 'nullable|numeric', 'total_budget' => 'nullable|numeric', 'bidding_strategy' => 'nullable|string', ]);
$campaign = Auth::user()->campaigns()->create($validated);
AuditLog::log('Campaign Created', 'campaign', $campaign->id, ['name' => $campaign->name]);
return response()->json($campaign, 201); } public function show($id) { $campaign = Auth::user()->campaigns() ->with(['performances', 'auditLogs.user']) ->findOrFail($id);
// Calculate aggregates $totalSpend = $campaign->performances->sum('spend'); $totalImpressions = $campaign->performances->sum('impressions'); $totalClicks = $campaign->performances->sum('clicks'); $totalConversions = $campaign->performances->sum('conversions');
// Calculate CTR and CPC $ctr = $totalImpressions > 0 ? ($totalClicks / $totalImpressions) * 100 : 0; $cpc = $totalClicks > 0 ? $totalSpend / $totalClicks : 0;
$campaign->setAttribute('aggregates', [ 'spend' => $totalSpend, 'impressions' => $totalImpressions, 'clicks' => $totalClicks, 'conversions' => $totalConversions, 'ctr' => round($ctr, 2), 'cpc' => round($cpc, 2), ]);
return response()->json($campaign); } public function update(Request $request, $id) { $campaign = Auth::user()->campaigns()->findOrFail($id);
$validated = $request->validate([ 'name' => 'sometimes|string|max:255', 'landing_url' => 'sometimes|url', 'type' => 'sometimes|string', 'description' => 'nullable|string', 'creatives' => 'nullable|array', 'geo_targeting' => 'nullable|array', 'device_targeting' => 'nullable|array', 'daily_budget' => 'nullable|numeric', 'total_budget' => 'nullable|numeric', 'bidding_strategy' => 'nullable|string', 'status' => 'sometimes|string|in:active,paused,archived', ]);
$campaign->update($validated);
// Log the action // Log the action AuditLog::log('Campaign Updated', 'campaign', $campaign->id, $campaign->getChanges());
return response()->json($campaign); }
public function destroy($id) { $campaign = Auth::user()->campaigns()->findOrFail($id); $campaign->delete();
AuditLog::log('Campaign Deleted', 'campaign', $campaign->id, ['name' => $campaign->name]);
return response()->json(null, 204); }
public function duplicate($id) { $campaign = Auth::user()->campaigns()->findOrFail($id); $newCampaign = $campaign->replicate(); $newCampaign->name = $campaign->name . ' (Copy)'; $newCampaign->status = 'paused'; // Default to paused $newCampaign->created_at = now(); $newCampaign->updated_at = now(); $newCampaign->save();
// Log the action // Log the action AuditLog::log('Campaign Duplicated', 'campaign', $newCampaign->id, ['original_id' => $campaign->id]);
return response()->json($newCampaign, 201); } }
|