From 684a2901c43c353ded549e61f31af17f58527c0e Mon Sep 17 00:00:00 2001 From: Benjamin Nussbaum Date: Sat, 26 Apr 2025 17:19:44 +0200 Subject: [PATCH] feat(#13): add device information endpoint --- .../views/livewire/plugins/api.blade.php | 15 +++++ routes/api.php | 30 +++++++++ tests/Feature/Api/DeviceEndpointsTest.php | 66 +++++++++++++++++++ 3 files changed, 111 insertions(+) diff --git a/resources/views/livewire/plugins/api.blade.php b/resources/views/livewire/plugins/api.blade.php index 6fe1eff..08bcafc 100644 --- a/resources/views/livewire/plugins/api.blade.php +++ b/resources/views/livewire/plugins/api.blade.php @@ -74,5 +74,20 @@ new class extends Component { + +
+

+ GET + {{ route('display.status') }}?device_id={{ $selected_device }} +

+
+

Headers

+
Authorization Bearer {{$token ?? '**********'}} + + Regenerate Token + +
+
+
diff --git a/routes/api.php b/routes/api.php index 9a6762d..bdc4c94 100644 --- a/routes/api.php +++ b/routes/api.php @@ -201,6 +201,36 @@ Route::post('/display/update', function (Request $request) { ->name('display.update') ->middleware('auth:sanctum', 'ability:update-screen'); +Route::get('/display/status', function (Request $request) { + $request->validate([ + 'device_id' => 'required|exists:devices,id', + ]); + + $deviceId = $request['device_id']; + abort_unless($request->user()->devices->contains($deviceId), 403); + + $device = Device::where('id', $deviceId)->get()->first(); + + return response()->json( + $device->only([ + 'id', + 'mac_address', + 'name', + 'friendly_id', + 'last_rssi_level', + 'last_battery_voltage', + 'last_firmware_version', + 'battery_percent', + 'wifi_strengh', + 'current_screen_image', + 'default_refresh_interval', + 'updated_at', + ]), + ); +}) + ->name('display.status') + ->middleware('auth:sanctum'); + Route::post('custom_plugins/{plugin_uuid}', function (string $plugin_uuid) { $plugin = \App\Models\Plugin::where('uuid', $plugin_uuid)->firstOrFail(); diff --git a/tests/Feature/Api/DeviceEndpointsTest.php b/tests/Feature/Api/DeviceEndpointsTest.php index b10c2f6..09643f2 100644 --- a/tests/Feature/Api/DeviceEndpointsTest.php +++ b/tests/Feature/Api/DeviceEndpointsTest.php @@ -243,3 +243,69 @@ test('update_firmware flag is only returned once', function () { $device->refresh(); expect($device->proxy_cloud_response['update_firmware'])->toBeFalse(); }); + +test('authenticated user can fetch device status', function () { + $user = User::factory()->create(); + $device = Device::factory()->create([ + 'user_id' => $user->id, + 'mac_address' => '00:11:22:33:44:55', + 'name' => 'Test Device', + 'friendly_id' => 'test-device', + 'last_rssi_level' => -70, + 'last_battery_voltage' => 3.8, + 'last_firmware_version' => '1.0.0', + 'current_screen_image' => 'test-image', + 'default_refresh_interval' => 900, + ]); + + Sanctum::actingAs($user); + + $response = $this->getJson('/api/display/status?device_id='.$device->id); + + $response->assertOk() + ->assertJson([ + 'id' => $device->id, + 'mac_address' => '00:11:22:33:44:55', + 'name' => 'Test Device', + 'friendly_id' => 'test-device', + 'last_rssi_level' => -70, + 'last_battery_voltage' => 3.8, + 'last_firmware_version' => '1.0.0', + 'battery_percent' => 67, + 'wifi_strength' => 2, + 'current_screen_image' => 'test-image', + 'default_refresh_interval' => 900, + ]); +}); + +test('user cannot fetch status for devices they do not own', function () { + $user = User::factory()->create(); + $otherUser = User::factory()->create(); + $device = Device::factory()->create(['user_id' => $otherUser->id]); + + Sanctum::actingAs($user); + + $response = $this->getJson('/api/display/status?device_id='.$device->id); + + $response->assertForbidden(); +}); + +test('display status endpoint requires device_id parameter', function () { + $user = User::factory()->create(); + Sanctum::actingAs($user); + + $response = $this->getJson('/api/display/status'); + + $response->assertStatus(422) + ->assertJsonValidationErrors(['device_id']); +}); + +test('display status endpoint requires valid device_id', function () { + $user = User::factory()->create(); + Sanctum::actingAs($user); + + $response = $this->getJson('/api/display/status?device_id=999'); + + $response->assertStatus(422) + ->assertJsonValidationErrors(['device_id']); +});