From c1b7b12fe1ea16a27961070db60b03a66ed08b10 Mon Sep 17 00:00:00 2001 From: ncoronel Date: Fri, 3 Jul 2026 13:54:31 -0300 Subject: [PATCH] feat: add endpoint to retrieve selected bank account for a tenant and update routes with authentication --- .../Controllers/BankAccountController.php | 9 ++++ .../Controllers/BootstrapTenantController.php | 2 +- .../Tenant/Resources/TenantResource.php | 1 - app/Domains/Tenant/routes/api.php | 9 ++-- .../Tenant/BankAccountControllerTest.php | 44 +++++++++++++++++++ 5 files changed, 60 insertions(+), 5 deletions(-) diff --git a/app/Domains/Tenant/Controllers/BankAccountController.php b/app/Domains/Tenant/Controllers/BankAccountController.php index 885ff7f..30c67d4 100644 --- a/app/Domains/Tenant/Controllers/BankAccountController.php +++ b/app/Domains/Tenant/Controllers/BankAccountController.php @@ -64,4 +64,13 @@ class BankAccountController extends Controller return TenantResource::make($tenant->loadMissing(['headerLogo', 'footerLogo', 'selectedBankAccount'])); } + + public function selected(Tenant $tenant): JsonResponse + { + $account = $tenant->selectedBankAccount; + + abort_if(!$account, 404, 'No bank account is currently selected for this tenant.'); + + return BankAccountResource::make($account)->response(); + } } diff --git a/app/Domains/Tenant/Controllers/BootstrapTenantController.php b/app/Domains/Tenant/Controllers/BootstrapTenantController.php index 29dcced..f9803b2 100644 --- a/app/Domains/Tenant/Controllers/BootstrapTenantController.php +++ b/app/Domains/Tenant/Controllers/BootstrapTenantController.php @@ -15,7 +15,7 @@ class BootstrapTenantController extends Controller $dominio = $request->validated('dominio'); return TenantResource::make( - Tenant::query()->with(['headerLogo', 'footerLogo', 'selectedBankAccount'])->where('dominio', $dominio)->firstOrFail() + Tenant::query()->with(['headerLogo', 'footerLogo'])->where('dominio', $dominio)->firstOrFail() ); } } diff --git a/app/Domains/Tenant/Resources/TenantResource.php b/app/Domains/Tenant/Resources/TenantResource.php index 987c659..280bab9 100644 --- a/app/Domains/Tenant/Resources/TenantResource.php +++ b/app/Domains/Tenant/Resources/TenantResource.php @@ -30,7 +30,6 @@ class TenantResource extends JsonResource 'header_logo' => $this->headerLogo?->getTemporaryUrl(1440), 'footer_logo' => $this->footerLogo?->getTemporaryUrl(1440 ), 'selected_bank_account_id' => $this->selected_bank_account_id, - 'selected_bank_account' => BankAccountResource::make($this->whenLoaded('selectedBankAccount')), ]; } } diff --git a/app/Domains/Tenant/routes/api.php b/app/Domains/Tenant/routes/api.php index 087c9c3..88e4d8c 100644 --- a/app/Domains/Tenant/routes/api.php +++ b/app/Domains/Tenant/routes/api.php @@ -10,7 +10,10 @@ Route::get('tenants/bootstrap/{dominio}', BootstrapTenantController::class) Route::apiResource('tenants', TenantController::class); Route::prefix('tenants/{tenant:codigo}')->group(function (): void { - Route::post('bank-accounts/{bank_account}/select', [\App\Domains\Tenant\Controllers\BankAccountController::class, 'select']); - Route::apiResource('bank-accounts', \App\Domains\Tenant\Controllers\BankAccountController::class) - ->parameters(['bank-accounts' => 'bank_account']); + Route::middleware('auth:sanctum')->group(function (): void { + Route::get('bank-accounts/selected', [\App\Domains\Tenant\Controllers\BankAccountController::class, 'selected']); + Route::post('bank-accounts/{bank_account}/select', [\App\Domains\Tenant\Controllers\BankAccountController::class, 'select']); + Route::apiResource('bank-accounts', \App\Domains\Tenant\Controllers\BankAccountController::class) + ->parameters(['bank-accounts' => 'bank_account']); + }); }); diff --git a/tests/Feature/Tenant/BankAccountControllerTest.php b/tests/Feature/Tenant/BankAccountControllerTest.php index da43707..ea5a9d7 100644 --- a/tests/Feature/Tenant/BankAccountControllerTest.php +++ b/tests/Feature/Tenant/BankAccountControllerTest.php @@ -4,6 +4,7 @@ namespace Tests\Feature\Tenant; use App\Domains\Tenant\Models\BankAccount; use App\Domains\Tenant\Models\Tenant; +use App\Domains\Auth\Models\User; use Illuminate\Foundation\Testing\RefreshDatabase; use Tests\TestCase; @@ -12,6 +13,7 @@ class BankAccountControllerTest extends TestCase use RefreshDatabase; private Tenant $tenant; + private User $user; protected function setUp(): void { @@ -48,6 +50,9 @@ class BankAccountControllerTest extends TestCase 'header_logo_id' => $headerAttachment->id, 'footer_logo_id' => $footerAttachment->id, ]); + + $this->user = User::factory()->create(); + $this->actingAs($this->user, 'sanctum'); } public function test_it_lists_bank_accounts_for_a_tenant(): void @@ -195,4 +200,43 @@ class BankAccountControllerTest extends TestCase $this->tenant->refresh(); $this->assertNull($this->tenant->selected_bank_account_id); } + + public function test_it_gets_the_selected_bank_account_for_a_tenant(): void + { + $account = BankAccount::query()->create([ + 'tenant_code' => 'acme', + 'titular' => 'John Doe', + 'entidad' => 'Banco Galicia', + 'alias' => 'john.doe.galicia', + 'cvu' => '1234567890123456789012', + ]); + + // When no bank account is selected + $response = $this->getJson("/api/tenants/acme/bank-accounts/selected"); + $response->assertNotFound(); + + // Select the bank account + $this->tenant->selected_bank_account_id = $account->id; + $this->tenant->save(); + + // Get selected bank account + $response = $this->getJson("/api/tenants/acme/bank-accounts/selected"); + $response->assertOk() + ->assertJsonPath('data.id', $account->id) + ->assertJsonPath('data.titular', 'John Doe'); + } + + public function test_it_rejects_unauthenticated_requests(): void + { + $this->app['auth']->forgetGuards(); + + $response = $this->getJson("/api/tenants/acme/bank-accounts/selected"); + $response->assertStatus(401); + + $response2 = $this->getJson("/api/tenants/acme/bank-accounts"); + $response2->assertStatus(401); + + $response3 = $this->postJson("/api/tenants/acme/bank-accounts", []); + $response3->assertStatus(401); + } }