namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use App\Models\ApiProvider; use App\Models\ProviderService; use Illuminate\Http\Request; use Illuminate\Support\Str; class ProviderController extends Controller { public function index(Request $request) { $query = ApiProvider::withCount('services'); // Search if ($request->has('search')) { $search = $request->search; $query->where('name', 'like', "%{$search}%") ->orWhere('code', 'like', "%{$search}%"); } // Filter by status if ($request->has('status') && $request->status != 'all') { $query->where('status', $request->status); } $providers = $query->orderBy('name')->paginate(20); return view('admin.providers.index', compact('providers')); } public function create() { return view('admin.providers.create'); } public function store(Request $request) { $request->validate([ 'name' => 'required|string|max:100', 'code' => 'required|string|max:50|unique:api_providers', 'api_url' => 'required|url|max:255', 'api_key' => 'required|string', 'api_secret' => 'nullable|string', 'api_version' => 'nullable|string|max:20', 'api_type' => 'required|in:standard,advanced,custom', 'profit_type' => 'required|in:fixed,percentage', 'profit_value' => 'required|numeric|min:0', 'rate_multiplier' => 'required|numeric|min:0.1|max:10', 'timeout' => 'required|integer|min:5|max:300', 'retry_attempts' => 'required|integer|min:0|max:10', 'status' => 'required|in:active,inactive,maintenance', 'auto_sync' => 'boolean', 'sync_interval' => 'required_if:auto_sync,true|integer|min:5|max:1440', ]); $data = $request->all(); // Encrypt sensitive data $data['api_key'] = encrypt($request->api_key); if ($request->api_secret) { $data['api_secret'] = encrypt($request->api_secret); } $provider = ApiProvider::create($data); // Log activity auth()->guard('admin')->user()->logActivity( 'Created API provider: ' . $provider->name, ['provider_id' => $provider->id] ); return redirect()->route('admin.providers.index') ->with('success', 'API provider created successfully.'); } public function edit(ApiProvider $provider) { // Decrypt sensitive data for form $provider->api_key = decrypt($provider->api_key); if ($provider->api_secret) { $provider->api_secret = decrypt($provider->api_secret); } return view('admin.providers.edit', compact('provider')); } public function update(Request $request, ApiProvider $provider) { $request->validate([ 'name' => 'required|string|max:100', 'code' => 'required|string|max:50|unique:api_providers,code,' . $provider->id, 'api_url' => 'required|url|max:255', 'api_key' => 'required|string', 'api_secret' => 'nullable|string', 'api_version' => 'nullable|string|max:20', 'api_type' => 'required|in:standard,advanced,custom', 'profit_type' => 'required|in:fixed,percentage', 'profit_value' => 'required|numeric|min:0', 'rate_multiplier' => 'required|numeric|min:0.1|max:10', 'timeout' => 'required|integer|min:5|max:300', 'retry_attempts' => 'required|integer|min:0|max:10', 'status' => 'required|in:active,inactive,maintenance', 'auto_sync' => 'boolean', 'sync_interval' => 'required_if:auto_sync,true|integer|min:5|max:1440', ]); $data = $request->all(); // Encrypt sensitive data $data['api_key'] = encrypt($request->api_key); if ($request->api_secret) { $data['api_secret'] = encrypt($request->api_secret); } $provider->update($data); // Log activity auth()->guard('admin')->user()->logActivity( 'Updated API provider: ' . $provider->name, ['provider_id' => $provider->id] ); return redirect()->route('admin.providers.index') ->with('success', 'API provider updated successfully.'); } public function destroy(ApiProvider $provider) { // Check if provider has services if ($provider->services()->exists()) { return back()->with('error', 'Cannot delete provider with linked services.'); } $name = $provider->name; $provider->delete(); // Log activity auth()->guard('admin')->user()->logActivity( 'Deleted API provider: ' . $name, ['provider_id' => $provider->id] ); return redirect()->route('admin.providers.index') ->with('success', 'API provider deleted successfully.'); } public function checkBalance(ApiProvider $provider) { try { // This would call API to check balance // $balance = $this->apiService->checkBalance($provider); // For demo purposes $balance = rand(100, 1000) . '.' . rand(10, 99); $provider->balance = $balance; $provider->balance_updated_at = now(); $provider->save(); return response()->json([ 'success' => true, 'balance' => $balance ]); } catch (\Exception $e) { return response()->json([ 'success' => false, 'message' => $e->getMessage() ], 500); } } public function syncServices(ApiProvider $provider) { try { // Dispatch job to sync services // SyncProviderServicesJob::dispatch($provider); return response()->json([ 'success' => true, 'message' => 'Service sync started. This may take a few minutes.' ]); } catch (\Exception $e) { return response()->json([ 'success' => false, 'message' => $e->getMessage() ], 500); } } public function services(ApiProvider $provider, Request $request) { $query = ProviderService::where('api_provider_id', $provider->id) ->with('service'); // Search if ($request->has('search')) { $search = $request->search; $query->where(function($q) use ($search) { $q->where('provider_service_id', 'like', "%{$search}%") ->orWhere('provider_service_name', 'like', "%{$search}%"); }); } // Filter by status if ($request->has('status') && $request->status != 'all') { $query->where('status', $request->status); } $services = $query->paginate(20); return view('admin.providers.services', compact('provider', 'services')); } public function updateServiceMapping(Request $request, ProviderService $providerService) { $request->validate([ 'service_id' => 'required|exists:services,id', 'our_price' => 'required|numeric|min:0', 'profit_type' => 'required|in:fixed,percentage', 'profit_value' => 'required|numeric|min:0', ]); $providerService->update([ 'service_id' => $request->service_id, 'our_price' => $request->our_price, 'profit_type' => $request->profit_type, 'profit_value' => $request->profit_value, ]); return response()->json(['success' => true]); } public function logs(ApiProvider $provider) { $logs = $provider->apiLogs()->latest()->paginate(50); return view('admin.providers.logs', compact('provider', 'logs')); } public function toggleStatus(ApiProvider $provider) { $provider->update([ 'status' => $provider->status === 'active' ? 'inactive' : 'active' ]); return response()->json([ 'success' => true, 'status' => $provider->status ]); } }