Skip to content

Commit 1679656

Browse files
authored
Merge pull request #212 from fleetbase/feature/fix-request-timezone-precedence
Fix request timezone precedence during user enrichment
2 parents 4ec1400 + 974021c commit 1679656

4 files changed

Lines changed: 88 additions & 5 deletions

File tree

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "fleetbase/core-api",
3-
"version": "1.6.45",
3+
"version": "1.6.46",
44
"description": "Core Framework and Resources for Fleetbase API",
55
"keywords": [
66
"fleetbase",

src/Models/User.php

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use Fleetbase\Notifications\UserCreated;
88
use Fleetbase\Notifications\UserInvited;
99
use Fleetbase\Support\NotificationRegistry;
10+
use Fleetbase\Support\Timezone;
1011
use Fleetbase\Support\Utils;
1112
use Fleetbase\Traits\ClearsHttpCache;
1213
use Fleetbase\Traits\Expandable;
@@ -1220,7 +1221,14 @@ public function isNotVerified(): bool
12201221
*/
12211222
public static function applyUserInfoFromRequest($request, array $attributes = []): array
12221223
{
1223-
$info = null;
1224+
$info = null;
1225+
$timezone = Timezone::firstValid([
1226+
$request->input('timezone'),
1227+
$request->input('whois.timezone'),
1228+
$request->input('whois.time_zone.name'),
1229+
data_get($attributes, 'timezone'),
1230+
]);
1231+
12241232
// Lookup user default details
12251233
try {
12261234
$info = \Fleetbase\Support\Http::lookupIp($request);
@@ -1230,10 +1238,16 @@ public static function applyUserInfoFromRequest($request, array $attributes = []
12301238
if ($info) {
12311239
$attributes['country'] = data_get($info, 'country_code');
12321240
$attributes['ip_address'] = data_get($info, 'ip', $request->ip());
1233-
$tzInfo = data_get($info, 'time_zone.name', $request->input('timezone'));
1234-
if ($tzInfo) {
1235-
$attributes['timezone'] = $tzInfo;
1241+
$timezone = $timezone ?: Timezone::firstValid([
1242+
data_get($info, 'time_zone.name'),
1243+
data_get($info, 'timezone'),
1244+
data_get($info, 'timezone_name'),
1245+
]);
1246+
1247+
if ($timezone) {
1248+
$attributes['timezone'] = $timezone;
12361249
}
1250+
12371251
$attributes['meta'] = [
12381252
'areacode' => data_get($info, 'calling_code'),
12391253
'currency' => data_get($info, 'currency.code'),
@@ -1245,6 +1259,10 @@ public static function applyUserInfoFromRequest($request, array $attributes = []
12451259
];
12461260
}
12471261

1262+
if ($timezone) {
1263+
$attributes['timezone'] = $timezone;
1264+
}
1265+
12481266
return $attributes;
12491267
}
12501268

src/Support/Timezone.php

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
namespace Fleetbase\Support;
4+
5+
class Timezone
6+
{
7+
/**
8+
* Return the first valid IANA timezone from a list of candidates.
9+
*/
10+
public static function firstValid(array $candidates): ?string
11+
{
12+
foreach ($candidates as $candidate) {
13+
if (!is_string($candidate) || trim($candidate) === '') {
14+
continue;
15+
}
16+
17+
$candidate = trim($candidate);
18+
if (in_array($candidate, \DateTimeZone::listIdentifiers(), true)) {
19+
return $candidate;
20+
}
21+
}
22+
23+
return null;
24+
}
25+
}

tests/Unit/TimezoneTest.php

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
<?php
2+
3+
use Fleetbase\Support\Timezone;
4+
5+
test('first valid timezone preserves request precedence order', function () {
6+
$timezone = Timezone::firstValid([
7+
'America/New_York',
8+
'Asia/Singapore',
9+
]);
10+
11+
expect($timezone)->toBe('America/New_York');
12+
});
13+
14+
test('first valid timezone accepts nested whois timezone candidates', function () {
15+
$timezone = Timezone::firstValid([
16+
null,
17+
'Europe/London',
18+
'Asia/Singapore',
19+
]);
20+
21+
expect($timezone)->toBe('Europe/London');
22+
});
23+
24+
test('first valid timezone ignores invalid values', function () {
25+
$timezone = Timezone::firstValid([
26+
'Not/A_Timezone',
27+
'Also/Invalid',
28+
]);
29+
30+
expect($timezone)->toBeNull();
31+
});
32+
33+
test('first valid timezone does not default to application timezone', function () {
34+
$timezone = Timezone::firstValid([
35+
null,
36+
'',
37+
]);
38+
39+
expect($timezone)->toBeNull();
40+
});

0 commit comments

Comments
 (0)