mirror of
https://github.com/usetrmnl/byos_laravel.git
synced 2026-01-14 15:37:53 +00:00
feat(#13): add device information endpoint
This commit is contained in:
parent
e27c50ed14
commit
684a2901c4
3 changed files with 111 additions and 0 deletions
|
|
@ -74,5 +74,20 @@ new class extends Component {
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="mt-6">
|
||||||
|
<p>
|
||||||
|
<flux:badge>GET</flux:badge>
|
||||||
|
<span class="ml-2 font-mono">{{ route('display.status') }}?device_id={{ $selected_device }}</span>
|
||||||
|
</p>
|
||||||
|
<div class="mt-4">
|
||||||
|
<h3 class="text-lg">Headers</h3>
|
||||||
|
<div>Authorization <span class="ml-2 font-mono">Bearer {{$token ?? '**********'}}</span>
|
||||||
|
<flux:button variant="subtle" size="xs" class="mt-2" wire:click="regenerateToken()">
|
||||||
|
Regenerate Token
|
||||||
|
</flux:button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -201,6 +201,36 @@ Route::post('/display/update', function (Request $request) {
|
||||||
->name('display.update')
|
->name('display.update')
|
||||||
->middleware('auth:sanctum', 'ability:update-screen');
|
->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) {
|
Route::post('custom_plugins/{plugin_uuid}', function (string $plugin_uuid) {
|
||||||
$plugin = \App\Models\Plugin::where('uuid', $plugin_uuid)->firstOrFail();
|
$plugin = \App\Models\Plugin::where('uuid', $plugin_uuid)->firstOrFail();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -243,3 +243,69 @@ test('update_firmware flag is only returned once', function () {
|
||||||
$device->refresh();
|
$device->refresh();
|
||||||
expect($device->proxy_cloud_response['update_firmware'])->toBeFalse();
|
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']);
|
||||||
|
});
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue