feat: add endpoint to retrieve selected bank account for a tenant and update routes with authentication

This commit is contained in:
2026-07-03 13:54:31 -03:00
parent b1e40b3430
commit c1b7b12fe1
5 changed files with 60 additions and 5 deletions

View File

@@ -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();
}
}

View File

@@ -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()
);
}
}

View File

@@ -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')),
];
}
}

View File

@@ -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']);
});
});

View File

@@ -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);
}
}