diff --git a/src/Http/Controllers/PlausibleEventApiController.php b/src/Http/Controllers/PlausibleEventApiController.php index 1b4ebde..9932092 100644 --- a/src/Http/Controllers/PlausibleEventApiController.php +++ b/src/Http/Controllers/PlausibleEventApiController.php @@ -3,38 +3,19 @@ namespace MattitjaAB\LaravelPlausibleProxy\Http\Controllers; use Illuminate\Http\JsonResponse; -use Illuminate\Http\Request; use Illuminate\Support\Facades\Http; -use Illuminate\Support\Facades\Validator; +use MattitjaAB\LaravelPlausibleProxy\Http\Requests\PlausibleEventRequest; class PlausibleEventApiController { - public function __invoke(Request $request): JsonResponse + public function __invoke(PlausibleEventRequest $request): JsonResponse { - $data = json_decode($request->getContent(), true); - - if (json_last_error() !== JSON_ERROR_NONE) { - return response()->json(['error' => 'Invalid JSON format'], 422); - } - - $validator = Validator::make($data, [ - 'n' => 'required|string', - 'u' => 'required|url', - 'd' => 'required|string', - 'r' => 'nullable|url', - 'm' => 'nullable|string', - 'p' => 'nullable|array', - ]); - - if ($validator->fails()) { - return response()->json(['status' => 'error', 'errors' => $validator->errors()], 422); - } - $headers = collect($request->headers->all()) ->mapWithKeys(fn ($value, $key) => [$key => is_array($value) ? implode(', ', $value) : $value]) ->all(); - Http::withHeaders($headers)->post(config('plausible-proxy.domain').'/api/event', $data); + Http::withHeaders($headers) + ->post(config('plausible-proxy.domain').'/api/event', $request->validated()); return response()->json(['status' => 'queued']); } diff --git a/src/Http/Controllers/PlausibleScriptProxyController.php b/src/Http/Controllers/PlausibleScriptProxyController.php index c120e72..810803b 100644 --- a/src/Http/Controllers/PlausibleScriptProxyController.php +++ b/src/Http/Controllers/PlausibleScriptProxyController.php @@ -2,33 +2,37 @@ namespace MattitjaAB\LaravelPlausibleProxy\Http\Controllers; +use Illuminate\Http\Client\RequestException; use Illuminate\Http\Response; use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Http; +use Illuminate\Support\Facades\Log; class PlausibleScriptProxyController { public function __invoke(): Response { - $plausibleDomain = config('plausible-proxy.domain'); + try { + $script = Cache::remember( + key: 'plausible_script_js', + ttl: now()->addHours(6), + callback: function () { + $plausibleDomain = config('plausible-proxy.domain'); - if (Cache::has('plausible_script_js')) { - return response(Cache::get('plausible_script_js')) - ->header('Content-Type', 'application/javascript') - ->header('Cache-Control', 'public, max-age=86400'); + return Http::timeout(5) + ->get("{$plausibleDomain}/js/script.js") + ->throw() + ->body(); + } + ); + } catch (RequestException $e) { + Log::error('Failed to fetch Plausible script: '.$e->getMessage()); + + return response('Error fetching Plausible script', 500); } - $response = Http::timeout(5)->get("{$plausibleDomain}/js/script.js"); - - if ($response->successful()) { - $script = $response->body(); - Cache::put('plausible_script_js', $script, now()->addHours(6)); - - return response($script) - ->header('Content-Type', 'application/javascript') - ->header('Cache-Control', 'public, max-age=86400'); - } - - return response('Error fetching Plausible script', 500); + return response($script) + ->header('Content-Type', 'application/javascript') + ->header('Cache-Control', 'public, max-age=86400'); } } \ No newline at end of file diff --git a/src/Http/Requests/PlausibleEventRequest.php b/src/Http/Requests/PlausibleEventRequest.php new file mode 100644 index 0000000..695186b --- /dev/null +++ b/src/Http/Requests/PlausibleEventRequest.php @@ -0,0 +1,25 @@ + ['required', 'string'], + 'u' => ['required', 'url'], + 'd' => ['required', 'string'], + 'r' => ['nullable', 'url'], + 'm' => ['nullable', 'string'], + 'p' => ['nullable', 'array'], + ]; + } +} \ No newline at end of file diff --git a/tests/PlausibleProxyTest.php b/tests/PlausibleProxyTest.php index be4cbc7..a28f9ec 100644 --- a/tests/PlausibleProxyTest.php +++ b/tests/PlausibleProxyTest.php @@ -46,7 +46,7 @@ it('rejects invalid event data', function () { ]); $response->assertStatus(422) - ->assertJsonStructure(['status', 'errors']); + ->assertJsonValidationErrors(['u' => 'The u field must be a valid URL.']); }); it('accepts valid event data and forwards headers', function () {