Phase 6: security & ops hardening (T6.1-T6.5)

- T6.1: named rate limiters (api-read/api-write/api-auth/api-webhooks),
  applied per module route group with tighter limits on booking/payment
  writes and the KBZ webhook than read-only catalog/routing endpoints.
- T6.2: install spatie/laravel-activitylog; LogsActivity on Booking/
  Payment/Refund status transitions and catalog/pricing admin CRUD
  (EvCompany, Destination, DepartureTimeSlot, EvRoute, RoutePricing).
  New IdentityPlugin with a read-only AuditLogResource gated by
  view_audit_log.
- T6.3: JSON error envelope for api/* in bootstrap/app.php (401/403/404/
  405/429/500 fallback), plus PaymentGatewayException (422 declined /
  502 unavailable).
- T6.4: feature tests proving the FastAPI agent token gets 403 on
  refund/cancel-not-owned and 405 (no write handler) on catalog/routing
  writes.
- T6.5: install gboquizosanchez/filament-log-viewer with a custom
  Filament admin theme (required for its views' Tailwind classes to
  compile), LOG_CHANNEL/FILAMENT_LOG_VIEWER_DRIVER=daily, registered
  under Operations in the sidebar.

252 tests passing.
This commit is contained in:
Nyan Lin Paing
2026-08-09 20:59:00 +07:00
parent e2e7902307
commit 46f9b8d5a3
43 changed files with 1176 additions and 25 deletions
Generated
+237 -1
View File
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "d93096263e7b6887bbb3e53c47ee6e90",
"content-hash": "5ec2c4de349d84433a04f4f044d7f7ed",
"packages": [
{
"name": "anourvalar/eloquent-serialize",
@@ -1547,6 +1547,69 @@
],
"time": "2025-12-03T09:33:47+00:00"
},
{
"name": "gboquizosanchez/filament-log-viewer",
"version": "2.3.0",
"source": {
"type": "git",
"url": "https://github.com/gboquizosanchez/filament-log-viewer.git",
"reference": "a32df2ae9d9512c166ac1a93eed57c9677294024"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/gboquizosanchez/filament-log-viewer/zipball/a32df2ae9d9512c166ac1a93eed57c9677294024",
"reference": "a32df2ae9d9512c166ac1a93eed57c9677294024",
"shasum": ""
},
"require": {
"ext-zip": "*",
"php": "^8.2|^8.3|^8.4",
"symfony/polyfill-php83": "^1.33"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^3.64",
"hermes/dependencies": "^1.1",
"larastan/larastan": "^2.9",
"orchestra/testbench": "^9.1",
"pestphp/pest": "^3.5"
},
"type": "library",
"extra": {
"laravel": {
"providers": [
"Boquizo\\FilamentLogViewer\\FilamentLogViewerServiceProvider"
]
}
},
"autoload": {
"psr-4": {
"Boquizo\\FilamentLogViewer\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Germán Boquizo Sánchez",
"email": "germanboquizosanchez@gmail.com",
"role": "Developer"
}
],
"description": "Filament Log Viewer",
"homepage": "https://github.com/gboquizosanchez",
"keywords": [
"filament",
"laravel",
"log-viewer"
],
"support": {
"issues": "https://github.com/gboquizosanchez/filament-log-viewer/issues",
"source": "https://github.com/gboquizosanchez/filament-log-viewer/tree/2.3.0"
},
"time": "2026-04-07T12:29:16+00:00"
},
{
"name": "graham-campbell/result-type",
"version": "v1.1.4",
@@ -5415,6 +5478,99 @@
],
"time": "2024-05-17T09:06:10+00:00"
},
{
"name": "spatie/laravel-activitylog",
"version": "5.0.0",
"source": {
"type": "git",
"url": "https://github.com/spatie/laravel-activitylog.git",
"reference": "0e00fe74fd071cc572a045459f6d4c9de33130bd"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/spatie/laravel-activitylog/zipball/0e00fe74fd071cc572a045459f6d4c9de33130bd",
"reference": "0e00fe74fd071cc572a045459f6d4c9de33130bd",
"shasum": ""
},
"require": {
"illuminate/config": "^12.0 || ^13.0",
"illuminate/database": "^12.0 || ^13.0",
"illuminate/support": "^12.0 || ^13.0",
"php": "^8.4",
"spatie/laravel-package-tools": "^1.6.3"
},
"require-dev": {
"ext-json": "*",
"larastan/larastan": "^3.0",
"laravel/pint": "^1.29",
"orchestra/testbench": "^10.0 || ^11.0",
"pestphp/pest": "^4.0"
},
"type": "library",
"extra": {
"laravel": {
"providers": [
"Spatie\\Activitylog\\ActivitylogServiceProvider"
]
}
},
"autoload": {
"files": [
"src/helpers.php"
],
"psr-4": {
"Spatie\\Activitylog\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Freek Van der Herten",
"email": "freek@spatie.be",
"homepage": "https://spatie.be",
"role": "Developer"
},
{
"name": "Sebastian De Deyne",
"email": "sebastian@spatie.be",
"homepage": "https://spatie.be",
"role": "Developer"
},
{
"name": "Tom Witkowski",
"email": "dev.gummibeer@gmail.com",
"homepage": "https://gummibeer.de",
"role": "Developer"
}
],
"description": "A very simple activity logger to monitor the users of your website or application",
"homepage": "https://github.com/spatie/activitylog",
"keywords": [
"activity",
"laravel",
"log",
"spatie",
"user"
],
"support": {
"issues": "https://github.com/spatie/laravel-activitylog/issues",
"source": "https://github.com/spatie/laravel-activitylog/tree/5.0.0"
},
"funding": [
{
"url": "https://spatie.be/open-source/support-us",
"type": "custom"
},
{
"url": "https://github.com/spatie",
"type": "github"
}
],
"time": "2026-03-25T10:04:54+00:00"
},
{
"name": "spatie/laravel-package-tools",
"version": "1.93.1",
@@ -7196,6 +7352,86 @@
],
"time": "2026-04-10T16:19:22+00:00"
},
{
"name": "symfony/polyfill-php83",
"version": "v1.41.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php83.git",
"reference": "5ea99087fb99c273a9b9236ed4c31e78b16103c6"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/5ea99087fb99c273a9b9236ed4c31e78b16103c6",
"reference": "5ea99087fb99c273a9b9236ed4c31e78b16103c6",
"shasum": ""
},
"require": {
"php": ">=7.2"
},
"type": "library",
"extra": {
"thanks": {
"url": "https://github.com/symfony/polyfill",
"name": "symfony/polyfill"
}
},
"autoload": {
"files": [
"bootstrap.php"
],
"psr-4": {
"Symfony\\Polyfill\\Php83\\": ""
},
"classmap": [
"Resources/stubs"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Nicolas Grekas",
"email": "p@tchwork.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions",
"homepage": "https://symfony.com",
"keywords": [
"compatibility",
"polyfill",
"portable",
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-php83/tree/v1.41.0"
},
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://github.com/nicolas-grekas",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2026-07-01T12:47:55+00:00"
},
{
"name": "symfony/polyfill-php84",
"version": "v1.38.1",