diff --git a/app/Http/Controllers/Api/TransactionController.php b/app/Http/Controllers/Api/TransactionController.php index 9e598876..0c1723ae 100644 --- a/app/Http/Controllers/Api/TransactionController.php +++ b/app/Http/Controllers/Api/TransactionController.php @@ -112,11 +112,14 @@ class TransactionController extends Controller abort(403, 'Some transactions do not belong to the authenticated user.'); } + $userId = $request->user()->id; + foreach ($validated['transactions'] as $data) { $updateData = collect($data)->except('id')->toArray(); Transaction::query() ->where('id', $data['id']) + ->where('user_id', $userId) ->toBase() ->update($updateData); } diff --git a/app/Http/Controllers/OpenBanking/AuthorizationController.php b/app/Http/Controllers/OpenBanking/AuthorizationController.php index 5d715d8d..be103445 100644 --- a/app/Http/Controllers/OpenBanking/AuthorizationController.php +++ b/app/Http/Controllers/OpenBanking/AuthorizationController.php @@ -210,6 +210,10 @@ class AuthorizationController extends Controller } catch (\Throwable $e) { Log::error('EnableBanking session creation failed', ['error' => $e->getMessage()]); + if ($connection) { + $connection->update(['state_token' => null]); + } + return $this->finishRedirect($errorRedirectRoute, $errorRedirectParams, 'error', 'Failed to connect to your bank. Please try again.'); } diff --git a/app/Http/Controllers/Sync/TransactionSyncController.php b/app/Http/Controllers/Sync/TransactionSyncController.php index 448fe8eb..677f392c 100644 --- a/app/Http/Controllers/Sync/TransactionSyncController.php +++ b/app/Http/Controllers/Sync/TransactionSyncController.php @@ -15,21 +15,27 @@ class TransactionSyncController extends Controller */ public function index(Request $request): JsonResponse { + $validated = $request->validate([ + 'since' => ['nullable', 'date'], + ]); + $query = Transaction::query() ->where('user_id', $request->user()->id); - if ($request->has('since')) { - $query->where('updated_at', '>', $request->input('since')); + if ($validated['since'] ?? null) { + $query->where('updated_at', '>', $validated['since']); } $transactions = $query ->with('labels') ->orderBy('transaction_date', 'desc') ->orderBy('updated_at', 'desc') + ->limit(500) ->get(); return response()->json([ 'data' => $transactions, + 'has_more' => $transactions->count() === 500, ]); } } diff --git a/bootstrap/app.php b/bootstrap/app.php index c04f75df..404e9296 100644 --- a/bootstrap/app.php +++ b/bootstrap/app.php @@ -30,8 +30,10 @@ return Application::configure(basePath: dirname(__DIR__)) $middleware->encryptCookies(except: ['appearance', 'sidebar_state', 'chart-color-scheme']); + $trustedProxies = env('TRUSTED_PROXIES'); + $middleware->trustProxies( - at: '*', + at: is_string($trustedProxies) ? explode(',', $trustedProxies) : null, headers: Request::HEADER_X_FORWARDED_FOR | Request::HEADER_X_FORWARDED_HOST | Request::HEADER_X_FORWARDED_PORT diff --git a/resources/views/app.blade.php b/resources/views/app.blade.php index 3e0de6ce..025d9edb 100644 --- a/resources/views/app.blade.php +++ b/resources/views/app.blade.php @@ -10,7 +10,7 @@ {{-- Inline script to detect system dark mode preference and apply it immediately --}}