ifnex/04_Laravel/bootstrap/app.php
Kazem Alghasi 8d61eb19d5 feat(uat): implement smoke test command and UAT documentation
Add `ifnex:smoke-test` console command to perform automated end-to-end
checks post-deployment, including database connectivity, essential
data presence, and API endpoint availability.

- Implement `IfnexSmokeTest` command for automated system verification
- Add feature tests for the smoke test command
- Create `UAT-3.11.md` containing the client acceptance checklist
- Update `CLIENT_DELIVERY.md` to reflect phase 3.10 and 3.11 completion
- Register the new command in `bootstrap/app.php`
- Add project documentation directory
2026-11-01 11:36:25 +03:30

70 lines
3.3 KiB
PHP
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
use App\Http\Middleware\ApiKeyMiddleware;
use Illuminate\Auth\AuthenticationException;
use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;
use Illuminate\Http\Request;
return Application::configure(basePath: dirname(__DIR__))
->withRouting(
web: __DIR__.'/../routes/web.php',
api: __DIR__.'/../routes/api.php',
commands: __DIR__.'/../routes/console.php',
health: '/up',
)
->withCommands([
\App\Console\Commands\ImportShippingRates::class,
\App\Console\Commands\ImportTrackingData::class,
\App\Console\Commands\UpdateExchangeRates::class,
\App\Console\Commands\GenerateApiToken::class,
\App\Console\Commands\SyncWordPressUsers::class,
// فاز ۳.۱۰ — استقرار
\App\Console\Commands\IfnexPreflight::class,
\App\Console\Commands\IfnexImportFxRates::class,
// فاز ۳.۱۱ — UAT
\App\Console\Commands\IfnexSmokeTest::class,
])
->withMiddleware(function (Middleware $middleware): void {
$middleware->alias([
'api_key' => ApiKeyMiddleware::class,
]);
// پیش‌فرض لاراول ۱۱ مهمان‌ها را به route('login') می‌فرستد که در این پروژه وجود ندارد
// و باعث 500 می‌شود؛ با null، AuthenticationException به هندلر exceptions می‌رسد
// و برای api/* پاسخ JSON 401 برگردانده می‌شود.
$middleware->redirectGuestsTo(fn () => null);
// Stateful API برای Sanctum
$middleware->statefulApi();
// API با CORS
$middleware->api(prepend: \Illuminate\Http\Middleware\HandleCors::class);
// گروه web برای Filament و صفحات عادی
$middleware->group('web', [
\Illuminate\Cookie\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\Illuminate\Foundation\Http\Middleware\ValidateCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
]);
})
->withExceptions(function (Exceptions $exceptions): void {
// برای API‌ها، به جای redirect به login، JSON 401 برگردان
$exceptions->render(function (AuthenticationException $e, Request $request) {
if ($request->is('api/*') || $request->expectsJson() || $request->wantsJson()) {
return response()->json([
'success' => false,
'message' => 'Unauthenticated',
'error' => 'توکن نامعتبر است یا منقضی شده است. لطفاً دوباره وارد شوید.',
], 401);
}
// مهمان‌های وب (مثلاً بازکردن مستقیم روت‌های دانلود ادمین) به ورود پنل هدایت شوند —
// هندلر پیش‌فرض لاراول به route('login') می‌رود که در این پروژه وجود ندارد
return redirect()->guest(route('filament.admin.auth.login'));
});
})->create();