From b350d6ad4a66dddc964a21ecf1f2b7734f981fbe Mon Sep 17 00:00:00 2001 From: armiejean Date: Mon, 19 May 2025 13:00:00 +0800 Subject: [PATCH] station page export csv works --- app/Http/Controllers/ReportsController.php | 125 +++++++++++------- .../reports/station-rating-report.blade.php | 33 ++--- routes/web.php | 2 +- 3 files changed, 96 insertions(+), 64 deletions(-) diff --git a/app/Http/Controllers/ReportsController.php b/app/Http/Controllers/ReportsController.php index 4bba417..98995f2 100644 --- a/app/Http/Controllers/ReportsController.php +++ b/app/Http/Controllers/ReportsController.php @@ -16,63 +16,67 @@ class ReportsController extends Controller $this->apiBaseUrl = env('EXTERNAL_API_URL', 'http://localhost:8081/api/'); } - private function makeApiRequest($endpoint, $params) -{ - try { - $user = Session::get('user'); - $accessToken = $user['access_token'] ?? null; + private function makeApiRequest($endpoint, $params, $isDownload = false) + { + try { + $user = Session::get('user'); + $accessToken = $user['access_token'] ?? null; - if (!$accessToken) { - Log::info("No access token found, redirecting to login from {$endpoint}"); - return redirect()->route('login')->with('error', 'Please log in to view reports.'); - } + if (!$accessToken) { + Log::info("No access token found, redirecting to login from {$endpoint}"); + return redirect()->route('login')->with('error', 'Please log in to view reports.'); + } - // Ensure proper URL formation - $baseUrl = rtrim($this->apiBaseUrl, '/'); - $endpoint = ltrim($endpoint, '/'); - $fullUrl = "{$baseUrl}/{$endpoint}"; + $baseUrl = rtrim($this->apiBaseUrl, '/'); + $endpoint = ltrim($endpoint, '/'); + $fullUrl = "{$baseUrl}/{$endpoint}"; - Log::info("Making API request to: {$fullUrl}", ['params' => $params]); - $response = Http::withHeaders([ - 'Accept' => 'application/json', - 'Authorization' => 'Bearer ' . $accessToken, - ])->timeout(30)->get($fullUrl, $params); + Log::info("Making API request to: {$fullUrl}", ['params' => $params]); + $client = Http::withHeaders([ + 'Accept' => $isDownload ? 'text/csv' : 'application/json', + 'Authorization' => 'Bearer ' . $accessToken, + ])->timeout(30); - Log::info("API response status: {$response->status()}", [ - 'endpoint' => $endpoint, - 'response_body' => $response->body(), - 'headers' => $response->headers() - ]); + $response = $client->get($fullUrl, $params); - if ($response->status() === 401 || $response->status() === 403) { - Log::warning("Unauthorized or Forbidden API response for {$endpoint}", ['response' => $response->json()]); - return redirect()->route('login')->with('error', 'Your session has expired. Please log in again.'); - } - - if (!$response->successful()) { - Log::error("API request failed for {$endpoint}", [ - 'status' => $response->status(), - 'response' => $response->body(), + Log::info("API response status: {$response->status()}", [ + 'endpoint' => $endpoint, 'headers' => $response->headers() ]); + + if ($response->status() === 401 || $response->status() === 403) { + Log::warning("Unauthorized or Forbidden API response for {$endpoint}", ['response' => $response->body()]); + return redirect()->route('login')->with('error', 'Your session has expired. Please log in again.'); + } + + if (!$response->successful()) { + Log::error("API request failed for {$endpoint}", [ + 'status' => $response->status(), + 'response' => $response->body(), + 'headers' => $response->headers() + ]); + return null; + } + + if ($isDownload) { + return $response; // Return raw response for file download + } + + return $response->json(); + } catch (\Illuminate\Http\Client\ConnectionException $e) { + Log::error("Connection error during API request to {$endpoint}", [ + 'error' => $e->getMessage(), + 'params' => $params + ]); + return null; + } catch (\Exception $e) { + Log::error("Unexpected error during API request to {$endpoint}", [ + 'error' => $e->getMessage(), + 'params' => $params + ]); return null; } - - return $response->json(); - } catch (\Illuminate\Http\Client\ConnectionException $e) { - Log::error("Connection error during API request to {$endpoint}", [ - 'error' => $e->getMessage(), - 'params' => $params - ]); - return null; - } catch (\Exception $e) { - Log::error("Unexpected error during API request to {$endpoint}", [ - 'error' => $e->getMessage(), - 'params' => $params - ]); - return null; } -} public function mobileUsage(Request $request) { $params = [ @@ -258,4 +262,31 @@ class ReportsController extends Controller return view('pages.reports.top-up-usage-report', compact('topUpData', 'currentPage', 'lastPage', 'total', 'errorMessage')); } + + public function exportStationRating(Request $request) + { + $params = [ + 'date_start' => $request->input('date_start'), + 'date_end' => $request->input('date_end'), + '_search' => $request->input('_search'), + 'sorting' => $request->input('sort', 'date|desc'), + ]; + + $response = $this->makeApiRequest('cms/reportStationRatingsExport', $params, true); + + if (is_a($response, '\Illuminate\Http\RedirectResponse')) { + return $response; + } + + if (!$response) { + Log::warning("Failed to export station rating data", ['params' => $params]); + return redirect()->back()->with('error', 'Failed to export CSV.'); + } + + $filename = "reports_station_rating" . date("mdY") . ".csv"; + + return response($response->body(), 200) + ->header('Content-Type', 'text/csv') + ->header('Content-Disposition', "attachment; filename=\"$filename\""); + } } \ No newline at end of file diff --git a/resources/views/pages/reports/station-rating-report.blade.php b/resources/views/pages/reports/station-rating-report.blade.php index d761036..7b8d1b2 100644 --- a/resources/views/pages/reports/station-rating-report.blade.php +++ b/resources/views/pages/reports/station-rating-report.blade.php @@ -70,20 +70,21 @@ } - + @endsection \ No newline at end of file diff --git a/routes/web.php b/routes/web.php index d19ece1..c84a611 100644 --- a/routes/web.php +++ b/routes/web.php @@ -202,7 +202,7 @@ Route::get('/mobile-usage-report', [ReportsController::class, 'mobileUsage'])->n Route::get('/registration-report', [ReportsController::class, 'registration'])->name('registration-report'); Route::get('/station-rating-report', [ReportsController::class, 'stationRating'])->name('station-rating-report'); Route::get('/top-up-usage-report', [ReportsController::class, 'topUp'])->name('top-up-usage-report'); - +Route::get('/station-rating-reportExport', [ReportsController::class, 'exportStationRating'])->name('station-rating-reportExport'); //Station Route::get('/station-management', [StationController::class, 'index'])->name('stations'); Route::get('/stations/create', [StationController::class, 'create'])->name('stations.create');