Fixed timezone issue in timentry index endpoint

This commit is contained in:
Constantin Graf
2024-04-29 17:21:57 +02:00
committed by Constantin Graf
parent 4242b23ada
commit fccd57a3f3
2 changed files with 19 additions and 11 deletions

View File

@@ -17,6 +17,7 @@ use App\Service\TimezoneService;
use Illuminate\Auth\Access\AuthorizationException; use Illuminate\Auth\Access\AuthorizationException;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Http\Resources\Json\JsonResource;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
@@ -53,11 +54,11 @@ class TimeEntryController extends Controller
->orderBy('start', 'desc'); ->orderBy('start', 'desc');
if ($request->has('before')) { if ($request->has('before')) {
$timeEntriesQuery->whereDate('start', '<', $request->input('before')); $timeEntriesQuery->where('start', '<', Carbon::createFromFormat('Y-m-d\TH:i:s\Z', $request->input('before'), 'UTC'));
} }
if ($request->has('after')) { if ($request->has('after')) {
$timeEntriesQuery->whereDate('start', '>', $request->input('after')); $timeEntriesQuery->where('start', '>', Carbon::createFromFormat('Y-m-d\TH:i:s\Z', $request->input('after'), 'UTC'));
} }
if ($request->has('active')) { if ($request->has('active')) {
@@ -105,7 +106,8 @@ class TimeEntryController extends Controller
]); ]);
$timeEntries = $timeEntriesQuery $timeEntries = $timeEntriesQuery
->limit(5000) ->limit(5000)
->whereDate('start', '=', $lastDate->toDateString()) ->where('start', '>=', $lastDate->copy()->startOfDay()->utc())
->where('start', '<=', $lastDate->copy()->endOfDay()->utc())
->get(); ->get();
} }
} }

View File

@@ -311,21 +311,27 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
'time-entries:view:own', 'time-entries:view:own',
]); ]);
$timeEntriesAfter = TimeEntry::factory()->forOrganization($data->organization)->forUser($data->user) $timeEntriesAfter = TimeEntry::factory()->forOrganization($data->organization)->forUser($data->user)
->startBetween(Carbon::now()->subDay()->startOfDay(), Carbon::now()) ->startBetween(
Carbon::now()->timezone($data->user->timezone)->subDay()->startOfDay()->utc(),
Carbon::now()->timezone($data->user->timezone)->utc()
)
->createMany(3); ->createMany(3);
$timeEntriesBefore = TimeEntry::factory()->forOrganization($data->organization)->forUser($data->user) $timeEntriesBefore = TimeEntry::factory()->forOrganization($data->organization)->forUser($data->user)
->startBetween(Carbon::now()->subDays(2)->startOfDay(), Carbon::now()->subDays(2)->endOfDay()) ->startBetween(
Carbon::now()->timezone($data->user->timezone)->subDays(2)->startOfDay()->utc(),
Carbon::now()->timezone($data->user->timezone)->subDays(2)->endOfDay()->utc()
)
->createMany(3); ->createMany(3);
$timeEntriesDirectlyBeforeLimit = TimeEntry::factory()->forOrganization($data->organization)->forUser($data->user) $timeEntriesDirectlyBeforeLimit = TimeEntry::factory()->forOrganization($data->organization)->forUser($data->user)
->create([ ->create([
'start' => Carbon::now()->subDays(2)->endOfDay(), 'start' => Carbon::now()->timezone($data->user->timezone)->subDays(2)->endOfDay()->utc(),
]); ]);
Passport::actingAs($data->user); Passport::actingAs($data->user);
// Act // Act
$response = $this->getJson(route('api.v1.time-entries.index', [ $response = $this->getJson(route('api.v1.time-entries.index', [
$data->organization->getKey(), $data->organization->getKey(),
'before' => Carbon::now()->subDay()->startOfDay()->toIso8601ZuluString(), 'before' => Carbon::now()->timezone($data->user->timezone)->subDay()->startOfDay()->toIso8601ZuluString(),
'user_id' => $data->user->getKey(), 'user_id' => $data->user->getKey(),
])); ]));
@@ -348,21 +354,21 @@ class TimeEntryEndpointTest extends ApiEndpointTestAbstract
'time-entries:view:own', 'time-entries:view:own',
]); ]);
$timeEntriesAfter = TimeEntry::factory()->forOrganization($data->organization)->forUser($data->user) $timeEntriesAfter = TimeEntry::factory()->forOrganization($data->organization)->forUser($data->user)
->startBetween(Carbon::now()->startOfDay(), Carbon::now()) ->startBetween(Carbon::now($data->user->timezone)->startOfDay()->utc(), Carbon::now($data->user->timezone)->utc())
->createMany(3); ->createMany(3);
$timeEntriesBefore = TimeEntry::factory()->forOrganization($data->organization)->forUser($data->user) $timeEntriesBefore = TimeEntry::factory()->forOrganization($data->organization)->forUser($data->user)
->startBetween(Carbon::now()->subDay()->startOfDay(), Carbon::now()->subDay()->endOfDay()) ->startBetween(Carbon::now($data->user->timezone)->subDay()->startOfDay()->utc(), Carbon::now($data->user->timezone)->subDay()->endOfDay()->utc())
->createMany(3); ->createMany(3);
$timeEntriesDirectlyAfterLimit = TimeEntry::factory()->forOrganization($data->organization)->forUser($data->user) $timeEntriesDirectlyAfterLimit = TimeEntry::factory()->forOrganization($data->organization)->forUser($data->user)
->create([ ->create([
'start' => Carbon::now()->startOfDay(), 'start' => Carbon::now($data->user->timezone)->startOfDay()->utc(),
]); ]);
Passport::actingAs($data->user); Passport::actingAs($data->user);
// Act // Act
$response = $this->getJson(route('api.v1.time-entries.index', [ $response = $this->getJson(route('api.v1.time-entries.index', [
$data->organization->getKey(), $data->organization->getKey(),
'after' => Carbon::now()->subDay()->endOfDay()->toIso8601ZuluString(), // yesterday 'after' => Carbon::now($data->user->timezone)->subDay()->endOfDay()->toIso8601ZuluString(), // yesterday
'user_id' => $data->user->getKey(), 'user_id' => $data->user->getKey(),
])); ]));