diff --git a/CLAUDE.md b/CLAUDE.md deleted file mode 100644 index 813d448..0000000 --- a/CLAUDE.md +++ /dev/null @@ -1,174 +0,0 @@ -# CLAUDE.md - -This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. - -## Overview - -Laravel 10 backend for a VPS/hosting SaaS platform. Provides an admin panel (Livewire), a customer REST API (JWT), and an admin REST API (JWT + Passport), with deep VMware vCenter integration for VM provisioning. - ---- - -## Common Commands - -```bash -# Dev server -php artisan serve - -# Migrations & seeding -php artisan migrate -php artisan db:seed --class=SomeSeeder - -# Clear all caches -php artisan cache:clear && php artisan config:clear && php artisan route:clear && php artisan view:clear - -# Queue -php artisan queue:work -php artisan horizon - -# Tests -php artisan test -php artisan test tests/Feature/SomeTest.php -php artisan test --filter testMethodName - -# Swagger docs regeneration -php artisan l5-swagger:generate -``` - ---- - -## Routing - -Four route files, each serving a different audience: - -| File | Domain/Prefix | Auth | Audience | -|------|---------------|------|----------| -| `routes/admin.php` | `admin.portal.test` | Session (`auth` + `Staff`) | Admin panel web UI | -| `routes/api.php` | `/api/v1/administrator/` | JWT (`admins-api` guard) | Admin REST API | -| `routes/client.php` | `/api/v1/client/` | JWT (`client` guard) | Customer REST API | -| `routes/web.php` | `/` | None | Public pages | - -**Middleware aliases:** -- `Staff` → `StaffCheck` — enforces admin session, updates `last_visited` -- `api.auth` → `ApiAuthCheck` — JWT validation, returns JSON 401 on failure -- `LoginCheck` — redirects authenticated users away from login page - ---- - -## Architecture - -### Controller Layers - -``` -app/Http/Controllers/ -├── admin/ — Admin panel web controllers (Blade/Livewire views) -├── Api/Admin/ — Admin REST API controllers -├── Api/Client/ — Customer REST API (ClientController) -├── Api/Service/ — Product/order/service endpoints (used by both) -├── Api/Transaction/— Payment and transaction endpoints -└── rest/ — Legacy internal REST endpoints -``` - -### Repository Pattern - -All DB access goes through repositories. Never query models directly in controllers. - -``` -app/Repositories/{Domain}/ -├── {Domain}Repository.php — Concrete (extends BaseRepository) -├── {Domain}RepositoryInterface.php — Interface -└── {Domain}CachedRepository.php — Redis-cached variant (optional) -``` - -**BaseRepository** provides: `create`, `update`, `delete`, `find`, `getAll`, `getCount`, `insert`. - -Repositories are bound in `AppServiceProvider` → `RepositoryProvider` (40+ bindings). Always inject via interface. - -### Service Layer - -Business logic is split across two locations: - -- `app/Services/` — Domain services: `VMDataService`, `VMHelperService`, `WhoisService` -- `app/Http/Services/` — HTTP-integration services: - - `vCenter.php` — VMware vCenter REST API wrapper (Guzzle, SSL disabled for self-signed certs). Key methods: `loginServer()`, `GetConsoleTickets()`, `getAllVirtualMachine()`, `checkApiExits()`. Token stored in model, refreshed on 'Login_Again' response. - - `WinRMClient.php` — Windows Remote Management for VM operations - - `VNPayService.php` — Payment gateway - - `Invoice/` — Invoice generation/processing - - `PusherNotification.php`, `Telegram.php`, `Discord.php` — Notifications - -Dedicated admin service layer: `app/Services/Api/Admin/` (`ProductService`, `VCenterService`), `app/Services/Api/` (`ClientAuthService`, `ServiceService`). - -### Global Helpers - -`app/Http/Helpers/function_helper.php` (auto-loaded via Composer): -- `setting('group.key')` — Read cached settings with dot notation -- `format_price(amount)` — Format as ₫ currency -- `format_point(points)` — Format loyalty points -- `format_day(date, format)` — Date formatting - -### Enums - -Type-safe PHP enums in `app/Enums/{Domain}/`. Support `label()` for Vietnamese display text. Key enums: `InvoiceStatus`, `ProductTypeEnums`, `TransactionStatus`, `Status`, `AddonType`. - -### Admin UI - -Livewire 3 components in `app/Http/Livewire/`. Modal pattern uses Alpine.js events: -- Open: `$dispatch('open-{modal-name}')` / listen with `@open-{modal-name}.window` -- Close: `$dispatch('close-{modal-name}')` / listen with `@close-{modal-name}.window` - -Server-side tables use Yajra DataTables. - ---- - -## Auth Guards - -| Guard | Driver | Used By | -|-------|--------|---------| -| `web` / `admins` | session | Admin panel | -| `admins-api` | JWT (tymon/jwt-auth) | Admin REST API | -| `client` | JWT (tymon/jwt-auth) | Customer API (portal-client) | -| `users-api` | Passport OAuth2 | — | -| `client-sanctum` | Sanctum | Alternative customer auth | - ---- - -## Key Models - -**Core business:** `Customer` (UUID PK, JWT subject), `Order`, `Invoice` (InvoiceStatus enum), `InvoiceItem`, `Product` (slug, cpu/ram/disk/bandwidth/gpu specs), `ProductCategories` (hierarchical via kalnoy/nestedset). - -**VMware:** `vCenter` (credentials + token), `ModuleVmware` (VM instances → orders), `ModuleHost`, `ModuleDatacenter`, `ModuleNetwork`, `ModuleIpAddress`, `ModuleDatastore`, `ModuleSnapshot`. - -**Finance:** `Transaction`, `Payment`, `Cart`, `CartAddon`. - -**Support:** `Ticket`, `TicketReply`, `Mail`. - ---- - -## Queue Jobs - -Async operations in `app/Jobs/`: -- `VirtualMachine/ProcessOrderPaymentJob` — Payment processing + VM provisioning -- `Hosting/`, `Mail/`, `Ticket/`, `Payment/` — Domain-specific async tasks - ---- - -## API Response Convention - -```json -{ "error": false, "data": {...} } -{ "error": true, "message": "Reason here" } -``` - -API Resources in `app/Http/Resources/Api/` transform models before response. - ---- - -## Key Integrations - -- **VMware vCenter** — `app/Http/Services/vCenter.php`, passwords decrypted via `SignRSA` facade -- **VNPay** — `config/vnpay.php`, `VNPayService.php` -- **Redis** — Caching (cached repositories), sessions, queues -- **Pusher** — Real-time events -- **CKFinder** — Admin file browser (custom auth: `CustomCKFinderAuth` middleware) -- **L5-Swagger** — API docs at `/api/documentation` -- **Spatie Permission** — RBAC for admin roles -- **Horizon** — Queue monitoring at `/horizon` diff --git a/app/Http/Controllers/Api/Admin/Product/ProductController.php b/app/Http/Controllers/Api/Admin/Product/ProductController.php index fb2c384..584c17d 100644 --- a/app/Http/Controllers/Api/Admin/Product/ProductController.php +++ b/app/Http/Controllers/Api/Admin/Product/ProductController.php @@ -53,27 +53,36 @@ class ProductController extends Controller public function store(Request $request): JsonResponse { $validated = $request->validate([ - 'name' => 'required|string|max:255', - 'product_type' => 'nullable|string', - 'category' => 'nullable|string|max:255', - 'is_active' => 'boolean', - 'setup_fee' => 'nullable|numeric|min:0', - 'cpu' => 'nullable|numeric|min:0', - 'ram' => 'nullable|numeric|min:0', - 'disk' => 'nullable|numeric|min:0', - 'bandwidth' => 'nullable|numeric|min:0', + 'name' => 'required|string|max:255', + 'product_categories_id' => 'nullable|integer|exists:product_categories,id', + 'product_type' => 'nullable|string', + 'category' => 'nullable|string|max:255', + 'is_active' => 'boolean', + 'setup_fee' => 'nullable|numeric|min:0', + 'cpu' => 'nullable|numeric|min:0', + 'ram' => 'nullable|numeric|min:0', + 'disk' => 'nullable|numeric|min:0', + 'bandwidth' => 'nullable|numeric|min:0', ]); + $productType = $validated['product_type'] ?? null; + + if (!$productType && !empty($validated['product_categories_id'])) { + $category = \App\Models\ProductCategories::find($validated['product_categories_id']); + $productType = $category?->type; + } + $product = Product::create([ - 'name' => $validated['name'], - 'slug' => Str::slug($validated['name']), - 'product_type' => $validated['product_type'] ?? null, - 'is_active' => $validated['is_active'] ?? true, - 'setup_fee' => $validated['setup_fee'] ?? 0, - 'cpu' => $validated['cpu'] ?? null, - 'ram' => $validated['ram'] ?? null, - 'disk' => $validated['disk'] ?? null, - 'bandwidth' => $validated['bandwidth'] ?? null, + 'name' => $validated['name'], + 'slug' => Str::slug($validated['name']), + 'product_categories_id' => $validated['product_categories_id'] ?? null, + 'product_type' => $productType, + 'is_active' => $validated['is_active'] ?? true, + 'setup_fee' => $validated['setup_fee'] ?? 0, + 'cpu' => $validated['cpu'] ?? null, + 'ram' => $validated['ram'] ?? null, + 'disk' => $validated['disk'] ?? null, + 'bandwidth' => $validated['bandwidth'] ?? null, ]); return response()->json([ @@ -92,20 +101,26 @@ class ProductController extends Controller } $validated = $request->validate([ - 'name' => 'sometimes|required|string|max:255', - 'product_type' => 'nullable|string', - 'is_active' => 'boolean', - 'setup_fee' => 'nullable|numeric|min:0', - 'cpu' => 'nullable|numeric|min:0', - 'ram' => 'nullable|numeric|min:0', - 'disk' => 'nullable|numeric|min:0', - 'bandwidth' => 'nullable|numeric|min:0', + 'name' => 'sometimes|required|string|max:255', + 'product_categories_id' => 'nullable|integer|exists:product_categories,id', + 'product_type' => 'nullable|string', + 'is_active' => 'boolean', + 'setup_fee' => 'nullable|numeric|min:0', + 'cpu' => 'nullable|numeric|min:0', + 'ram' => 'nullable|numeric|min:0', + 'disk' => 'nullable|numeric|min:0', + 'bandwidth' => 'nullable|numeric|min:0', ]); if (isset($validated['name']) && $validated['name'] !== $product->name) { $validated['slug'] = Str::slug($validated['name']); } + if (empty($validated['product_type']) && !empty($validated['product_categories_id'])) { + $category = \App\Models\ProductCategories::find($validated['product_categories_id']); + $validated['product_type'] = $category?->type; + } + $product->update($validated); return response()->json([ diff --git a/app/Http/Resources/Api/Admin/ProductCategoryResource.php b/app/Http/Resources/Api/Admin/ProductCategoryResource.php index 1a7256b..d2e4aa4 100644 --- a/app/Http/Resources/Api/Admin/ProductCategoryResource.php +++ b/app/Http/Resources/Api/Admin/ProductCategoryResource.php @@ -18,6 +18,7 @@ class ProductCategoryResource extends JsonResource 'sort_order' => $this->sort_order, 'type' => $this->type, 'type_label' => $this->type_label, + 'page_type' => $this->resolvePageType($this->type), 'created_at' => $this->created_at?->toISOString(), 'children' => $this->whenLoaded('children', fn () => self::collection($this->children) @@ -27,4 +28,15 @@ class ProductCategoryResource extends JsonResource ), ]; } + + private function resolvePageType(?string $type): string + { + return match ($type) { + 'vps', 'cloud' => 'service_vps', + 'hosting', 'email', 'ssl' => 'service_hosting', + 'domain' => 'service_domain', + 'blog' => 'blog', + default => 'service_vps', + }; + } } diff --git a/app/Http/Resources/Api/Admin/ProductResource.php b/app/Http/Resources/Api/Admin/ProductResource.php index a14f4b2..901572e 100644 --- a/app/Http/Resources/Api/Admin/ProductResource.php +++ b/app/Http/Resources/Api/Admin/ProductResource.php @@ -19,6 +19,7 @@ class ProductResource extends JsonResource 'name' => $this->name, 'slug' => $this->slug, 'product_type' => $this->product_type, + 'page_type' => $this->resolvePageType($this->product_type), 'category' => $this->whenLoaded('category', fn() => $this->category?->name), 'cpu' => $this->cpu, 'ram' => $this->ram, @@ -30,4 +31,15 @@ class ProductResource extends JsonResource 'created_at' => $this->created_at, ]; } + + private function resolvePageType(?string $productType): string + { + return match ($productType) { + 'vps', 'cloud' => 'service_vps', + 'hosting', 'email', 'ssl' => 'service_hosting', + 'domain' => 'service_domain', + 'blog' => 'blog', + default => 'service_vps', + }; + } } diff --git a/app/Http/Resources/Api/Service/ProductCategoryResource.php b/app/Http/Resources/Api/Service/ProductCategoryResource.php index c65519f..1913a0e 100644 --- a/app/Http/Resources/Api/Service/ProductCategoryResource.php +++ b/app/Http/Resources/Api/Service/ProductCategoryResource.php @@ -18,9 +18,21 @@ class ProductCategoryResource extends JsonResource 'sort_order' => $this->sort_order, 'type' => $this->type, 'type_label' => $this->type_label, + 'page_type' => $this->resolvePageType($this->type), 'children' => $this->when($this->children, function () { return self::collection($this->children); }), ]; } + + private function resolvePageType(?string $type): string + { + return match ($type) { + 'vps', 'cloud' => 'service_vps', + 'hosting', 'email', 'ssl' => 'service_hosting', + 'domain' => 'service_domain', + 'blog' => 'blog', + default => 'service_vps', + }; + } } diff --git a/app/Http/Resources/Api/Service/ServiceListResource.php b/app/Http/Resources/Api/Service/ServiceListResource.php index c4911a0..ecc687d 100644 --- a/app/Http/Resources/Api/Service/ServiceListResource.php +++ b/app/Http/Resources/Api/Service/ServiceListResource.php @@ -22,6 +22,7 @@ class ServiceListResource extends JsonResource 'description' => $this->description, 'thumbnail' => $this->thumbnail ? asset($this->thumbnail) : null, 'product_type' => $this->product_type, + 'page_type' => $this->resolvePageType($this->product_type), 'specs' => [ 'cpu' => $this->cpu, 'ram' => $this->ram, @@ -46,4 +47,15 @@ class ServiceListResource extends JsonResource })->unique('group')->values(), ]; } + + private function resolvePageType(?string $productType): string + { + return match ($productType) { + 'vps', 'cloud' => 'service_vps', + 'hosting', 'email', 'ssl' => 'service_hosting', + 'domain' => 'service_domain', + 'blog' => 'blog', + default => 'service_vps', + }; + } } diff --git a/app/Http/Resources/Api/Service/ServiceResource.php b/app/Http/Resources/Api/Service/ServiceResource.php index a1abc46..f1dc366 100644 --- a/app/Http/Resources/Api/Service/ServiceResource.php +++ b/app/Http/Resources/Api/Service/ServiceResource.php @@ -38,6 +38,7 @@ class ServiceResource extends JsonResource 'description' => $this->description, 'thumbnail' => $this->thumbnail ? asset($this->thumbnail) : null, 'product_type' => $this->product_type, + 'page_type' => $this->resolvePageType($this->product_type), 'specs' => [ 'cpu' => (int) $this->cpu, 'ram' => (int) $this->ram, @@ -77,4 +78,15 @@ class ServiceResource extends JsonResource ]), ]; } + + private function resolvePageType(?string $productType): string + { + return match ($productType) { + 'vps', 'cloud' => 'service_vps', + 'hosting', 'email', 'ssl' => 'service_hosting', + 'domain' => 'service_domain', + 'blog' => 'blog', + default => 'service_vps', + }; + } } diff --git a/composer.json b/composer.json index cea8498..d9170d4 100644 --- a/composer.json +++ b/composer.json @@ -11,7 +11,6 @@ "php": "^8.1 || ^8.2", "ext-openssl": "*", "ext-ssh2": "*", - "ckfinder/ckfinder-laravel-package": "^5.0", "darkaonline/l5-swagger": "^8.6", "developermithu/tallcraftui": "^2.0", "guzzlehttp/guzzle": "^7.2", @@ -21,7 +20,6 @@ "laravel/passport": "^12.2", "laravel/sanctum": "^3.3", "laravel/tinker": "^2.7", - "livewire/livewire": "^3.6", "maatwebsite/excel": "^3.1", "opcodesio/log-viewer": "^3.18", "phpseclib/phpseclib": "*", @@ -29,12 +27,9 @@ "pusher/pusher-php-server": "^7.2", "spatie/laravel-permission": "^6.3", "spatie/laravel-sluggable": "^3.7", - "tymon/jwt-auth": "^2.0", - "yajra/laravel-datatables": "^10.0", - "yajra/laravel-datatables-oracle": "^10.3.1" + "tymon/jwt-auth": "^2.0" }, "require-dev": { - "barryvdh/laravel-debugbar": "^3.9", "fakerphp/faker": "^1.9.1", "laravel/sail": "^1.0.1", "mockery/mockery": "^1.4.4", @@ -84,4 +79,4 @@ }, "minimum-stability": "dev", "prefer-stable": true -} +} \ No newline at end of file diff --git a/composer.lock b/composer.lock index 2ce01e3..ef08eb2 100644 --- a/composer.lock +++ b/composer.lock @@ -4,159 +4,8 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "ea9197c6a2804717c1efcd340c4b7828", + "content-hash": "f75a70ad418e7eb8399eb29cd86b0496", "packages": [ - { - "name": "aws/aws-crt-php", - "version": "v1.2.7", - "source": { - "type": "git", - "url": "https://github.com/awslabs/aws-crt-php.git", - "reference": "d71d9906c7bb63a28295447ba12e74723bd3730e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/d71d9906c7bb63a28295447ba12e74723bd3730e", - "reference": "d71d9906c7bb63a28295447ba12e74723bd3730e", - "shasum": "" - }, - "require": { - "php": ">=5.5" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35||^5.6.3||^9.5", - "yoast/phpunit-polyfills": "^1.0" - }, - "suggest": { - "ext-awscrt": "Make sure you install awscrt native extension to use any of the functionality." - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "AWS SDK Common Runtime Team", - "email": "aws-sdk-common-runtime@amazon.com" - } - ], - "description": "AWS Common Runtime for PHP", - "homepage": "https://github.com/awslabs/aws-crt-php", - "keywords": [ - "amazon", - "aws", - "crt", - "sdk" - ], - "support": { - "issues": "https://github.com/awslabs/aws-crt-php/issues", - "source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.7" - }, - "time": "2024-10-18T22:15:13+00:00" - }, - { - "name": "aws/aws-sdk-php", - "version": "3.369.23", - "source": { - "type": "git", - "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "c45d13c95b188b6fc9f31c77083fad6e7dbc3efd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/c45d13c95b188b6fc9f31c77083fad6e7dbc3efd", - "reference": "c45d13c95b188b6fc9f31c77083fad6e7dbc3efd", - "shasum": "" - }, - "require": { - "aws/aws-crt-php": "^1.2.3", - "ext-json": "*", - "ext-pcre": "*", - "ext-simplexml": "*", - "guzzlehttp/guzzle": "^7.4.5", - "guzzlehttp/promises": "^2.0", - "guzzlehttp/psr7": "^2.4.5", - "mtdowling/jmespath.php": "^2.8.0", - "php": ">=8.1", - "psr/http-message": "^1.0 || ^2.0", - "symfony/filesystem": "^v5.4.45 || ^v6.4.3 || ^v7.1.0 || ^v8.0.0" - }, - "require-dev": { - "andrewsville/php-token-reflection": "^1.4", - "aws/aws-php-sns-message-validator": "~1.0", - "behat/behat": "~3.0", - "composer/composer": "^2.7.8", - "dms/phpunit-arraysubset-asserts": "^0.4.0", - "doctrine/cache": "~1.4", - "ext-dom": "*", - "ext-openssl": "*", - "ext-sockets": "*", - "phpunit/phpunit": "^9.6", - "psr/cache": "^2.0 || ^3.0", - "psr/simple-cache": "^2.0 || ^3.0", - "sebastian/comparator": "^1.2.3 || ^4.0 || ^5.0", - "yoast/phpunit-polyfills": "^2.0" - }, - "suggest": { - "aws/aws-php-sns-message-validator": "To validate incoming SNS notifications", - "doctrine/cache": "To use the DoctrineCacheAdapter", - "ext-curl": "To send requests using cURL", - "ext-openssl": "Allows working with CloudFront private distributions and verifying received SNS messages", - "ext-pcntl": "To use client-side monitoring", - "ext-sockets": "To use client-side monitoring" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "files": [ - "src/functions.php" - ], - "psr-4": { - "Aws\\": "src/" - }, - "exclude-from-classmap": [ - "src/data/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "Amazon Web Services", - "homepage": "http://aws.amazon.com" - } - ], - "description": "AWS SDK for PHP - Use Amazon Web Services in your PHP project", - "homepage": "http://aws.amazon.com/sdkforphp", - "keywords": [ - "amazon", - "aws", - "cloud", - "dynamodb", - "ec2", - "glacier", - "s3", - "sdk" - ], - "support": { - "forum": "https://github.com/aws/aws-sdk-php/discussions", - "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.369.23" - }, - "time": "2026-01-29T19:15:41+00:00" - }, { "name": "blade-ui-kit/blade-heroicons", "version": "2.6.0", @@ -228,30 +77,30 @@ }, { "name": "blade-ui-kit/blade-icons", - "version": "1.8.1", + "version": "1.9.0", "source": { "type": "git", "url": "https://github.com/driesvints/blade-icons.git", - "reference": "47e7b6f43250e6404e4224db8229219cd42b543c" + "reference": "caa92fde675d7a651c38bf73ca582ddada56f318" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/driesvints/blade-icons/zipball/47e7b6f43250e6404e4224db8229219cd42b543c", - "reference": "47e7b6f43250e6404e4224db8229219cd42b543c", + "url": "https://api.github.com/repos/driesvints/blade-icons/zipball/caa92fde675d7a651c38bf73ca582ddada56f318", + "reference": "caa92fde675d7a651c38bf73ca582ddada56f318", "shasum": "" }, "require": { - "illuminate/contracts": "^8.0|^9.0|^10.0|^11.0|^12.0", - "illuminate/filesystem": "^8.0|^9.0|^10.0|^11.0|^12.0", - "illuminate/support": "^8.0|^9.0|^10.0|^11.0|^12.0", - "illuminate/view": "^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/contracts": "^8.0|^9.0|^10.0|^11.0|^12.0|^13.0", + "illuminate/filesystem": "^8.0|^9.0|^10.0|^11.0|^12.0|^13.0", + "illuminate/support": "^8.0|^9.0|^10.0|^11.0|^12.0|^13.0", + "illuminate/view": "^8.0|^9.0|^10.0|^11.0|^12.0|^13.0", "php": "^7.4|^8.0", - "symfony/console": "^5.3|^6.0|^7.0", - "symfony/finder": "^5.3|^6.0|^7.0" + "symfony/console": "^5.3|^6.0|^7.0|^8.0", + "symfony/finder": "^5.3|^6.0|^7.0|^8.0" }, "require-dev": { "mockery/mockery": "^1.5.1", - "orchestra/testbench": "^6.0|^7.0|^8.0|^9.0|^10.0", + "orchestra/testbench": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", "phpunit/phpunit": "^9.0|^10.5|^11.0" }, "bin": [ @@ -305,7 +154,7 @@ "type": "paypal" } ], - "time": "2026-01-20T09:46:32+00:00" + "time": "2026-02-23T10:42:23+00:00" }, { "name": "brick/math", @@ -436,58 +285,6 @@ ], "time": "2023-12-11T17:09:12+00:00" }, - { - "name": "ckfinder/ckfinder-laravel-package", - "version": "v5.0.2", - "source": { - "type": "git", - "url": "https://github.com/ckfinder/ckfinder-laravel-package.git", - "reference": "266e31e1749641c9ac3e8e5d6b37df60120aec19" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ckfinder/ckfinder-laravel-package/zipball/266e31e1749641c9ac3e8e5d6b37df60120aec19", - "reference": "266e31e1749641c9ac3e8e5d6b37df60120aec19", - "shasum": "" - }, - "require": { - "ext-gd": "*", - "ext-json": "*", - "ext-zip": "*", - "laravel/framework": "^9.0|^10.0|^11.0|^12.0", - "league/flysystem": "^3.0", - "league/flysystem-aws-s3-v3": "^3.0", - "league/flysystem-azure-blob-storage": "^3.0", - "league/flysystem-ftp": "^3.0", - "php": ">=8.1.0", - "pimple/pimple": "~3.0", - "spatie/flysystem-dropbox": "^2.0|^3.0" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "CKSource\\CKFinderBridge\\CKFinderServiceProvider" - ] - } - }, - "autoload": { - "psr-4": { - "CKSource\\CKFinder\\": "_connector/", - "CKSource\\CKFinderBridge\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "CKFinder 3 package for Laravel", - "support": { - "issues": "https://github.com/ckfinder/ckfinder-laravel-package/issues", - "source": "https://github.com/ckfinder/ckfinder-laravel-package/tree/v5.0.2" - }, - "time": "2026-01-12T09:12:55+00:00" - }, { "name": "composer/pcre", "version": "3.3.2", @@ -793,16 +590,16 @@ }, { "name": "developermithu/tallcraftui", - "version": "v2.0.9", + "version": "v2.1.1", "source": { "type": "git", "url": "https://github.com/developermithu/tallcraftui.git", - "reference": "9420877fe23232dcfb024bf7ed10d5dc53f3e104" + "reference": "91226a61630216a8f193af2875e9c85dab789d5a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/developermithu/tallcraftui/zipball/9420877fe23232dcfb024bf7ed10d5dc53f3e104", - "reference": "9420877fe23232dcfb024bf7ed10d5dc53f3e104", + "url": "https://api.github.com/repos/developermithu/tallcraftui/zipball/91226a61630216a8f193af2875e9c85dab789d5a", + "reference": "91226a61630216a8f193af2875e9c85dab789d5a", "shasum": "" }, "require": { @@ -859,9 +656,9 @@ ], "support": { "issues": "https://github.com/developermithu/tallcraftui/issues", - "source": "https://github.com/developermithu/tallcraftui/tree/v2.0.9" + "source": "https://github.com/developermithu/tallcraftui/tree/v2.1.1" }, - "time": "2026-01-16T07:11:55+00:00" + "time": "2026-02-18T06:12:24+00:00" }, { "name": "dflydev/dot-access-data", @@ -1376,16 +1173,16 @@ }, { "name": "firebase/php-jwt", - "version": "v6.11.1", + "version": "v7.0.3", "source": { "type": "git", "url": "https://github.com/firebase/php-jwt.git", - "reference": "d1e91ecf8c598d073d0995afa8cd5c75c6e19e66" + "reference": "28aa0694bcfdfa5e2959c394d5a1ee7a5083629e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/firebase/php-jwt/zipball/d1e91ecf8c598d073d0995afa8cd5c75c6e19e66", - "reference": "d1e91ecf8c598d073d0995afa8cd5c75c6e19e66", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/28aa0694bcfdfa5e2959c394d5a1ee7a5083629e", + "reference": "28aa0694bcfdfa5e2959c394d5a1ee7a5083629e", "shasum": "" }, "require": { @@ -1433,9 +1230,9 @@ ], "support": { "issues": "https://github.com/firebase/php-jwt/issues", - "source": "https://github.com/firebase/php-jwt/tree/v6.11.1" + "source": "https://github.com/firebase/php-jwt/tree/v7.0.3" }, - "time": "2025-04-09T20:32:01+00:00" + "time": "2026-02-25T22:16:40+00:00" }, { "name": "fruitcake/php-cors", @@ -1651,71 +1448,6 @@ ], "time": "2024-05-21T17:32:42+00:00" }, - { - "name": "graham-campbell/guzzle-factory", - "version": "v7.0.2", - "source": { - "type": "git", - "url": "https://github.com/GrahamCampbell/Guzzle-Factory.git", - "reference": "b0a273dabe1f90004e76ca4ab8671b10caaa1dd3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/GrahamCampbell/Guzzle-Factory/zipball/b0a273dabe1f90004e76ca4ab8671b10caaa1dd3", - "reference": "b0a273dabe1f90004e76ca4ab8671b10caaa1dd3", - "shasum": "" - }, - "require": { - "guzzlehttp/guzzle": "^7.9.2", - "guzzlehttp/psr7": "^2.7.0", - "php": "^7.4.15 || ^8.0.2" - }, - "require-dev": { - "graham-campbell/analyzer": "^4.2.1", - "phpunit/phpunit": "^9.6.14 || ^10.5.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "GrahamCampbell\\GuzzleFactory\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - } - ], - "description": "Provides A Simple Guzzle Factory With Good Defaults", - "keywords": [ - "Graham Campbell", - "GrahamCampbell", - "Guzzle", - "Guzzle Factory", - "Guzzle-Factory", - "http" - ], - "support": { - "issues": "https://github.com/GrahamCampbell/Guzzle-Factory/issues", - "source": "https://github.com/GrahamCampbell/Guzzle-Factory/tree/v7.0.2" - }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/graham-campbell/guzzle-factory", - "type": "tidelift" - } - ], - "time": "2025-01-12T01:44:21+00:00" - }, { "name": "graham-campbell/result-type", "version": "v1.1.4", @@ -2462,36 +2194,37 @@ }, { "name": "laravel/horizon", - "version": "v5.43.0", + "version": "v5.45.1", "source": { "type": "git", "url": "https://github.com/laravel/horizon.git", - "reference": "2a04285ba83915511afbe987cbfedafdc27fd2de" + "reference": "637e065ae0a704288595b896ad1c7c3c9741869b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/horizon/zipball/2a04285ba83915511afbe987cbfedafdc27fd2de", - "reference": "2a04285ba83915511afbe987cbfedafdc27fd2de", + "url": "https://api.github.com/repos/laravel/horizon/zipball/637e065ae0a704288595b896ad1c7c3c9741869b", + "reference": "637e065ae0a704288595b896ad1c7c3c9741869b", "shasum": "" }, "require": { "ext-json": "*", "ext-pcntl": "*", "ext-posix": "*", - "illuminate/contracts": "^9.21|^10.0|^11.0|^12.0", - "illuminate/queue": "^9.21|^10.0|^11.0|^12.0", - "illuminate/support": "^9.21|^10.0|^11.0|^12.0", + "illuminate/contracts": "^9.21|^10.0|^11.0|^12.0|^13.0", + "illuminate/queue": "^9.21|^10.0|^11.0|^12.0|^13.0", + "illuminate/support": "^9.21|^10.0|^11.0|^12.0|^13.0", + "laravel/sentinel": "^1.0", "nesbot/carbon": "^2.17|^3.0", "php": "^8.0", "ramsey/uuid": "^4.0", - "symfony/console": "^6.0|^7.0", - "symfony/error-handler": "^6.0|^7.0", + "symfony/console": "^6.0|^7.0|^8.0", + "symfony/error-handler": "^6.0|^7.0|^8.0", "symfony/polyfill-php83": "^1.28", - "symfony/process": "^6.0|^7.0" + "symfony/process": "^6.0|^7.0|^8.0" }, "require-dev": { "mockery/mockery": "^1.0", - "orchestra/testbench": "^7.55|^8.36|^9.15|^10.8", + "orchestra/testbench": "^7.56|^8.37|^9.16|^10.9|^11.0", "phpstan/phpstan": "^1.10|^2.0", "predis/predis": "^1.1|^2.0|^3.0" }, @@ -2535,27 +2268,27 @@ ], "support": { "issues": "https://github.com/laravel/horizon/issues", - "source": "https://github.com/laravel/horizon/tree/v5.43.0" + "source": "https://github.com/laravel/horizon/tree/v5.45.1" }, - "time": "2026-01-15T15:10:56+00:00" + "time": "2026-03-06T15:31:27+00:00" }, { "name": "laravel/passport", - "version": "v12.4.2", + "version": "v12.4.3", "source": { "type": "git", "url": "https://github.com/laravel/passport.git", - "reference": "65a885607b62d361aedaeb10a946bc6b5a954262" + "reference": "1d2e0170a52f150d5c35c9a6fc1f7ccebcde7626" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/passport/zipball/65a885607b62d361aedaeb10a946bc6b5a954262", - "reference": "65a885607b62d361aedaeb10a946bc6b5a954262", + "url": "https://api.github.com/repos/laravel/passport/zipball/1d2e0170a52f150d5c35c9a6fc1f7ccebcde7626", + "reference": "1d2e0170a52f150d5c35c9a6fc1f7ccebcde7626", "shasum": "" }, "require": { "ext-json": "*", - "firebase/php-jwt": "^6.4", + "firebase/php-jwt": "^6.4|^7.0", "illuminate/auth": "^9.21|^10.0|^11.0|^12.0", "illuminate/console": "^9.21|^10.0|^11.0|^12.0", "illuminate/container": "^9.21|^10.0|^11.0|^12.0", @@ -2613,7 +2346,7 @@ "issues": "https://github.com/laravel/passport/issues", "source": "https://github.com/laravel/passport" }, - "time": "2025-02-12T16:11:33+00:00" + "time": "2026-02-19T14:14:05+00:00" }, { "name": "laravel/prompts", @@ -2739,6 +2472,65 @@ }, "time": "2023-12-19T18:44:48+00:00" }, + { + "name": "laravel/sentinel", + "version": "v1.0.1", + "source": { + "type": "git", + "url": "https://github.com/laravel/sentinel.git", + "reference": "7a98db53e0d9d6f61387f3141c07477f97425603" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/sentinel/zipball/7a98db53e0d9d6f61387f3141c07477f97425603", + "reference": "7a98db53e0d9d6f61387f3141c07477f97425603", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/container": "^8.37|^9.0|^10.0|^11.0|^12.0|^13.0", + "php": "^8.0" + }, + "require-dev": { + "laravel/pint": "^1.27", + "orchestra/testbench": "^6.47.1|^7.56|^8.37|^9.16|^10.9|^11.0", + "phpstan/phpstan": "^2.1.33" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Sentinel\\SentinelServiceProvider" + ] + }, + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\Sentinel\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Mior Muhammad Zaki", + "email": "mior@laravel.com" + } + ], + "support": { + "source": "https://github.com/laravel/sentinel/tree/v1.0.1" + }, + "time": "2026-02-12T13:32:54+00:00" + }, { "name": "laravel/serializable-closure", "version": "v1.3.7", @@ -2802,16 +2594,16 @@ }, { "name": "laravel/tinker", - "version": "v2.11.0", + "version": "v2.11.1", "source": { "type": "git", "url": "https://github.com/laravel/tinker.git", - "reference": "3d34b97c9a1747a81a3fde90482c092bd8b66468" + "reference": "c9f80cc835649b5c1842898fb043f8cc098dd741" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/tinker/zipball/3d34b97c9a1747a81a3fde90482c092bd8b66468", - "reference": "3d34b97c9a1747a81a3fde90482c092bd8b66468", + "url": "https://api.github.com/repos/laravel/tinker/zipball/c9f80cc835649b5c1842898fb043f8cc098dd741", + "reference": "c9f80cc835649b5c1842898fb043f8cc098dd741", "shasum": "" }, "require": { @@ -2862,9 +2654,9 @@ ], "support": { "issues": "https://github.com/laravel/tinker/issues", - "source": "https://github.com/laravel/tinker/tree/v2.11.0" + "source": "https://github.com/laravel/tinker/tree/v2.11.1" }, - "time": "2025-12-19T19:16:45+00:00" + "time": "2026-02-06T14:12:35+00:00" }, { "name": "lcobucci/clock", @@ -2932,39 +2724,38 @@ }, { "name": "lcobucci/jwt", - "version": "4.3.0", + "version": "5.6.0", "source": { "type": "git", "url": "https://github.com/lcobucci/jwt.git", - "reference": "4d7de2fe0d51a96418c0d04004986e410e87f6b4" + "reference": "bb3e9f21e4196e8afc41def81ef649c164bca25e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/lcobucci/jwt/zipball/4d7de2fe0d51a96418c0d04004986e410e87f6b4", - "reference": "4d7de2fe0d51a96418c0d04004986e410e87f6b4", + "url": "https://api.github.com/repos/lcobucci/jwt/zipball/bb3e9f21e4196e8afc41def81ef649c164bca25e", + "reference": "bb3e9f21e4196e8afc41def81ef649c164bca25e", "shasum": "" }, "require": { - "ext-hash": "*", - "ext-json": "*", - "ext-mbstring": "*", "ext-openssl": "*", "ext-sodium": "*", - "lcobucci/clock": "^2.0 || ^3.0", - "php": "^7.4 || ^8.0" + "php": "~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0", + "psr/clock": "^1.0" }, "require-dev": { - "infection/infection": "^0.21", - "lcobucci/coding-standard": "^6.0", - "mikey179/vfsstream": "^1.6.7", + "infection/infection": "^0.29", + "lcobucci/clock": "^3.2", + "lcobucci/coding-standard": "^11.0", "phpbench/phpbench": "^1.2", - "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^1.4", - "phpstan/phpstan-deprecation-rules": "^1.0", - "phpstan/phpstan-phpunit": "^1.0", - "phpstan/phpstan-strict-rules": "^1.0", - "phpunit/php-invoker": "^3.1", - "phpunit/phpunit": "^9.5" + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan": "^1.10.7", + "phpstan/phpstan-deprecation-rules": "^1.1.3", + "phpstan/phpstan-phpunit": "^1.3.10", + "phpstan/phpstan-strict-rules": "^1.5.0", + "phpunit/phpunit": "^11.1" + }, + "suggest": { + "lcobucci/clock": ">= 3.2" }, "type": "library", "autoload": { @@ -2990,7 +2781,7 @@ ], "support": { "issues": "https://github.com/lcobucci/jwt/issues", - "source": "https://github.com/lcobucci/jwt/tree/4.3.0" + "source": "https://github.com/lcobucci/jwt/tree/5.6.0" }, "funding": [ { @@ -3002,20 +2793,20 @@ "type": "patreon" } ], - "time": "2023-01-02T13:28:00+00:00" + "time": "2025-10-17T11:30:53+00:00" }, { "name": "league/commonmark", - "version": "2.8.0", + "version": "2.8.1", "source": { "type": "git", "url": "https://github.com/thephpleague/commonmark.git", - "reference": "4efa10c1e56488e658d10adf7b7b7dcd19940bfb" + "reference": "84b1ca48347efdbe775426f108622a42735a6579" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/4efa10c1e56488e658d10adf7b7b7dcd19940bfb", - "reference": "4efa10c1e56488e658d10adf7b7b7dcd19940bfb", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/84b1ca48347efdbe775426f108622a42735a6579", + "reference": "84b1ca48347efdbe775426f108622a42735a6579", "shasum": "" }, "require": { @@ -3040,9 +2831,9 @@ "phpstan/phpstan": "^1.8.2", "phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0", "scrutinizer/ocular": "^1.8.1", - "symfony/finder": "^5.3 | ^6.0 | ^7.0", - "symfony/process": "^5.4 | ^6.0 | ^7.0", - "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 | ^7.0", + "symfony/finder": "^5.3 | ^6.0 | ^7.0 || ^8.0", + "symfony/process": "^5.4 | ^6.0 | ^7.0 || ^8.0", + "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 | ^7.0 || ^8.0", "unleashedtech/php-coding-standard": "^3.1.1", "vimeo/psalm": "^4.24.0 || ^5.0.0 || ^6.0.0" }, @@ -3109,7 +2900,7 @@ "type": "tidelift" } ], - "time": "2025-11-26T21:48:24+00:00" + "time": "2026-03-05T21:37:03+00:00" }, { "name": "league/config", @@ -3249,16 +3040,16 @@ }, { "name": "league/flysystem", - "version": "3.31.0", + "version": "3.32.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "1717e0b3642b0df65ecb0cc89cdd99fa840672ff" + "reference": "254b1595b16b22dbddaaef9ed6ca9fdac4956725" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/1717e0b3642b0df65ecb0cc89cdd99fa840672ff", - "reference": "1717e0b3642b0df65ecb0cc89cdd99fa840672ff", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/254b1595b16b22dbddaaef9ed6ca9fdac4956725", + "reference": "254b1595b16b22dbddaaef9ed6ca9fdac4956725", "shasum": "" }, "require": { @@ -3326,155 +3117,9 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/3.31.0" + "source": "https://github.com/thephpleague/flysystem/tree/3.32.0" }, - "time": "2026-01-23T15:38:47+00:00" - }, - { - "name": "league/flysystem-aws-s3-v3", - "version": "3.31.0", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/flysystem-aws-s3-v3.git", - "reference": "e36a2bc60b06332c92e4435047797ded352b446f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/e36a2bc60b06332c92e4435047797ded352b446f", - "reference": "e36a2bc60b06332c92e4435047797ded352b446f", - "shasum": "" - }, - "require": { - "aws/aws-sdk-php": "^3.295.10", - "league/flysystem": "^3.10.0", - "league/mime-type-detection": "^1.0.0", - "php": "^8.0.2" - }, - "conflict": { - "guzzlehttp/guzzle": "<7.0", - "guzzlehttp/ringphp": "<1.1.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "League\\Flysystem\\AwsS3V3\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Frank de Jonge", - "email": "info@frankdejonge.nl" - } - ], - "description": "AWS S3 filesystem adapter for Flysystem.", - "keywords": [ - "Flysystem", - "aws", - "file", - "files", - "filesystem", - "s3", - "storage" - ], - "support": { - "source": "https://github.com/thephpleague/flysystem-aws-s3-v3/tree/3.31.0" - }, - "time": "2026-01-23T15:30:45+00:00" - }, - { - "name": "league/flysystem-azure-blob-storage", - "version": "3.31.0", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/flysystem-azure-blob-storage.git", - "reference": "1d1cf31cab62bd85cfbab91687d35e668423401f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-azure-blob-storage/zipball/1d1cf31cab62bd85cfbab91687d35e668423401f", - "reference": "1d1cf31cab62bd85cfbab91687d35e668423401f", - "shasum": "" - }, - "require": { - "league/flysystem": "^3.10.0", - "microsoft/azure-storage-blob": "^1.1", - "php": "^8.0.2" - }, - "type": "library", - "autoload": { - "psr-4": { - "League\\Flysystem\\AzureBlobStorage\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Frank de Jonge", - "email": "info@frankdejonge.nl" - } - ], - "support": { - "source": "https://github.com/thephpleague/flysystem-azure-blob-storage/tree/3.31.0" - }, - "abandoned": "azure-oss/storage-blob-flysystem", - "time": "2026-01-23T15:30:45+00:00" - }, - { - "name": "league/flysystem-ftp", - "version": "3.31.0", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/flysystem-ftp.git", - "reference": "cd6ab064a695bc340e3090c360021d26cd417e67" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-ftp/zipball/cd6ab064a695bc340e3090c360021d26cd417e67", - "reference": "cd6ab064a695bc340e3090c360021d26cd417e67", - "shasum": "" - }, - "require": { - "ext-ftp": "*", - "league/flysystem": "^3.0.0", - "league/mime-type-detection": "^1.0.0", - "php": "^8.0.2" - }, - "type": "library", - "autoload": { - "psr-4": { - "League\\Flysystem\\Ftp\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Frank de Jonge", - "email": "info@frankdejonge.nl" - } - ], - "description": "FTP filesystem adapter for Flysystem.", - "keywords": [ - "Flysystem", - "file", - "files", - "filesystem", - "ftp", - "ftpd" - ], - "support": { - "source": "https://github.com/thephpleague/flysystem-ftp/tree/3.31.0" - }, - "time": "2026-01-23T15:30:45+00:00" + "time": "2026-02-25T17:01:41+00:00" }, { "name": "league/flysystem-local", @@ -3525,76 +3170,6 @@ }, "time": "2026-01-23T15:30:45+00:00" }, - { - "name": "league/fractal", - "version": "0.20.2", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/fractal.git", - "reference": "573ca2e0e348a7fe573a3e8fbc29a6588ece8c4e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/fractal/zipball/573ca2e0e348a7fe573a3e8fbc29a6588ece8c4e", - "reference": "573ca2e0e348a7fe573a3e8fbc29a6588ece8c4e", - "shasum": "" - }, - "require": { - "php": ">=7.4" - }, - "require-dev": { - "doctrine/orm": "^2.5", - "illuminate/contracts": "~5.0", - "laminas/laminas-paginator": "~2.12", - "mockery/mockery": "^1.3", - "pagerfanta/pagerfanta": "~1.0.0|~4.0.0", - "phpstan/phpstan": "^1.4", - "phpunit/phpunit": "^9.5", - "squizlabs/php_codesniffer": "~3.4", - "vimeo/psalm": "^4.30" - }, - "suggest": { - "illuminate/pagination": "The Illuminate Pagination component.", - "laminas/laminas-paginator": "Laminas Framework Paginator", - "pagerfanta/pagerfanta": "Pagerfanta Paginator" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "0.20.x-dev" - } - }, - "autoload": { - "psr-4": { - "League\\Fractal\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Phil Sturgeon", - "email": "me@philsturgeon.uk", - "homepage": "http://philsturgeon.uk/", - "role": "Developer" - } - ], - "description": "Handle the output of complex data structures ready for API output.", - "homepage": "http://fractal.thephpleague.com/", - "keywords": [ - "api", - "json", - "league", - "rest" - ], - "support": { - "issues": "https://github.com/thephpleague/fractal/issues", - "source": "https://github.com/thephpleague/fractal/tree/0.20.2" - }, - "time": "2025-02-14T21:33:14+00:00" - }, { "name": "league/mime-type-detection", "version": "1.16.0", @@ -3921,82 +3496,6 @@ ], "time": "2026-01-15T06:54:53+00:00" }, - { - "name": "livewire/livewire", - "version": "v3.7.6", - "source": { - "type": "git", - "url": "https://github.com/livewire/livewire.git", - "reference": "276ac156f6ae414990784854a2673e3d23c68b24" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/livewire/livewire/zipball/276ac156f6ae414990784854a2673e3d23c68b24", - "reference": "276ac156f6ae414990784854a2673e3d23c68b24", - "shasum": "" - }, - "require": { - "illuminate/database": "^10.0|^11.0|^12.0", - "illuminate/routing": "^10.0|^11.0|^12.0", - "illuminate/support": "^10.0|^11.0|^12.0", - "illuminate/validation": "^10.0|^11.0|^12.0", - "laravel/prompts": "^0.1.24|^0.2|^0.3", - "league/mime-type-detection": "^1.9", - "php": "^8.1", - "symfony/console": "^6.0|^7.0", - "symfony/http-kernel": "^6.2|^7.0" - }, - "require-dev": { - "calebporzio/sushi": "^2.1", - "laravel/framework": "^10.15.0|^11.0|^12.0", - "mockery/mockery": "^1.3.1", - "orchestra/testbench": "^8.21.0|^9.0|^10.0", - "orchestra/testbench-dusk": "^8.24|^9.1|^10.0", - "phpunit/phpunit": "^10.4|^11.5", - "psy/psysh": "^0.11.22|^0.12" - }, - "type": "library", - "extra": { - "laravel": { - "aliases": { - "Livewire": "Livewire\\Livewire" - }, - "providers": [ - "Livewire\\LivewireServiceProvider" - ] - } - }, - "autoload": { - "files": [ - "src/helpers.php" - ], - "psr-4": { - "Livewire\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Caleb Porzio", - "email": "calebporzio@gmail.com" - } - ], - "description": "A front-end framework for Laravel.", - "support": { - "issues": "https://github.com/livewire/livewire/issues", - "source": "https://github.com/livewire/livewire/tree/v3.7.6" - }, - "funding": [ - { - "url": "https://github.com/livewire", - "type": "github" - } - ], - "time": "2026-01-23T05:41:38+00:00" - }, { "name": "maatwebsite/excel", "version": "3.1.67", @@ -4263,102 +3762,6 @@ }, "time": "2022-12-02T22:17:43+00:00" }, - { - "name": "microsoft/azure-storage-blob", - "version": "1.5.4", - "source": { - "type": "git", - "url": "https://github.com/Azure/azure-storage-blob-php.git", - "reference": "1023ce1dbf062351a32ca5ec72ad1fd4a504f1bf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Azure/azure-storage-blob-php/zipball/1023ce1dbf062351a32ca5ec72ad1fd4a504f1bf", - "reference": "1023ce1dbf062351a32ca5ec72ad1fd4a504f1bf", - "shasum": "" - }, - "require": { - "microsoft/azure-storage-common": "~1.5", - "php": ">=5.6.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "MicrosoftAzure\\Storage\\Blob\\": "src/Blob" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Azure Storage PHP Client Library", - "email": "dmsh@microsoft.com" - } - ], - "description": "This project provides a set of PHP client libraries that make it easy to access Microsoft Azure Storage Blob APIs.", - "keywords": [ - "azure", - "blob", - "php", - "sdk", - "storage" - ], - "support": { - "issues": "https://github.com/Azure/azure-storage-blob-php/issues", - "source": "https://github.com/Azure/azure-storage-blob-php/tree/v1.5.4" - }, - "time": "2022-09-02T02:13:06+00:00" - }, - { - "name": "microsoft/azure-storage-common", - "version": "1.5.2", - "source": { - "type": "git", - "url": "https://github.com/Azure/azure-storage-common-php.git", - "reference": "8ca7b1bf4c9ca7c663e75a02a0035b05b37196a0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Azure/azure-storage-common-php/zipball/8ca7b1bf4c9ca7c663e75a02a0035b05b37196a0", - "reference": "8ca7b1bf4c9ca7c663e75a02a0035b05b37196a0", - "shasum": "" - }, - "require": { - "guzzlehttp/guzzle": "~6.0|^7.0", - "php": ">=5.6.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "MicrosoftAzure\\Storage\\Common\\": "src/Common" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Azure Storage PHP Client Library", - "email": "dmsh@microsoft.com" - } - ], - "description": "This project provides a set of common code shared by Azure Storage Blob, Table, Queue and File PHP client libraries.", - "keywords": [ - "azure", - "common", - "php", - "sdk", - "storage" - ], - "support": { - "issues": "https://github.com/Azure/azure-storage-common-php/issues", - "source": "https://github.com/Azure/azure-storage-common-php/tree/v1.5.2" - }, - "time": "2021-10-09T03:03:47+00:00" - }, { "name": "monolog/monolog", "version": "3.10.0", @@ -4462,72 +3865,6 @@ ], "time": "2026-01-02T08:56:05+00:00" }, - { - "name": "mtdowling/jmespath.php", - "version": "2.8.0", - "source": { - "type": "git", - "url": "https://github.com/jmespath/jmespath.php.git", - "reference": "a2a865e05d5f420b50cc2f85bb78d565db12a6bc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/a2a865e05d5f420b50cc2f85bb78d565db12a6bc", - "reference": "a2a865e05d5f420b50cc2f85bb78d565db12a6bc", - "shasum": "" - }, - "require": { - "php": "^7.2.5 || ^8.0", - "symfony/polyfill-mbstring": "^1.17" - }, - "require-dev": { - "composer/xdebug-handler": "^3.0.3", - "phpunit/phpunit": "^8.5.33" - }, - "bin": [ - "bin/jp.php" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.8-dev" - } - }, - "autoload": { - "files": [ - "src/JmesPath.php" - ], - "psr-4": { - "JmesPath\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - }, - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - } - ], - "description": "Declaratively specify how to extract elements from a JSON document", - "keywords": [ - "json", - "jsonpath" - ], - "support": { - "issues": "https://github.com/jmespath/jmespath.php/issues", - "source": "https://github.com/jmespath/jmespath.php/tree/2.8.0" - }, - "time": "2024-09-04T18:46:31+00:00" - }, { "name": "nesbot/carbon", "version": "2.73.0", @@ -4637,16 +3974,16 @@ }, { "name": "nette/schema", - "version": "v1.3.4", + "version": "v1.3.5", "source": { "type": "git", "url": "https://github.com/nette/schema.git", - "reference": "086497a2f34b82fede9b5a41cc8e131d087cd8f7" + "reference": "f0ab1a3cda782dbc5da270d28545236aa80c4002" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/schema/zipball/086497a2f34b82fede9b5a41cc8e131d087cd8f7", - "reference": "086497a2f34b82fede9b5a41cc8e131d087cd8f7", + "url": "https://api.github.com/repos/nette/schema/zipball/f0ab1a3cda782dbc5da270d28545236aa80c4002", + "reference": "f0ab1a3cda782dbc5da270d28545236aa80c4002", "shasum": "" }, "require": { @@ -4654,8 +3991,10 @@ "php": "8.1 - 8.5" }, "require-dev": { + "nette/phpstan-rules": "^1.0", "nette/tester": "^2.6", - "phpstan/phpstan": "^2.0@stable", + "phpstan/extension-installer": "^1.4@stable", + "phpstan/phpstan": "^2.1.39@stable", "tracy/tracy": "^2.8" }, "type": "library", @@ -4696,9 +4035,9 @@ ], "support": { "issues": "https://github.com/nette/schema/issues", - "source": "https://github.com/nette/schema/tree/v1.3.4" + "source": "https://github.com/nette/schema/tree/v1.3.5" }, - "time": "2026-02-08T02:54:00+00:00" + "time": "2026-02-23T03:47:12+00:00" }, { "name": "nette/utils", @@ -5014,21 +4353,21 @@ }, { "name": "opcodesio/log-viewer", - "version": "v3.21.1", + "version": "v3.23.0", "source": { "type": "git", "url": "https://github.com/opcodesio/log-viewer.git", - "reference": "6dfa99c3a8c5ae128c6b7f2f0a4f026af7ca055c" + "reference": "654a6ccd8d4b79268e5b2ea2f510b660b008973d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/opcodesio/log-viewer/zipball/6dfa99c3a8c5ae128c6b7f2f0a4f026af7ca055c", - "reference": "6dfa99c3a8c5ae128c6b7f2f0a4f026af7ca055c", + "url": "https://api.github.com/repos/opcodesio/log-viewer/zipball/654a6ccd8d4b79268e5b2ea2f510b660b008973d", + "reference": "654a6ccd8d4b79268e5b2ea2f510b660b008973d", "shasum": "" }, "require": { "illuminate/contracts": "^8.0|^9.0|^10.0|^11.0|^12.0", - "opcodesio/mail-parser": "^0.1.6", + "opcodesio/mail-parser": "^0.2.3", "php": "^8.0" }, "conflict": { @@ -5039,7 +4378,7 @@ "itsgoingd/clockwork": "^5.1", "laravel/pint": "^1.0", "nunomaduro/collision": "^7.0|^8.0", - "orchestra/testbench": "^7.6|^8.0|^9.0|^10.0", + "orchestra/testbench": "^7.6|^8.0|^9.5|^10.0", "pestphp/pest": "^2.0|^3.7", "pestphp/pest-plugin-laravel": "^2.0|^3.1", "spatie/test-time": "^1.3" @@ -5086,7 +4425,7 @@ ], "support": { "issues": "https://github.com/opcodesio/log-viewer/issues", - "source": "https://github.com/opcodesio/log-viewer/tree/v3.21.1" + "source": "https://github.com/opcodesio/log-viewer/tree/v3.23.0" }, "funding": [ { @@ -5098,20 +4437,20 @@ "type": "github" } ], - "time": "2025-10-23T05:12:09+00:00" + "time": "2026-02-28T09:52:35+00:00" }, { "name": "opcodesio/mail-parser", - "version": "v0.1.6", + "version": "v0.2.3", "source": { "type": "git", "url": "https://github.com/opcodesio/mail-parser.git", - "reference": "639ef31cbd146a63416283e75afce152e13233ea" + "reference": "6f9544a1e526d5849cf8d96600556b2951893aec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/opcodesio/mail-parser/zipball/639ef31cbd146a63416283e75afce152e13233ea", - "reference": "639ef31cbd146a63416283e75afce152e13233ea", + "url": "https://api.github.com/repos/opcodesio/mail-parser/zipball/6f9544a1e526d5849cf8d96600556b2951893aec", + "reference": "6f9544a1e526d5849cf8d96600556b2951893aec", "shasum": "" }, "require": { @@ -5149,102 +4488,9 @@ ], "support": { "issues": "https://github.com/opcodesio/mail-parser/issues", - "source": "https://github.com/opcodesio/mail-parser/tree/v0.1.6" + "source": "https://github.com/opcodesio/mail-parser/tree/v0.2.3" }, - "time": "2023-11-19T08:47:43+00:00" - }, - { - "name": "openspout/openspout", - "version": "v4.28.5", - "source": { - "type": "git", - "url": "https://github.com/openspout/openspout.git", - "reference": "ab05a09fe6fce57c90338f83280648a9786ce36b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/openspout/openspout/zipball/ab05a09fe6fce57c90338f83280648a9786ce36b", - "reference": "ab05a09fe6fce57c90338f83280648a9786ce36b", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-fileinfo": "*", - "ext-filter": "*", - "ext-libxml": "*", - "ext-xmlreader": "*", - "ext-zip": "*", - "php": "~8.2.0 || ~8.3.0 || ~8.4.0" - }, - "require-dev": { - "ext-zlib": "*", - "friendsofphp/php-cs-fixer": "^3.68.3", - "infection/infection": "^0.29.10", - "phpbench/phpbench": "^1.4.0", - "phpstan/phpstan": "^2.1.2", - "phpstan/phpstan-phpunit": "^2.0.4", - "phpstan/phpstan-strict-rules": "^2", - "phpunit/phpunit": "^11.5.4" - }, - "suggest": { - "ext-iconv": "To handle non UTF-8 CSV files (if \"php-mbstring\" is not already installed or is too limited)", - "ext-mbstring": "To handle non UTF-8 CSV files (if \"iconv\" is not already installed)" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.3.x-dev" - } - }, - "autoload": { - "psr-4": { - "OpenSpout\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Adrien Loison", - "email": "adrien@box.com" - } - ], - "description": "PHP Library to read and write spreadsheet files (CSV, XLSX and ODS), in a fast and scalable way", - "homepage": "https://github.com/openspout/openspout", - "keywords": [ - "OOXML", - "csv", - "excel", - "memory", - "odf", - "ods", - "office", - "open", - "php", - "read", - "scale", - "spreadsheet", - "stream", - "write", - "xlsx" - ], - "support": { - "issues": "https://github.com/openspout/openspout/issues", - "source": "https://github.com/openspout/openspout/tree/v4.28.5" - }, - "funding": [ - { - "url": "https://paypal.me/filippotessarotto", - "type": "custom" - }, - { - "url": "https://github.com/Slamdunk", - "type": "github" - } - ], - "time": "2025-01-30T13:51:11+00:00" + "time": "2026-02-28T09:04:57+00:00" }, { "name": "paragonie/constant_time_encoding", @@ -5754,59 +5000,6 @@ ], "time": "2026-01-27T09:17:28+00:00" }, - { - "name": "pimple/pimple", - "version": "v3.6.1", - "source": { - "type": "git", - "url": "https://github.com/silexphp/Pimple.git", - "reference": "020029849cc55ad360066844df8ed880fb20c5bb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/silexphp/Pimple/zipball/020029849cc55ad360066844df8ed880fb20c5bb", - "reference": "020029849cc55ad360066844df8ed880fb20c5bb", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "psr/container": "^1.1 || ^2.0" - }, - "require-dev": { - "phpunit/phpunit": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4.x-dev" - } - }, - "autoload": { - "psr-0": { - "Pimple": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - } - ], - "description": "Pimple, a simple Dependency Injection Container", - "homepage": "https://pimple.symfony.com", - "keywords": [ - "container", - "dependency injection" - ], - "support": { - "source": "https://github.com/silexphp/Pimple/tree/v3.6.1" - }, - "time": "2025-12-31T08:24:29+00:00" - }, { "name": "predis/predis", "version": "v2.4.1", @@ -6332,16 +5525,16 @@ }, { "name": "psy/psysh", - "version": "v0.12.18", + "version": "v0.12.21", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "ddff0ac01beddc251786fe70367cd8bbdb258196" + "reference": "4821fab5b7cd8c49a673a9fd5754dc9162bb9e97" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/ddff0ac01beddc251786fe70367cd8bbdb258196", - "reference": "ddff0ac01beddc251786fe70367cd8bbdb258196", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/4821fab5b7cd8c49a673a9fd5754dc9162bb9e97", + "reference": "4821fab5b7cd8c49a673a9fd5754dc9162bb9e97", "shasum": "" }, "require": { @@ -6405,9 +5598,9 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.12.18" + "source": "https://github.com/bobthecow/psysh/tree/v0.12.21" }, - "time": "2025-12-17T14:35:46+00:00" + "time": "2026-03-06T21:21:28+00:00" }, { "name": "pusher/pusher-php-server", @@ -6668,160 +5861,18 @@ }, "time": "2025-12-14T04:43:48+00:00" }, - { - "name": "spatie/dropbox-api", - "version": "1.23.0", - "source": { - "type": "git", - "url": "https://github.com/spatie/dropbox-api.git", - "reference": "120ff475d7b03d3700a884c295b3b9503c4ddf8d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/spatie/dropbox-api/zipball/120ff475d7b03d3700a884c295b3b9503c4ddf8d", - "reference": "120ff475d7b03d3700a884c295b3b9503c4ddf8d", - "shasum": "" - }, - "require": { - "ext-json": "*", - "graham-campbell/guzzle-factory": "^4.0.2|^5.0|^6.0|^7.0", - "guzzlehttp/guzzle": "^6.2|^7.0", - "php": "^8.1" - }, - "require-dev": { - "laravel/pint": "^1.10.1", - "pestphp/pest": "^2.6.3", - "phpstan/phpstan": "^1.10.16" - }, - "type": "library", - "autoload": { - "psr-4": { - "Spatie\\Dropbox\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Alex Vanderbist", - "email": "alex.vanderbist@gmail.com", - "homepage": "https://spatie.be", - "role": "Developer" - }, - { - "name": "Freek Van der Herten", - "email": "freek@spatie.be", - "homepage": "https://spatie.be", - "role": "Developer" - } - ], - "description": "A minimal implementation of Dropbox API v2", - "homepage": "https://github.com/spatie/dropbox-api", - "keywords": [ - "Dropbox-API", - "api", - "dropbox", - "spatie", - "v2" - ], - "support": { - "issues": "https://github.com/spatie/dropbox-api/issues", - "source": "https://github.com/spatie/dropbox-api/tree/1.23.0" - }, - "funding": [ - { - "url": "https://spatie.be/open-source/support-us", - "type": "custom" - }, - { - "url": "https://github.com/spatie", - "type": "github" - } - ], - "time": "2025-01-06T09:31:59+00:00" - }, - { - "name": "spatie/flysystem-dropbox", - "version": "3.0.2", - "source": { - "type": "git", - "url": "https://github.com/spatie/flysystem-dropbox.git", - "reference": "e6bf18e4dcfe5b21945bdc8b633f7e4c3ae4b9eb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/spatie/flysystem-dropbox/zipball/e6bf18e4dcfe5b21945bdc8b633f7e4c3ae4b9eb", - "reference": "e6bf18e4dcfe5b21945bdc8b633f7e4c3ae4b9eb", - "shasum": "" - }, - "require": { - "league/flysystem": "^3.7.0", - "php": "^8.0", - "spatie/dropbox-api": "^1.17.1" - }, - "require-dev": { - "pestphp/pest": "^1.22", - "phpspec/prophecy-phpunit": "^2.0.1", - "phpunit/phpunit": "^9.5.4" - }, - "type": "library", - "autoload": { - "psr-4": { - "Spatie\\FlysystemDropbox\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Alex Vanderbist", - "email": "alex.vanderbist@gmail.com", - "homepage": "https://spatie.be", - "role": "Developer" - } - ], - "description": "Flysystem Adapter for the Dropbox v2 API", - "homepage": "https://github.com/spatie/flysystem-dropbox", - "keywords": [ - "Flysystem", - "api", - "dropbox", - "flysystem-dropbox", - "spatie", - "v2" - ], - "support": { - "issues": "https://github.com/spatie/flysystem-dropbox/issues", - "source": "https://github.com/spatie/flysystem-dropbox/tree/3.0.2" - }, - "funding": [ - { - "url": "https://spatie.be/open-source/support-us", - "type": "custom" - }, - { - "url": "https://github.com/spatie", - "type": "github" - } - ], - "time": "2025-01-06T14:05:49+00:00" - }, { "name": "spatie/laravel-permission", - "version": "6.24.0", + "version": "6.24.1", "source": { "type": "git", "url": "https://github.com/spatie/laravel-permission.git", - "reference": "76adb1fc8d07c16a0721c35c4cc330b7a12598d7" + "reference": "eefc9d17eba80d023d6bff313f882cb2bcd691a3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-permission/zipball/76adb1fc8d07c16a0721c35c4cc330b7a12598d7", - "reference": "76adb1fc8d07c16a0721c35c4cc330b7a12598d7", + "url": "https://api.github.com/repos/spatie/laravel-permission/zipball/eefc9d17eba80d023d6bff313f882cb2bcd691a3", + "reference": "eefc9d17eba80d023d6bff313f882cb2bcd691a3", "shasum": "" }, "require": { @@ -6883,7 +5934,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-permission/issues", - "source": "https://github.com/spatie/laravel-permission/tree/6.24.0" + "source": "https://github.com/spatie/laravel-permission/tree/6.24.1" }, "funding": [ { @@ -6891,30 +5942,30 @@ "type": "github" } ], - "time": "2025-12-13T21:45:21+00:00" + "time": "2026-02-09T21:10:03+00:00" }, { "name": "spatie/laravel-sluggable", - "version": "3.7.5", + "version": "3.8.0", "source": { "type": "git", "url": "https://github.com/spatie/laravel-sluggable.git", - "reference": "e4fdd519e043a2af02b52eec2c3be2dd2e262e27" + "reference": "8050bf38a6e03ac4974e1f7bc722983242abfae0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-sluggable/zipball/e4fdd519e043a2af02b52eec2c3be2dd2e262e27", - "reference": "e4fdd519e043a2af02b52eec2c3be2dd2e262e27", + "url": "https://api.github.com/repos/spatie/laravel-sluggable/zipball/8050bf38a6e03ac4974e1f7bc722983242abfae0", + "reference": "8050bf38a6e03ac4974e1f7bc722983242abfae0", "shasum": "" }, "require": { - "illuminate/database": "^8.0|^9.0|^10.0|^11.0|^12.0", - "illuminate/support": "^8.0|^9.0|^10.0|^11.0|^12.0", - "php": "^8.0" + "illuminate/database": "^10.0|^11.0|^12.0|^13.0", + "illuminate/support": "^10.0|^11.0|^12.0|^13.0", + "php": "^8.2" }, "require-dev": { - "orchestra/testbench": "^6.23|^7.0|^8.0|^9.0|^10.0", - "pestphp/pest": "^1.20|^2.0|^3.7", + "orchestra/testbench": "^8.0|^9.0|^10.0|^11.0", + "pestphp/pest": "^2.0|^3.7|^4.0", "spatie/laravel-translatable": "^5.0|^6.0" }, "type": "library", @@ -6942,7 +5993,7 @@ "spatie" ], "support": { - "source": "https://github.com/spatie/laravel-sluggable/tree/3.7.5" + "source": "https://github.com/spatie/laravel-sluggable/tree/3.8.0" }, "funding": [ { @@ -6950,20 +6001,20 @@ "type": "github" } ], - "time": "2025-04-24T09:21:00+00:00" + "time": "2026-02-21T14:25:10+00:00" }, { "name": "swagger-api/swagger-ui", - "version": "v5.31.0", + "version": "v5.32.0", "source": { "type": "git", "url": "https://github.com/swagger-api/swagger-ui.git", - "reference": "61dddd44389bf25922639afd682f50b8a0fb5cf4" + "reference": "1b33a5976d8f5e02d3bc40de1deae3a4a3642e36" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/swagger-api/swagger-ui/zipball/61dddd44389bf25922639afd682f50b8a0fb5cf4", - "reference": "61dddd44389bf25922639afd682f50b8a0fb5cf4", + "url": "https://api.github.com/repos/swagger-api/swagger-ui/zipball/1b33a5976d8f5e02d3bc40de1deae3a4a3642e36", + "reference": "1b33a5976d8f5e02d3bc40de1deae3a4a3642e36", "shasum": "" }, "type": "library", @@ -7009,22 +6060,22 @@ ], "support": { "issues": "https://github.com/swagger-api/swagger-ui/issues", - "source": "https://github.com/swagger-api/swagger-ui/tree/v5.31.0" + "source": "https://github.com/swagger-api/swagger-ui/tree/v5.32.0" }, - "time": "2025-12-11T15:57:42+00:00" + "time": "2026-02-27T11:52:15+00:00" }, { "name": "symfony/console", - "version": "v6.4.32", + "version": "v6.4.35", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "0bc2199c6c1f05276b05956f1ddc63f6d7eb5fc3" + "reference": "49257c96304c508223815ee965c251e7c79e614e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/0bc2199c6c1f05276b05956f1ddc63f6d7eb5fc3", - "reference": "0bc2199c6c1f05276b05956f1ddc63f6d7eb5fc3", + "url": "https://api.github.com/repos/symfony/console/zipball/49257c96304c508223815ee965c251e7c79e614e", + "reference": "49257c96304c508223815ee965c251e7c79e614e", "shasum": "" }, "require": { @@ -7089,7 +6140,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.4.32" + "source": "https://github.com/symfony/console/tree/v6.4.35" }, "funding": [ { @@ -7109,20 +6160,20 @@ "type": "tidelift" } ], - "time": "2026-01-13T08:45:59+00:00" + "time": "2026-03-06T13:31:08+00:00" }, { "name": "symfony/css-selector", - "version": "v7.4.0", + "version": "v7.4.6", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "ab862f478513e7ca2fe9ec117a6f01a8da6e1135" + "reference": "2e7c52c647b406e2107dd867db424a4dbac91864" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/ab862f478513e7ca2fe9ec117a6f01a8da6e1135", - "reference": "ab862f478513e7ca2fe9ec117a6f01a8da6e1135", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/2e7c52c647b406e2107dd867db424a4dbac91864", + "reference": "2e7c52c647b406e2107dd867db424a4dbac91864", "shasum": "" }, "require": { @@ -7158,7 +6209,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v7.4.0" + "source": "https://github.com/symfony/css-selector/tree/v7.4.6" }, "funding": [ { @@ -7178,7 +6229,7 @@ "type": "tidelift" } ], - "time": "2025-10-30T13:39:42+00:00" + "time": "2026-02-17T07:53:42+00:00" }, { "name": "symfony/deprecation-contracts", @@ -7487,88 +6538,18 @@ ], "time": "2024-09-25T14:21:43+00:00" }, - { - "name": "symfony/filesystem", - "version": "v7.4.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/filesystem.git", - "reference": "d551b38811096d0be9c4691d406991b47c0c630a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/d551b38811096d0be9c4691d406991b47c0c630a", - "reference": "d551b38811096d0be9c4691d406991b47c0c630a", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.8" - }, - "require-dev": { - "symfony/process": "^6.4|^7.0|^8.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Filesystem\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides basic utilities for the filesystem", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/filesystem/tree/v7.4.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": "2025-11-27T13:27:24+00:00" - }, { "name": "symfony/finder", - "version": "v6.4.33", + "version": "v6.4.34", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "24965ca011dac87431729640feef8bcf7b5523e0" + "reference": "9590e86be1d1c57bfbb16d0dd040345378c20896" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/24965ca011dac87431729640feef8bcf7b5523e0", - "reference": "24965ca011dac87431729640feef8bcf7b5523e0", + "url": "https://api.github.com/repos/symfony/finder/zipball/9590e86be1d1c57bfbb16d0dd040345378c20896", + "reference": "9590e86be1d1c57bfbb16d0dd040345378c20896", "shasum": "" }, "require": { @@ -7603,7 +6584,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.4.33" + "source": "https://github.com/symfony/finder/tree/v6.4.34" }, "funding": [ { @@ -7623,20 +6604,20 @@ "type": "tidelift" } ], - "time": "2026-01-26T13:03:48+00:00" + "time": "2026-01-28T15:16:37+00:00" }, { "name": "symfony/http-foundation", - "version": "v6.4.33", + "version": "v6.4.35", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "f1a490cc9d595ba7ebe684220e625d1e472ad278" + "reference": "cffffd0a2c037117b742b4f8b379a22a2a33f6d2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/f1a490cc9d595ba7ebe684220e625d1e472ad278", - "reference": "f1a490cc9d595ba7ebe684220e625d1e472ad278", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/cffffd0a2c037117b742b4f8b379a22a2a33f6d2", + "reference": "cffffd0a2c037117b742b4f8b379a22a2a33f6d2", "shasum": "" }, "require": { @@ -7684,7 +6665,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v6.4.33" + "source": "https://github.com/symfony/http-foundation/tree/v6.4.35" }, "funding": [ { @@ -7704,20 +6685,20 @@ "type": "tidelift" } ], - "time": "2026-01-27T15:04:55+00:00" + "time": "2026-03-06T11:15:58+00:00" }, { "name": "symfony/http-kernel", - "version": "v6.4.33", + "version": "v6.4.35", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "73fa5c999d7f741ca544a97d3c791cc97890ae4d" + "reference": "ece1a0da7745a5243683f178155c0412c92691eb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/73fa5c999d7f741ca544a97d3c791cc97890ae4d", - "reference": "73fa5c999d7f741ca544a97d3c791cc97890ae4d", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/ece1a0da7745a5243683f178155c0412c92691eb", + "reference": "ece1a0da7745a5243683f178155c0412c92691eb", "shasum": "" }, "require": { @@ -7758,7 +6739,7 @@ "symfony/config": "^6.1|^7.0", "symfony/console": "^5.4|^6.0|^7.0", "symfony/css-selector": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4.1|^7.0.1", "symfony/dom-crawler": "^5.4|^6.0|^7.0", "symfony/expression-language": "^5.4|^6.0|^7.0", "symfony/finder": "^5.4|^6.0|^7.0", @@ -7802,7 +6783,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v6.4.33" + "source": "https://github.com/symfony/http-kernel/tree/v6.4.35" }, "funding": [ { @@ -7822,20 +6803,20 @@ "type": "tidelift" } ], - "time": "2026-01-28T10:02:13+00:00" + "time": "2026-03-06T16:28:07+00:00" }, { "name": "symfony/mailer", - "version": "v6.4.31", + "version": "v6.4.34", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "8835f93333474780fda1b987cae37e33c3e026ca" + "reference": "01b846f48e53ee4096692a383637a1fa4d577301" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/8835f93333474780fda1b987cae37e33c3e026ca", - "reference": "8835f93333474780fda1b987cae37e33c3e026ca", + "url": "https://api.github.com/repos/symfony/mailer/zipball/01b846f48e53ee4096692a383637a1fa4d577301", + "reference": "01b846f48e53ee4096692a383637a1fa4d577301", "shasum": "" }, "require": { @@ -7886,7 +6867,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v6.4.31" + "source": "https://github.com/symfony/mailer/tree/v6.4.34" }, "funding": [ { @@ -7906,20 +6887,20 @@ "type": "tidelift" } ], - "time": "2025-12-12T07:33:25+00:00" + "time": "2026-02-24T09:34:36+00:00" }, { "name": "symfony/mime", - "version": "v6.4.32", + "version": "v6.4.35", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "7409686879ca36c09fc970a5fa8ff6e93504dba4" + "reference": "b5cce719de25bebd6345c7709774f9ac63ff5cdf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/7409686879ca36c09fc970a5fa8ff6e93504dba4", - "reference": "7409686879ca36c09fc970a5fa8ff6e93504dba4", + "url": "https://api.github.com/repos/symfony/mime/zipball/b5cce719de25bebd6345c7709774f9ac63ff5cdf", + "reference": "b5cce719de25bebd6345c7709774f9ac63ff5cdf", "shasum": "" }, "require": { @@ -7975,7 +6956,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.4.32" + "source": "https://github.com/symfony/mime/tree/v6.4.35" }, "funding": [ { @@ -7995,7 +6976,7 @@ "type": "tidelift" } ], - "time": "2026-01-04T11:53:14+00:00" + "time": "2026-03-05T11:25:28+00:00" }, { "name": "symfony/polyfill-ctype", @@ -8821,16 +7802,16 @@ }, { "name": "symfony/routing", - "version": "v6.4.32", + "version": "v6.4.34", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "0dc6253e864e71b486e8ba4970a56ab849106ebe" + "reference": "5ab3a3e1a03535ec5ca6ce2d39e4369a1096ae47" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/0dc6253e864e71b486e8ba4970a56ab849106ebe", - "reference": "0dc6253e864e71b486e8ba4970a56ab849106ebe", + "url": "https://api.github.com/repos/symfony/routing/zipball/5ab3a3e1a03535ec5ca6ce2d39e4369a1096ae47", + "reference": "5ab3a3e1a03535ec5ca6ce2d39e4369a1096ae47", "shasum": "" }, "require": { @@ -8884,7 +7865,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v6.4.32" + "source": "https://github.com/symfony/routing/tree/v6.4.34" }, "funding": [ { @@ -8904,7 +7885,7 @@ "type": "tidelift" } ], - "time": "2026-01-12T08:31:19+00:00" + "time": "2026-02-24T17:34:50+00:00" }, { "name": "symfony/service-contracts", @@ -8995,16 +7976,16 @@ }, { "name": "symfony/string", - "version": "v7.4.4", + "version": "v7.4.6", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "1c4b10461bf2ec27537b5f36105337262f5f5d6f" + "reference": "9f209231affa85aa930a5e46e6eb03381424b30b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/1c4b10461bf2ec27537b5f36105337262f5f5d6f", - "reference": "1c4b10461bf2ec27537b5f36105337262f5f5d6f", + "url": "https://api.github.com/repos/symfony/string/zipball/9f209231affa85aa930a5e46e6eb03381424b30b", + "reference": "9f209231affa85aa930a5e46e6eb03381424b30b", "shasum": "" }, "require": { @@ -9062,7 +8043,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v7.4.4" + "source": "https://github.com/symfony/string/tree/v7.4.6" }, "funding": [ { @@ -9082,20 +8063,20 @@ "type": "tidelift" } ], - "time": "2026-01-12T10:54:30+00:00" + "time": "2026-02-09T09:33:46+00:00" }, { "name": "symfony/translation", - "version": "v6.4.32", + "version": "v6.4.34", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "d6cc8e2fdd484f2f41d25938b0e8e3915de3cfbc" + "reference": "d07d117db41341511671b0a1a2be48f2772189ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/d6cc8e2fdd484f2f41d25938b0e8e3915de3cfbc", - "reference": "d6cc8e2fdd484f2f41d25938b0e8e3915de3cfbc", + "url": "https://api.github.com/repos/symfony/translation/zipball/d07d117db41341511671b0a1a2be48f2772189ce", + "reference": "d07d117db41341511671b0a1a2be48f2772189ce", "shasum": "" }, "require": { @@ -9161,7 +8142,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v6.4.32" + "source": "https://github.com/symfony/translation/tree/v6.4.34" }, "funding": [ { @@ -9181,7 +8162,7 @@ "type": "tidelift" } ], - "time": "2026-01-12T19:15:33+00:00" + "time": "2026-02-16T20:44:03+00:00" }, { "name": "symfony/translation-contracts", @@ -9433,16 +8414,16 @@ }, { "name": "symfony/yaml", - "version": "v7.4.1", + "version": "v7.4.6", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "24dd4de28d2e3988b311751ac49e684d783e2345" + "reference": "58751048de17bae71c5aa0d13cb19d79bca26391" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/24dd4de28d2e3988b311751ac49e684d783e2345", - "reference": "24dd4de28d2e3988b311751ac49e684d783e2345", + "url": "https://api.github.com/repos/symfony/yaml/zipball/58751048de17bae71c5aa0d13cb19d79bca26391", + "reference": "58751048de17bae71c5aa0d13cb19d79bca26391", "shasum": "" }, "require": { @@ -9485,7 +8466,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v7.4.1" + "source": "https://github.com/symfony/yaml/tree/v7.4.6" }, "funding": [ { @@ -9505,7 +8486,7 @@ "type": "tidelift" } ], - "time": "2025-12-04T18:11:45+00:00" + "time": "2026-02-09T09:33:46+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -9564,31 +8545,31 @@ }, { "name": "tymon/jwt-auth", - "version": "2.2.1", + "version": "2.3.0", "source": { "type": "git", "url": "https://github.com/tymondesigns/jwt-auth.git", - "reference": "42381e56db1bf887c12e5302d11901d65cc74856" + "reference": "6c70930a92710d97e8e52b182fca2176097f33be" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/tymondesigns/jwt-auth/zipball/42381e56db1bf887c12e5302d11901d65cc74856", - "reference": "42381e56db1bf887c12e5302d11901d65cc74856", + "url": "https://api.github.com/repos/tymondesigns/jwt-auth/zipball/6c70930a92710d97e8e52b182fca2176097f33be", + "reference": "6c70930a92710d97e8e52b182fca2176097f33be", "shasum": "" }, "require": { - "illuminate/auth": "^9.0|^10.0|^11.0|^12.0", - "illuminate/contracts": "^9.0|^10.0|^11.0|^12.0", - "illuminate/http": "^9.0|^10.0|^11.0|^12.0", - "illuminate/support": "^9.0|^10.0|^11.0|^12.0", - "lcobucci/jwt": "^4.0", + "illuminate/auth": "^9.0|^10.0|^11.0|^12.0|^13.0", + "illuminate/contracts": "^9.0|^10.0|^11.0|^12.0|^13.0", + "illuminate/http": "^9.0|^10.0|^11.0|^12.0|^13.0", + "illuminate/support": "^9.0|^10.0|^11.0|^12.0|^13.0", + "lcobucci/jwt": "^4.0|^5.0", "nesbot/carbon": "^2.69|^3.0", "php": "^8.0" }, "require-dev": { - "illuminate/console": "^9.0|^10.0|^11.0|^12.0", - "illuminate/database": "^9.0|^10.0|^11.0|^12.0", - "illuminate/routing": "^9.0|^10.0|^11.0|^12.0", + "illuminate/console": "^9.0|^10.0|^11.0|^12.0|^13.0", + "illuminate/database": "^9.0|^10.0|^11.0|^12.0|^13.0", + "illuminate/routing": "^9.0|^10.0|^11.0|^12.0|^13.0", "mockery/mockery": "^1.6", "phpunit/phpunit": "^9.4" }, @@ -9638,13 +8619,7 @@ "issues": "https://github.com/tymondesigns/jwt-auth/issues", "source": "https://github.com/tymondesigns/jwt-auth" }, - "funding": [ - { - "url": "https://www.patreon.com/seantymon", - "type": "patreon" - } - ], - "time": "2025-04-16T22:22:54+00:00" + "time": "2026-03-06T09:50:45+00:00" }, { "name": "vlucas/phpdotenv", @@ -9804,520 +8779,6 @@ ], "time": "2024-11-21T01:49:47+00:00" }, - { - "name": "yajra/laravel-datatables", - "version": "v10.1.0", - "source": { - "type": "git", - "url": "https://github.com/yajra/datatables.git", - "reference": "7837d079edd88f088755a62b254e32068dfe16e1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/yajra/datatables/zipball/7837d079edd88f088755a62b254e32068dfe16e1", - "reference": "7837d079edd88f088755a62b254e32068dfe16e1", - "shasum": "" - }, - "require": { - "php": "^8.1", - "yajra/laravel-datatables-buttons": "^10", - "yajra/laravel-datatables-editor": "1.*", - "yajra/laravel-datatables-export": "^10", - "yajra/laravel-datatables-fractal": "^10", - "yajra/laravel-datatables-html": "^10", - "yajra/laravel-datatables-oracle": "^10" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "10.0-dev" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Arjay Angeles", - "email": "aqangeles@gmail.com" - } - ], - "description": "Laravel DataTables Complete Package.", - "keywords": [ - "datatables", - "jquery", - "laravel" - ], - "support": { - "issues": "https://github.com/yajra/datatables/issues", - "source": "https://github.com/yajra/datatables/tree/v10.1.0" - }, - "funding": [ - { - "url": "https://github.com/sponsors/yajra", - "type": "github" - } - ], - "time": "2023-02-20T05:26:34+00:00" - }, - { - "name": "yajra/laravel-datatables-buttons", - "version": "v10.0.9", - "source": { - "type": "git", - "url": "https://github.com/yajra/laravel-datatables-buttons.git", - "reference": "dc93c0ec8bae12005d7e591beebbe053f0abda7f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/yajra/laravel-datatables-buttons/zipball/dc93c0ec8bae12005d7e591beebbe053f0abda7f", - "reference": "dc93c0ec8bae12005d7e591beebbe053f0abda7f", - "shasum": "" - }, - "require": { - "illuminate/console": "^10", - "php": "^8.1", - "yajra/laravel-datatables-html": "^10", - "yajra/laravel-datatables-oracle": "^10" - }, - "require-dev": { - "barryvdh/laravel-snappy": "^1.0.1", - "larastan/larastan": "^2.4", - "maatwebsite/excel": "^3.1.46", - "orchestra/testbench": "^8", - "rap2hpoutre/fast-excel": "^5.1" - }, - "suggest": { - "barryvdh/laravel-snappy": "Allows exporting of dataTable to PDF using the print view.", - "dompdf/dompdf": "Allows exporting of dataTable to PDF using the DomPDF.", - "maatwebsite/excel": "Exporting of dataTables (excel, csv and PDF) using maatwebsite package.", - "rap2hpoutre/fast-excel": "Faster exporting of dataTables using fast-excel package.", - "yajra/laravel-datatables-export": "Exporting of dataTables (excel, csv and PDF) via livewire and queue worker." - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "Yajra\\DataTables\\ButtonsServiceProvider" - ] - }, - "branch-alias": { - "dev-master": "10.0-dev" - } - }, - "autoload": { - "psr-4": { - "Yajra\\DataTables\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Arjay Angeles", - "email": "aqangeles@gmail.com" - } - ], - "description": "Laravel DataTables Buttons Plugin.", - "keywords": [ - "buttons", - "datatables", - "jquery", - "laravel" - ], - "support": { - "issues": "https://github.com/yajra/laravel-datatables-buttons/issues", - "source": "https://github.com/yajra/laravel-datatables-buttons/tree/v10.0.9" - }, - "funding": [ - { - "url": "https://github.com/sponsors/yajra", - "type": "github" - } - ], - "time": "2024-02-27T06:52:35+00:00" - }, - { - "name": "yajra/laravel-datatables-editor", - "version": "v1.25.4", - "source": { - "type": "git", - "url": "https://github.com/yajra/laravel-datatables-editor.git", - "reference": "23962356700d6b31f49bb119665b13e87303e13f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/yajra/laravel-datatables-editor/zipball/23962356700d6b31f49bb119665b13e87303e13f", - "reference": "23962356700d6b31f49bb119665b13e87303e13f", - "shasum": "" - }, - "require": { - "illuminate/console": "*", - "illuminate/database": "*", - "illuminate/http": "*", - "illuminate/validation": "*", - "php": ">=7.0" - }, - "require-dev": { - "orchestra/testbench": "~3.5" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "Yajra\\DataTables\\EditorServiceProvider" - ] - }, - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "psr-4": { - "Yajra\\DataTables\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Arjay Angeles", - "email": "aqangeles@gmail.com" - } - ], - "description": "Laravel DataTables Editor plugin for Laravel 5.5+.", - "keywords": [ - "JS", - "datatables", - "editor", - "html", - "jquery", - "laravel" - ], - "support": { - "issues": "https://github.com/yajra/laravel-datatables-editor/issues", - "source": "https://github.com/yajra/laravel-datatables-editor/tree/v1.25.4" - }, - "funding": [ - { - "url": "https://www.paypal.me/yajra", - "type": "custom" - }, - { - "url": "https://github.com/yajra", - "type": "github" - }, - { - "url": "https://www.patreon.com/yajra", - "type": "patreon" - } - ], - "time": "2023-02-21T06:57:59+00:00" - }, - { - "name": "yajra/laravel-datatables-export", - "version": "v10.1.1", - "source": { - "type": "git", - "url": "https://github.com/yajra/laravel-datatables-export.git", - "reference": "18a1a22195af7b22b03ba07b47946b1e0aa176f2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/yajra/laravel-datatables-export/zipball/18a1a22195af7b22b03ba07b47946b1e0aa176f2", - "reference": "18a1a22195af7b22b03ba07b47946b1e0aa176f2", - "shasum": "" - }, - "require": { - "ext-json": "*", - "livewire/livewire": "^2.11.2|^3.0.1", - "openspout/openspout": "^4.12.1", - "php": "^8.1", - "phpoffice/phpspreadsheet": "^1.27", - "yajra/laravel-datatables": "^10.0" - }, - "require-dev": { - "nunomaduro/larastan": "^2.4.1", - "orchestra/testbench": "^8.0.1" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "Yajra\\DataTables\\ExportServiceProvider" - ] - }, - "branch-alias": { - "dev-master": "10.0-dev" - } - }, - "autoload": { - "psr-4": { - "Yajra\\DataTables\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Arjay Angeles", - "email": "aqangeles@gmail.com" - } - ], - "description": "Laravel DataTables Queued Export Plugin.", - "keywords": [ - "datatables", - "excel", - "export", - "laravel", - "livewire", - "queue" - ], - "support": { - "issues": "https://github.com/yajra/laravel-datatables-export/issues", - "source": "https://github.com/yajra/laravel-datatables-export/tree/v10.1.1" - }, - "funding": [ - { - "url": "https://github.com/sponsors/yajra", - "type": "github" - } - ], - "time": "2023-11-14T12:59:00+00:00" - }, - { - "name": "yajra/laravel-datatables-fractal", - "version": "v10.0.0", - "source": { - "type": "git", - "url": "https://github.com/yajra/laravel-datatables-fractal.git", - "reference": "765198d1f2b3f0a7c0c00f08ee41ba11be4ab1e2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/yajra/laravel-datatables-fractal/zipball/765198d1f2b3f0a7c0c00f08ee41ba11be4ab1e2", - "reference": "765198d1f2b3f0a7c0c00f08ee41ba11be4ab1e2", - "shasum": "" - }, - "require": { - "league/fractal": "^0.20.1", - "php": "^8.1", - "yajra/laravel-datatables-oracle": "^10.0" - }, - "require-dev": { - "nunomaduro/larastan": "^2.4", - "orchestra/testbench": "^7.21" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "Yajra\\DataTables\\FractalServiceProvider" - ] - }, - "branch-alias": { - "dev-master": "10.0-dev" - } - }, - "autoload": { - "psr-4": { - "Yajra\\DataTables\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Arjay Angeles", - "email": "aqangeles@gmail.com" - } - ], - "description": "Laravel DataTables Fractal Plugin.", - "keywords": [ - "api", - "datatables", - "fractal", - "laravel" - ], - "support": { - "issues": "https://github.com/yajra/laravel-datatables-fractal/issues", - "source": "https://github.com/yajra/laravel-datatables-fractal/tree/v10.0.0" - }, - "time": "2023-02-07T03:46:04+00:00" - }, - { - "name": "yajra/laravel-datatables-html", - "version": "v10.12.0", - "source": { - "type": "git", - "url": "https://github.com/yajra/laravel-datatables-html.git", - "reference": "1c0fc1ff2026457ff29ab1a6a3433a44d59b251d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/yajra/laravel-datatables-html/zipball/1c0fc1ff2026457ff29ab1a6a3433a44d59b251d", - "reference": "1c0fc1ff2026457ff29ab1a6a3433a44d59b251d", - "shasum": "" - }, - "require": { - "ext-json": "*", - "php": "^8.1", - "yajra/laravel-datatables-oracle": "^10.0" - }, - "require-dev": { - "nunomaduro/larastan": "^2.4", - "orchestra/testbench": "^7.21" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "Yajra\\DataTables\\HtmlServiceProvider" - ] - }, - "branch-alias": { - "dev-master": "10.0-dev" - } - }, - "autoload": { - "psr-4": { - "Yajra\\DataTables\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Arjay Angeles", - "email": "aqangeles@gmail.com" - } - ], - "description": "Laravel DataTables HTML builder plugin for Laravel 5.4+.", - "keywords": [ - "JS", - "datatables", - "html", - "jquery", - "laravel" - ], - "support": { - "issues": "https://github.com/yajra/laravel-datatables-html/issues", - "source": "https://github.com/yajra/laravel-datatables-html/tree/v10.12.0" - }, - "funding": [ - { - "url": "https://www.paypal.me/yajra", - "type": "custom" - }, - { - "url": "https://github.com/yajra", - "type": "github" - }, - { - "url": "https://www.patreon.com/yajra", - "type": "patreon" - } - ], - "time": "2023-12-15T04:41:00+00:00" - }, - { - "name": "yajra/laravel-datatables-oracle", - "version": "v10.11.4", - "source": { - "type": "git", - "url": "https://github.com/yajra/laravel-datatables.git", - "reference": "a11dc9cf5ec7f7dc68ad0d5959c5e7aec0af29a5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/yajra/laravel-datatables/zipball/a11dc9cf5ec7f7dc68ad0d5959c5e7aec0af29a5", - "reference": "a11dc9cf5ec7f7dc68ad0d5959c5e7aec0af29a5", - "shasum": "" - }, - "require": { - "illuminate/database": "^9|^10", - "illuminate/filesystem": "^9|^10", - "illuminate/http": "^9|^10", - "illuminate/support": "^9|^10", - "illuminate/view": "^9|^10", - "php": "^8.0.2" - }, - "require-dev": { - "algolia/algoliasearch-client-php": "^3.4", - "larastan/larastan": "^2.4", - "laravel/scout": "^10.5", - "meilisearch/meilisearch-php": "^1.4", - "orchestra/testbench": "^8", - "yajra/laravel-datatables-html": "^9.3.4|^10" - }, - "suggest": { - "yajra/laravel-datatables-buttons": "Plugin for server-side exporting of dataTables.", - "yajra/laravel-datatables-editor": "Plugin to use DataTables Editor (requires a license).", - "yajra/laravel-datatables-export": "Plugin for server-side exporting using livewire and queue worker.", - "yajra/laravel-datatables-fractal": "Plugin for server-side response using Fractal.", - "yajra/laravel-datatables-html": "Plugin for server-side HTML builder of dataTables." - }, - "type": "library", - "extra": { - "laravel": { - "aliases": { - "DataTables": "Yajra\\DataTables\\Facades\\DataTables" - }, - "providers": [ - "Yajra\\DataTables\\DataTablesServiceProvider" - ] - }, - "branch-alias": { - "dev-master": "10.x-dev" - } - }, - "autoload": { - "files": [ - "src/helper.php" - ], - "psr-4": { - "Yajra\\DataTables\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Arjay Angeles", - "email": "aqangeles@gmail.com" - } - ], - "description": "jQuery DataTables API for Laravel 4|5|6|7|8|9|10", - "keywords": [ - "datatables", - "jquery", - "laravel" - ], - "support": { - "issues": "https://github.com/yajra/laravel-datatables/issues", - "source": "https://github.com/yajra/laravel-datatables/tree/v10.11.4" - }, - "funding": [ - { - "url": "https://github.com/sponsors/yajra", - "type": "github" - } - ], - "time": "2024-02-28T05:00:23+00:00" - }, { "name": "zircote/swagger-php", "version": "4.11.1", @@ -10401,91 +8862,6 @@ } ], "packages-dev": [ - { - "name": "barryvdh/laravel-debugbar", - "version": "v3.16.5", - "source": { - "type": "git", - "url": "https://github.com/fruitcake/laravel-debugbar.git", - "reference": "e85c0a8464da67e5b4a53a42796d46a43fc06c9a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/fruitcake/laravel-debugbar/zipball/e85c0a8464da67e5b4a53a42796d46a43fc06c9a", - "reference": "e85c0a8464da67e5b4a53a42796d46a43fc06c9a", - "shasum": "" - }, - "require": { - "illuminate/routing": "^10|^11|^12", - "illuminate/session": "^10|^11|^12", - "illuminate/support": "^10|^11|^12", - "php": "^8.1", - "php-debugbar/php-debugbar": "^2.2.4", - "symfony/finder": "^6|^7|^8" - }, - "require-dev": { - "mockery/mockery": "^1.3.3", - "orchestra/testbench-dusk": "^7|^8|^9|^10", - "phpunit/phpunit": "^9.5.10|^10|^11", - "squizlabs/php_codesniffer": "^3.5" - }, - "type": "library", - "extra": { - "laravel": { - "aliases": { - "Debugbar": "Barryvdh\\Debugbar\\Facades\\Debugbar" - }, - "providers": [ - "Barryvdh\\Debugbar\\ServiceProvider" - ] - }, - "branch-alias": { - "dev-master": "3.16-dev" - } - }, - "autoload": { - "files": [ - "src/helpers.php" - ], - "psr-4": { - "Barryvdh\\Debugbar\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Barry vd. Heuvel", - "email": "barryvdh@gmail.com" - } - ], - "description": "PHP Debugbar integration for Laravel", - "keywords": [ - "debug", - "debugbar", - "dev", - "laravel", - "profiler", - "webprofiler" - ], - "support": { - "issues": "https://github.com/fruitcake/laravel-debugbar/issues", - "source": "https://github.com/fruitcake/laravel-debugbar/tree/v3.16.5" - }, - "funding": [ - { - "url": "https://fruitcake.nl", - "type": "custom" - }, - { - "url": "https://github.com/barryvdh", - "type": "github" - } - ], - "time": "2026-01-23T15:03:22+00:00" - }, { "name": "doctrine/instantiator", "version": "2.0.0", @@ -10743,28 +9119,28 @@ }, { "name": "laravel/sail", - "version": "v1.52.0", + "version": "v1.53.0", "source": { "type": "git", "url": "https://github.com/laravel/sail.git", - "reference": "64ac7d8abb2dbcf2b76e61289451bae79066b0b3" + "reference": "e340eaa2bea9b99192570c48ed837155dbf24fbb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/sail/zipball/64ac7d8abb2dbcf2b76e61289451bae79066b0b3", - "reference": "64ac7d8abb2dbcf2b76e61289451bae79066b0b3", + "url": "https://api.github.com/repos/laravel/sail/zipball/e340eaa2bea9b99192570c48ed837155dbf24fbb", + "reference": "e340eaa2bea9b99192570c48ed837155dbf24fbb", "shasum": "" }, "require": { - "illuminate/console": "^9.52.16|^10.0|^11.0|^12.0", - "illuminate/contracts": "^9.52.16|^10.0|^11.0|^12.0", - "illuminate/support": "^9.52.16|^10.0|^11.0|^12.0", + "illuminate/console": "^9.52.16|^10.0|^11.0|^12.0|^13.0", + "illuminate/contracts": "^9.52.16|^10.0|^11.0|^12.0|^13.0", + "illuminate/support": "^9.52.16|^10.0|^11.0|^12.0|^13.0", "php": "^8.0", - "symfony/console": "^6.0|^7.0", - "symfony/yaml": "^6.0|^7.0" + "symfony/console": "^6.0|^7.0|^8.0", + "symfony/yaml": "^6.0|^7.0|^8.0" }, "require-dev": { - "orchestra/testbench": "^7.0|^8.0|^9.0|^10.0", + "orchestra/testbench": "^7.0|^8.0|^9.0|^10.0|^11.0", "phpstan/phpstan": "^2.0" }, "bin": [ @@ -10802,7 +9178,7 @@ "issues": "https://github.com/laravel/sail/issues", "source": "https://github.com/laravel/sail" }, - "time": "2026-01-01T02:46:03+00:00" + "time": "2026-02-06T12:16:02+00:00" }, { "name": "mockery/mockery", @@ -11153,80 +9529,6 @@ }, "time": "2022-02-21T01:04:05+00:00" }, - { - "name": "php-debugbar/php-debugbar", - "version": "v2.2.6", - "source": { - "type": "git", - "url": "https://github.com/php-debugbar/php-debugbar.git", - "reference": "abb9fa3c5c8dbe7efe03ddba56782917481de3e8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-debugbar/php-debugbar/zipball/abb9fa3c5c8dbe7efe03ddba56782917481de3e8", - "reference": "abb9fa3c5c8dbe7efe03ddba56782917481de3e8", - "shasum": "" - }, - "require": { - "php": "^8.1", - "psr/log": "^1|^2|^3", - "symfony/var-dumper": "^5.4|^6.4|^7.3|^8.0" - }, - "replace": { - "maximebf/debugbar": "self.version" - }, - "require-dev": { - "dbrekelmans/bdi": "^1", - "phpunit/phpunit": "^10", - "symfony/browser-kit": "^6.0|7.0", - "symfony/panther": "^1|^2.1", - "twig/twig": "^3.11.2" - }, - "suggest": { - "kriswallsmith/assetic": "The best way to manage assets", - "monolog/monolog": "Log using Monolog", - "predis/predis": "Redis storage" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.2-dev" - } - }, - "autoload": { - "psr-4": { - "DebugBar\\": "src/DebugBar/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Maxime Bouroumeau-Fuseau", - "email": "maxime.bouroumeau@gmail.com", - "homepage": "http://maximebf.com" - }, - { - "name": "Barry vd. Heuvel", - "email": "barryvdh@gmail.com" - } - ], - "description": "Debug bar in the browser for php application", - "homepage": "https://github.com/php-debugbar/php-debugbar", - "keywords": [ - "debug", - "debug bar", - "debugbar", - "dev" - ], - "support": { - "issues": "https://github.com/php-debugbar/php-debugbar/issues", - "source": "https://github.com/php-debugbar/php-debugbar/tree/v2.2.6" - }, - "time": "2025-12-22T13:21:32+00:00" - }, { "name": "phpunit/php-code-coverage", "version": "9.2.32", diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index aa7a69c..0000000 --- a/docker-compose.yml +++ /dev/null @@ -1,73 +0,0 @@ -version: '3.8' - -services: - app: - build: - context: . - dockerfile: docker/Dockerfile - image: portal - container_name: portal - restart: unless-stopped - working_dir: /var/www - volumes: - - .:/var/www - networks: - - laravel_network - depends_on: - - redis - - mysql: - image: mysql:8.0 - container_name: mysql_portal - environment: - MYSQL_ROOT_PASSWORD: root - MYSQL_DATABASE: portal - MYSQL_USER: admin - MYSQL_PASSWORD: root123 - volumes: - - mysql_data:/var/lib/mysql - ports: - - "3306:3306" - networks: - - laravel_network - - phpmyadmin: - image: phpmyadmin/phpmyadmin - container_name: phpmyadmin_portal - environment: - PMA_HOST: mysql - MYSQL_ROOT_PASSWORD: root - ports: - - "8080:80" - networks: - - laravel_network - - nginx: - image: nginx:alpine - container_name: nginx_portal - ports: - - "80:80" - volumes: - - .:/var/www - - ./docker/nginx.conf:/etc/nginx/nginx.conf - depends_on: - - app - networks: - - laravel_network - - redis: - image: redis:alpine - container_name: laravel_redis_portal - restart: unless-stopped - ports: - - "6379:6379" - networks: - - laravel_network - -networks: - laravel_network: - driver: bridge - -volumes: - mysql_data: - driver: local diff --git a/laravel-echo-server.json b/laravel-echo-server.json deleted file mode 100644 index 2644e14..0000000 --- a/laravel-echo-server.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "authHost": "http://client.test", - "authEndpoint": "/broadcasting/auth", - "clients": [], - "database": "redis", - "databaseConfig": { - "redis": {}, - "sqlite": { - "databasePath": "/database/laravel-echo-server.sqlite" - } - }, - "devMode": true, - "host": null, - "port": "6001", - "protocol": "http", - "socketio": {}, - "secureOptions": 67108864, - "sslCertPath": "", - "sslKeyPath": "", - "sslCertChainPath": "", - "sslPassphrase": "", - "subscribers": { - "http": true, - "redis": true - }, - "apiOriginAllow": { - "allowCors": false, - "allowOrigin": "", - "allowMethods": "", - "allowHeaders": "" - } -} \ No newline at end of file diff --git a/project.md b/project.md deleted file mode 100644 index ced20c4..0000000 --- a/project.md +++ /dev/null @@ -1,125 +0,0 @@ -# Performance & Production Readiness Audit - -**Date:** 2026-01-27 -**Auditor:** Antigravity (AI) -**Target:** Laravel 10 / PHP 8.1+ / MySQL / Redis - ---- - -## 1. CRITICAL PERFORMANCE RISKS (Must fix before production) - -### 🔴 Synchronous vCenter Calls in Livewire -**File:** `app/Http/Livewire/VPSReinstallModal.php` -**Description:** The `getIPFromVCenter()` method calls `vCenterService->loginServer()` and `GetIPAddressVirtualMachine` **synchronously** during component initialization (`loadOsData`). -**Risk:** If vCenter is slow (common) or down, the user's browser will hang indefinitely/timeout when opening the modal. This blocks the PHP-FPM worker. -**Fix:** -- Move vCenter lookup to a background Queue Job. -- Use `wire:poll` or Echo to check for the IP status after the modal opens. -- **Immediate:** Wrap the call in a short timeout or remove it from the read path if not strictly necessary for the initial view. - -### 🔴 Self-Calling HTTP Requests (Loopback) -**File:** `app/Http/Livewire/VPSReinstallModal.php` -**Description:** `confirmReinstall` uses `Http::withoutVerifying()->post(route('service.reinstall.vm')...)` to trigger logic. -**Risk:** -1. **Ineufficiency:** It consumes an extra PHP-FPM worker for the loopback request (Request A waits for Request B). -2. **Security:** `withoutVerifying()` bypasses SSL checks. -**Fix:** Refactor the logic inside `ServiceController::reinstallVM` into a `ReinstallService` and call it directly from the Livewire component. - -### 🔴 Job-within-Job Synchronous Execution -**File:** `app/Jobs/VirtualMachine/ProcessOrderPaymentJob.php` -**Description:** `ProcessOrderPaymentJob` instantiates `CreateVirtualMachineJob` and calls `$vmJob->handle(...)` directly. -**Risk:** If `CreateVirtualMachineJob` takes long (e.g., 2 minutes for vCenter), `ProcessOrderPaymentJob` might timeout (default 60s/90s). If creating 5 VMs, it will surely fail. -**Fix:** -- Dispatch `CreateVirtualMachineJob::dispatch(...)` to the queue. -- Let `ProcessOrderPaymentJob` only *initiate* the process or use a `Batch` to monitor progress. - ---- - -## 2. DATABASE PERFORMANCE REVIEW - -### ⚠️ `Select *` in Repositories -**File:** `app/Repositories/BaseCachedRepository.php` -**Description:** `getAll()` uses `parent::getAll()` which likely does `$model->all()`. -**Risk:** Tables like `vps` (with `text` description) or `user_logs` will eventually destroy memory when `getAll()` is called and cached. -**Fix:** -- Remove `getAll()` from `BaseCachedRepository`. -- Implement `paginate()` by default. -- Use `select(['id', 'name', ...])` for lists. - -### ⚠️ Missing Explicit Indices -**File:** `database/migrations/2026_01_27_151851_update_forigin_key_module_ip_table.php` -**Description:** FKs added to `module_host_id` and `module_network_id`. While MySQL often indexes FKs, explicit indexing ensures query performance for `where('module_host_id', $id)`. -**Fix:** Verify indices exist or add `$table->index('module_host_id')`. - ---- - -## 3. LIVEWIRE & FRONTEND PERFORMANCE - -### ⚠️ Heavy Mount Logic -**File:** `app/Http/Livewire/VPSReinstallModal.php` -**Description:** `loadOsData` performs multiple DB queries (`VPS::with`, `OsGroup::with` with closures) and checking Invoice items. -**Fix:** Use **Lazy Loading** (`wire:init` or `lazy` attribute in Livewire 3) to load heavy data *after* the modal opens. - ---- - -## 4. QUEUE, REDIS & BACKGROUND JOBS - -### ⚠️ Queue Blocking -**Description:** `ProcessOrderPaymentJob` combines "Payment Logic" (fast) with "VM Creation" (slow). -**Fix:** -- Separate queues: `queue:work --queue=high,default,low`. -- Put `CreateVirtualMachineJob` on `low` or `provisioning` queue. -- Keep `ProcessOrderPaymentJob` on `high` to update payment status quickly. - ---- - -## 5. CACHING STRATEGY REVIEW - -### 🔴 Dangerous 'getAll' Cache -**File:** `app/Repositories/BaseCachedRepository.php` -**Description:** Caches the *entire table result* of `getAll()`. -**Risk:** Redis memory exhaustion. -**Fix:** -- **Delete** `getAll` caching logic. -- Cache *individual* items by ID (`find($id)` is fine). -- Cache configuration/settings, not transactional data lists. - ---- - -## 6. SECURITY & PRODUCTION CONFIG CHECK - -### ⚠️ SSL Verification Disabled -**File:** `app/Http/Livewire/VPSReinstallModal.php` -**Description:** `Http::withoutVerifying()` is used. -**Fix:** Fix the root cause (self-signed certs?) or use internal service calls instead of HTTP loopbacks. - -### ⚠️ Sensitive Logging -**File:** `app/Jobs/VirtualMachine/ProcessOrderPaymentJob.php` -**Description:** Sends detailed error logs to Telegram. -**Risk:** Ensure `trace` or `message` doesn't contain API keys / credit card info (unlikely in exception message, but possible). - ---- - -## 7. SCALABILITY BOTTLENECKS - -### At 1k Users -- `BaseCachedRepository::getAll()` will start causing 500 errors (OOM). - -### At 10k Users -- Synchronous vCenter calls will cause "No child processes" in PHP-FPM during traffic spikes. -- Redis will fill up if `getAll` isn't removed. - ---- - -## 8. FINAL PRODUCTION CHECKLIST - -### Must Fix Before Launch -- [ ] **Refactor**: Remove `Http::withoutVerifying()` loopback in `VPSReinstallModal`. -- [ ] **Async**: Move `getIPFromVCenter` to background or make it lazy/optional. -- [ ] **Cache**: Disable `getAll()` caching in `BaseCachedRepository`. -- [ ] **Queue**: Decouple `CreateVirtualMachineJob` from `ProcessOrderPaymentJob` (dispatch don't call handle). - -### Should Fix Soon -- [ ] **Database**: Add explicit indices for searching fields in `vps` and `orders`. -- [ ] **Refactor**: Move logic from Controllers/Livewire to Services to avoid loopback HTTP calls. - diff --git a/rules.md b/rules.md deleted file mode 100644 index da4e793..0000000 --- a/rules.md +++ /dev/null @@ -1,234 +0,0 @@ -# REST API Rules Documentation - -## Overview -Chuyển đổi từ Laravel Views sang REST API sử dụng JWT Authentication. - -## Base URL -``` -/api/v1 -``` - -## Authentication -- **Admin API**: Sử dụng guard `admins-api` với JWT -- **Client API**: Sử dụng guard `client` với JWT (đã có sẵn) - -## Headers -``` -Authorization: Bearer -Accept: application/json -Content-Type: application/json -``` - -## Response Format -### Success -```json -{ - "error": false, - "data": { ... } -} -``` - -### Error -```json -{ - "error": true, - "message": "Error message" -} -``` - ---- - -## API Endpoints - -### 1. Authentication (Admin) -| Method | Endpoint | Description | -|--------|----------|-------------| -| POST | `/administrator/login` | Đăng nhập admin | -| POST | `/administrator/logout` | Đăng xuất | -| POST | `/administrator/refresh` | Refresh token | -| GET | `/administrator/me` | Lấy thông tin admin hiện tại | - -### 2. Customers -| Method | Endpoint | Description | -|--------|----------|-------------| -| GET | `/administrator/customers` | Danh sách khách hàng | -| POST | `/administrator/customers` | Tạo khách hàng mới | -| GET | `/administrator/customers/{id}` | Chi tiết khách hàng | -| PUT | `/administrator/customers/{id}` | Cập nhật khách hàng | -| DELETE | `/administrator/customers/{id}` | Xóa khách hàng | -| POST | `/administrator/customers/{id}/reset-password` | Reset password | -| POST | `/administrator/customers/{id}/add-credit` | Nạp tiền | -| GET | `/administrator/customers/{id}/products` | Danh sách sản phẩm | -| GET | `/administrator/customers/{id}/invoices` | Danh sách hóa đơn | -| GET | `/administrator/customers/{id}/transactions` | Danh sách giao dịch | -| GET | `/administrator/customers/{id}/services` | Danh sách dịch vụ (VPS/Hosting) | -| GET | `/administrator/customers/trash` | Danh sách đã xóa | -| POST | `/administrator/customers/{id}/restore` | Khôi phục | -| DELETE | `/administrator/customers/{id}/force` | Xóa vĩnh viễn | - -### 3. Orders -| Method | Endpoint | Description | -|--------|----------|-------------| -| GET | `/administrator/orders` | Danh sách đơn hàng | -| POST | `/administrator/orders` | Tạo đơn hàng mới | -| GET | `/administrator/orders/{id}` | Chi tiết đơn hàng | -| PUT | `/administrator/orders/{id}` | Cập nhật đơn hàng | -| DELETE | `/administrator/orders/{id}` | Xóa đơn hàng | -| POST | `/administrator/orders/{id}/accept` | Chấp nhận đơn hàng | -| POST | `/administrator/orders/{id}/cancel` | Hủy đơn hàng | - -### 4. Invoices -| Method | Endpoint | Description | -|--------|----------|-------------| -| GET | `/administrator/invoices` | Danh sách hóa đơn | -| POST | `/administrator/invoices` | Tạo hóa đơn mới | -| GET | `/administrator/invoices/{id}` | Chi tiết hóa đơn | -| PUT | `/administrator/invoices/{id}` | Cập nhật hóa đơn | -| DELETE | `/administrator/invoices/{id}` | Xóa hóa đơn | -| POST | `/administrator/invoices/{id}/paid` | Đánh dấu đã thanh toán | -| POST | `/administrator/invoices/{id}/cancel` | Hủy hóa đơn | - -### 5. Products -| Method | Endpoint | Description | -|--------|----------|-------------| -| GET | `/administrator/products` | Danh sách sản phẩm | -| POST | `/administrator/products` | Tạo sản phẩm mới | -| GET | `/administrator/products/{id}` | Chi tiết sản phẩm | -| PUT | `/administrator/products/{id}` | Cập nhật sản phẩm | -| DELETE | `/administrator/products/{id}` | Xóa sản phẩm | -| POST | `/administrator/products/{id}/duplicate` | Nhân bản sản phẩm | -| POST | `/administrator/products/import` | Import sản phẩm từ Excel | -| GET | `/administrator/products/export` | Export sản phẩm ra Excel | - -### 6. Product Categories -| Method | Endpoint | Description | -|--------|----------|-------------| -| GET | `/administrator/product-categories` | Danh sách danh mục | -| POST | `/administrator/product-categories` | Tạo danh mục mới | -| GET | `/administrator/product-categories/{id}` | Chi tiết danh mục | -| PUT | `/administrator/product-categories/{id}` | Cập nhật danh mục | -| DELETE | `/administrator/product-categories/{id}` | Xóa danh mục | - -### 7. Payments -| Method | Endpoint | Description | -|--------|----------|-------------| -| GET | `/administrator/payments` | Danh sách phương thức thanh toán | -| POST | `/administrator/payments` | Tạo phương thức thanh toán | -| GET | `/administrator/payments/{id}` | Chi tiết phương thức thanh toán | -| PUT | `/administrator/payments/{id}` | Cập nhật phương thức thanh toán | -| DELETE | `/administrator/payments/{id}` | Xóa phương thức thanh toán | - -### 8. Modules - VPS/VMware -| Method | Endpoint | Description | -|--------|----------|-------------| -| GET | `/administrator/vps` | Danh sách VPS | -| GET | `/administrator/vps/{id}` | Chi tiết VPS | -| PUT | `/administrator/vps/{id}` | Cập nhật VPS | -| POST | `/administrator/vps/{id}/power-on` | Bật VPS | -| POST | `/administrator/vps/{id}/power-off` | Tắt VPS | -| POST | `/administrator/vps/{id}/restart` | Restart VPS | -| POST | `/administrator/vps/{id}/reinstall` | Cài lại VPS | - -### 9. Modules - Hosting -| Method | Endpoint | Description | -|--------|----------|-------------| -| GET | `/administrator/hosting` | Danh sách Hosting | -| GET | `/administrator/hosting/{id}` | Chi tiết Hosting | -| PUT | `/administrator/hosting/{id}` | Cập nhật Hosting | -| POST | `/administrator/hosting` | Tạo Hosting mới | -| DELETE | `/administrator/hosting/{id}` | Xóa Hosting | - -### 10. Modules - Domain -| Method | Endpoint | Description | -|--------|----------|-------------| -| GET | `/administrator/domains` | Danh sách Domain | -| GET | `/administrator/domains/{id}` | Chi tiết Domain | -| PUT | `/administrator/domains/{id}` | Cập nhật Domain | - -### 11. Modules - DNS -| Method | Endpoint | Description | -|--------|----------|-------------| -| GET | `/administrator/dns` | Danh sách DNS | -| GET | `/administrator/dns/{id}` | Chi tiết DNS | -| PUT | `/administrator/dns/{id}` | Cập nhật DNS | -| POST | `/administrator/dns` | Tạo DNS mới | -| DELETE | `/administrator/dns/{id}` | Xóa DNS | - -### 12. Modules - IP Pool -| Method | Endpoint | Description | -|--------|----------|-------------| -| GET | `/administrator/ip-pools` | Danh sách IP Pool | -| GET | `/administrator/ip-pools/{id}` | Chi tiết IP Pool | -| PUT | `/administrator/ip-pools/{id}` | Cập nhật IP Pool | -| POST | `/administrator/ip-pools` | Tạo IP Pool mới | -| DELETE | `/administrator/ip-pools/{id}` | Xóa IP Pool | - -### 13. vCenter Management -| Method | Endpoint | Description | -|--------|----------|-------------| -| GET | `/administrator/vcenter` | Danh sách vCenter | -| POST | `/administrator/vcenter` | Tạo vCenter mới | -| GET | `/administrator/vcenter/{id}` | Chi tiết vCenter | -| PUT | `/administrator/vcenter/{id}` | Cập nhật vCenter | -| DELETE | `/administrator/vcenter/{id}` | Xóa vCenter | -| POST | `/administrator/vcenter/sync` | Đồng bộ vCenter | -| GET | `/administrator/vcenter/tree` | Lấy cây thư mục | - -### 14. Settings -| Method | Endpoint | Description | -|--------|----------|-------------| -| GET | `/administrator/settings` | Danh sách cài đặt | -| PUT | `/administrator/settings` | Cập nhật cài đặt | - -### 15. Reports/Logs -| Method | Endpoint | Description | -|--------|----------|-------------| -| GET | `/administrator/logs` | Danh sách logs | -| GET | `/administrator/logs/customer/{id}` | Logs của khách hàng | - -### 16. Media -| Method | Endpoint | Description | -|--------|----------|-------------| -| GET | `/administrator/media` | Danh sách media | -| POST | `/administrator/media` | Upload media | -| DELETE | `/administrator/media/{id}` | Xóa media | - ---- - -## DataTable Support -Các endpoint danh sách hỗ trợ tham số DataTable: -- `draw`: Draw counter -- `start`: Paging start -- `length`: Page length -- `search[value]`: Search value -- `order[0][column]`: Sort column -- `order[0][dir]`: Sort direction - -Response DataTable: -```json -{ - "draw": 1, - "recordsTotal": 100, - "recordsFiltered": 100, - "data": [...] -} -``` - ---- - -## Pagination -Các endpoint danh sách hỗ trợ phân trang: -- `page`: Số trang (mặc định: 1) -- `limit`: Số item trên trang (mặc định: 15) - ---- - -## Error Codes -| Code | Description | -|------|-------------| -| 400 | Bad Request | -| 401 | Unauthorized | -| 403 | Forbidden | -| 404 | Not Found | -| 422 | Validation Error | -| 500 | Server Error |