Skip to content

Commit 22e5ba9

Browse files
committed
Refactor to single implementation for upserting logic
1 parent 2935935 commit 22e5ba9

3 files changed

Lines changed: 60 additions & 65 deletions

File tree

app/Http/Controllers/AttendanceController.php

Lines changed: 2 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@
1212
use App\Jobs\PushToJedi;
1313
use App\Models\AccessCard;
1414
use App\Models\Attendance;
15-
use App\Models\Device;
1615
use App\Models\Team;
1716
use App\Models\User;
1817
use App\Util\AuthorizeInclude;
18+
use App\Util\DeviceInventory;
1919
use Illuminate\Database\Eloquent\Builder;
2020
use Illuminate\Http\JsonResponse;
2121
use Illuminate\Http\Request;
@@ -90,37 +90,7 @@ public function store(StoreAttendanceRequest $request): JsonResponse
9090
// Upsert the device if a reader is provided
9191
$device = null;
9292
if ($request->has('reader')) {
93-
$reader = $request->input('reader');
94-
$recordingUser = $request->user();
95-
96-
if (! $recordingUser instanceof User) {
97-
return response()->json([
98-
'status' => 'error',
99-
'message' => 'A user token is required.',
100-
], 401);
101-
}
102-
103-
$ipAddress = $request->ip();
104-
105-
if ($ipAddress === null) {
106-
return response()->json([
107-
'status' => 'error',
108-
'message' => 'last_seen_ip_address is required.',
109-
], 422);
110-
}
111-
112-
$device = Device::updateOrCreate(
113-
['serial_number' => $reader['serial_number']],
114-
[
115-
'hardware_version' => $reader['hardware_version'],
116-
'software_version' => $reader['software_version'],
117-
'firmware_version' => $reader['firmware_version'],
118-
'battery_percentage' => $reader['battery_percentage'],
119-
'last_seen_user_id' => $recordingUser->id,
120-
'last_seen_at' => now(),
121-
'last_seen_ip_address' => $ipAddress,
122-
]
123-
);
93+
$device = DeviceInventory::upsert($request, $request->input('reader'));
12494
}
12595

12696
$attendanceData = $request->validated();

app/Http/Controllers/DeviceController.php

Lines changed: 2 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@
66

77
use App\Http\Requests\StoreDeviceRequest;
88
use App\Http\Resources\Device as DeviceResource;
9-
use App\Models\Device;
10-
use App\Models\User;
9+
use App\Util\DeviceInventory;
1110
use Illuminate\Http\JsonResponse;
1211
use Illuminate\Routing\Controllers\HasMiddleware;
1312
use Illuminate\Routing\Controllers\Middleware;
@@ -27,37 +26,7 @@ public static function middleware(): array
2726
*/
2827
public function inventory(StoreDeviceRequest $request): JsonResponse
2928
{
30-
$user = $request->user();
31-
32-
if (! $user instanceof User) {
33-
return response()->json([
34-
'status' => 'error',
35-
'message' => 'A user token is required.',
36-
], 401);
37-
}
38-
39-
$ipAddress = $request->ip();
40-
41-
if ($ipAddress === null) {
42-
return response()->json([
43-
'status' => 'error',
44-
'message' => 'last_seen_ip_address is required.',
45-
], 422);
46-
}
47-
48-
$validated = $request->validated();
49-
50-
$device = Device::updateOrCreate(
51-
['serial_number' => $validated['serial_number']],
52-
array_merge(
53-
$validated,
54-
[
55-
'last_seen_user_id' => $user->id,
56-
'last_seen_at' => now(),
57-
'last_seen_ip_address' => $ipAddress,
58-
]
59-
)
60-
);
29+
$device = DeviceInventory::upsert($request, $request->validated());
6130

6231
$code = $device->wasRecentlyCreated ? 201 : 200;
6332

app/Util/DeviceInventory.php

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Util;
6+
7+
use App\Models\Device;
8+
use App\Models\User;
9+
use Illuminate\Http\Exceptions\HttpResponseException;
10+
use Illuminate\Http\Request;
11+
12+
class DeviceInventory
13+
{
14+
/**
15+
* Upsert a Device from an inventory report.
16+
*
17+
* Validates the requester is a User and the request has an IP address,
18+
* then updates or creates the device with the provided data and request metadata.
19+
*
20+
* @param array<string, string|int> $data
21+
*
22+
* @throws HttpResponseException
23+
*/
24+
public static function upsert(Request $request, array $data): Device
25+
{
26+
$user = $request->user();
27+
28+
if (! $user instanceof User) {
29+
throw new HttpResponseException(response()->json([
30+
'status' => 'error',
31+
'message' => 'A user token is required.',
32+
], 401));
33+
}
34+
35+
$ipAddress = $request->ip();
36+
37+
if ($ipAddress === null) {
38+
throw new HttpResponseException(response()->json([
39+
'status' => 'error',
40+
'message' => 'last_seen_ip_address is required.',
41+
], 422));
42+
}
43+
44+
return Device::updateOrCreate(
45+
['serial_number' => $data['serial_number']],
46+
array_merge(
47+
$data,
48+
[
49+
'last_seen_user_id' => $user->id,
50+
'last_seen_at' => now(),
51+
'last_seen_ip_address' => $ipAddress,
52+
]
53+
)
54+
);
55+
}
56+
}

0 commit comments

Comments
 (0)