feat: add screens endpoint
Some checks failed
tests / ci (push) Has been cancelled

* according to https://docs.usetrmnl.com/go/diy/byos#screens
This commit is contained in:
Benjamin Nussbaum 2025-07-24 20:17:34 +02:00
parent 4b88726c96
commit eacb891cba
2 changed files with 68 additions and 0 deletions

View file

@ -276,6 +276,34 @@ Route::post('/display/update', function (Request $request) {
->name('display.update')
->middleware('auth:sanctum', 'ability:update-screen');
Route::post('/screens', function (Request $request) {
$mac_address = $request->header('id');
$access_token = $request->header('access-token');
$device = Device::where('mac_address', $mac_address)
->where('api_key', $access_token)
->first();
if (! $device) {
return response()->json([
'message' => 'MAC Address not registered or invalid access token',
], 404);
}
$request->validate([
'image' => 'array|required',
'image.content' => 'string|required',
'image.file_name' => 'string',
]);
$content = $request['image']['content'];
$view = Blade::render($content);
GenerateScreenJob::dispatchSync($device->id, null, $view);
return response()->json([
'message' => 'success',
]);
})->name('screens.update');
Route::get('/display/status', function (Request $request) {
$request->validate([
'device_id' => 'required|exists:devices,id',

View file

@ -1,5 +1,6 @@
<?php
use App\Jobs\GenerateScreenJob;
use App\Models\Device;
use App\Models\Playlist;
use App\Models\PlaylistItem;
@ -838,3 +839,42 @@ test('device returns sleep.png and correct refresh time when paused', function (
expect($json['image_url'])->toContain('sleep.png');
expect($json['refresh_rate'])->toBeLessThanOrEqual(3600); // ~60 min
});
test('screens endpoint accepts nullable file_name', function () {
Queue::fake();
$device = Device::factory()->create([
'mac_address' => '00:11:22:33:44:55',
'api_key' => 'test-api-key',
]);
$response = $this->withHeaders([
'id' => $device->mac_address,
'access-token' => $device->api_key,
])->post('/api/screens', [
'image' => [
'content' => '<div>Test content</div>',
],
]);
$response->assertOk();
Queue::assertPushed(GenerateScreenJob::class);
});
test('screens endpoint returns 404 for invalid device credentials', function () {
$response = $this->withHeaders([
'id' => 'invalid-mac',
'access-token' => 'invalid-key',
])->post('/api/screens', [
'image' => [
'content' => '<div>Test content</div>',
'file_name' => 'test.blade.php',
],
]);
$response->assertNotFound()
->assertJson([
'message' => 'MAC Address not registered or invalid access token',
]);
});