From 048989fed8990c11980592f132fd952209563ada Mon Sep 17 00:00:00 2001 From: salam Date: Mon, 20 Apr 2026 10:33:09 +0200 Subject: [PATCH] wip SimpleExcelReader with LazyCollection --- .../Tables/StatistikoImportsTable.php | 25 +- app/Filament/Imports/StatistikoImporter.php | 189 +++++++++ app/Models/StatistikoPlayer.php | 22 +- app/Providers/Filament/AdminPanelProvider.php | 6 +- composer.lock | 377 +++++++++--------- ...4_20_085306_mongo_db_statistiko_player.php | 23 ++ 6 files changed, 442 insertions(+), 200 deletions(-) create mode 100644 app/Filament/Imports/StatistikoImporter.php create mode 100644 database/migrations/2026_04_20_085306_mongo_db_statistiko_player.php diff --git a/app/Filament/Clusters/StaticData/Resources/StatistikoImports/Tables/StatistikoImportsTable.php b/app/Filament/Clusters/StaticData/Resources/StatistikoImports/Tables/StatistikoImportsTable.php index 5b89df16..6c3d97c9 100644 --- a/app/Filament/Clusters/StaticData/Resources/StatistikoImports/Tables/StatistikoImportsTable.php +++ b/app/Filament/Clusters/StaticData/Resources/StatistikoImports/Tables/StatistikoImportsTable.php @@ -2,11 +2,13 @@ namespace App\Filament\Clusters\StaticData\Resources\StatistikoImports\Tables; +use App\Filament\Imports\StatistikoImporter; use Filament\Actions\Action; use Filament\Actions\ActionGroup; use Filament\Actions\BulkActionGroup; use Filament\Actions\DeleteAction; use Filament\Actions\DeleteBulkAction; +use Filament\Notifications\Notification; use Filament\Tables\Columns\IconColumn; use Filament\Tables\Columns\SelectColumn; use Filament\Tables\Columns\TextColumn; @@ -18,6 +20,7 @@ class StatistikoImportsTable public static function configure(Table $table): Table { return $table + ->striped() ->columns([ IconColumn::make('sport.icon') ->label('Sport') @@ -57,11 +60,25 @@ class StatistikoImportsTable ->recordActions([ ActionGroup::make([ Action::make('Import') - ->label('Just Import (very fast)') - ->icon('phosphor-database'), + ->label('Import (fast)') + ->icon('phosphor-database') + ->action(function ($record) { + StatistikoImporter::run('import', $record); + })->successNotification( + Notification::make() + ->info() + ->title('Import started') + ), Action::make('Update') - ->label('Import and Update (slow)') - ->icon('phosphor-database'), + ->label('Update or Import (slow)') + ->icon('phosphor-database') + ->action(function ($record) { + StatistikoImporter::run('update', $record); + })->successNotification( + Notification::make() + ->info() + ->title('Import & Update started') + ), DeleteAction::make() ->label('Delete file'), ]), diff --git a/app/Filament/Imports/StatistikoImporter.php b/app/Filament/Imports/StatistikoImporter.php new file mode 100644 index 00000000..67eb90ba --- /dev/null +++ b/app/Filament/Imports/StatistikoImporter.php @@ -0,0 +1,189 @@ +getMessage())->limit(100)->value()); + } + + self::endBenchmark(); + } + + protected static function startBenchmark(string $table): void + { + self::$startRowCount = DB::connection('mongodb')->table($table)->count(); + self::$benchmarkStartTime = microtime(true); + self::$benchmarkStartMemory = memory_get_usage(); + DB::connection('mongodb')->enableQueryLog(); + } + + protected static function endBenchmark(string $table = 'customers'): void + { + $executionTime = microtime(true) - self::$benchmarkStartTime; + $memoryUsage = round((memory_get_usage() - self::$benchmarkStartMemory) / 1024 / 1024, 2); + + $logs = DB::connection('mongodb')->getQueryLog(); + $queriesCount = \count($logs); + + // Get row count after we've stopped tracking queries + $rowDiff = DB::connection('mongodb')->table($table)->count() - self::$startRowCount; + + $formattedTime = match (true) { + $executionTime >= 60 => sprintf('%dm %ds', floor($executionTime / 60), $executionTime % 60), + $executionTime >= 1 => round($executionTime, 2).'s', + default => round($executionTime * 1000).'ms', + }; + + $str = '⚡ TIME: '.$formattedTime; + $str .= '
MEM: '.$memoryUsage.'MB'; + $str .= '
SQL: '.number_format($queriesCount); + $str .= '
ROWS: '.number_format($rowDiff); + + $recipient = auth()->user(); + Notification::make() + ->success() + ->title('Import compleated') + ->body(new HtmlString($str)) + ->sendToDatabase($recipient); + } + + private static function handleImport(string $filePath, $table, $mode): void + { + $now = now()->format('Y-m-d H:i:s'); + + $chunkSize = 1000; + + SimpleExcelReader::create($filePath) + ->getRows() + ->chunk($chunkSize) + ->each(function ($rowProperties) { + dd($rowProperties); + // processing rows + }); + + // LazyCollection::make(function () use ($filePath) { + // $handle = fopen($filePath, 'r'); + // fgets($handle); // skip header + + // while (($line = fgets($handle)) !== false) { + // yield str_getcsv($line); + // } + // fclose($handle); + // })->each(function ($row) { + // dd($row); + // }); + // ->map(fn ($row) => [ + // 'custom_id' => $row[0], + // 'name' => $row[1], + // 'email' => $row[2], + // 'company' => $row[3], + // 'city' => $row[4], + // 'country' => $row[5], + // 'birthday' => $row[6], + // 'created_at' => $now, + // 'updated_at' => $now, + // ]) + // ->chunk($chunkSize) + // ->each(fn ($chunk) => $result = StatistikoPlayer::upsert( + // [ + // ['title' => 'Inspector Maigret', 'recommended' => false, 'runtime' => 128], + // ['title' => 'Petit Maman', 'recommended' => true, 'runtime' => 72], + // ], + // 'title', + // 'recommended', + // )); + } + + private static function import11Concurrent(string $filePath): void + { + // 100 168ms + // 1K 172ms + // 10K 234ms + // 100K 595ms + // 1M 4.36s + // 2M 8.8s + $now = now()->format('Y-m-d H:i:s'); + $numberOfProcesses = 10; + + $tasks = []; + for ($i = 0; $i < $numberOfProcesses; $i++) { + $tasks[] = function () use ($filePath, $i, $numberOfProcesses, $now) { + DB::reconnect(); + + $handle = fopen($filePath, 'r'); + fgets($handle); // Skip header + $currentLine = 0; + $customers = []; + + while (($line = fgets($handle)) !== false) { + // Each process takes every Nth line + if ($currentLine++ % $numberOfProcesses !== $i) { + continue; + } + + $row = str_getcsv($line); + $customers[] = [ + 'custom_id' => $row[0], + 'name' => $row[1], + 'email' => $row[2], + 'company' => $row[3], + 'city' => $row[4], + 'country' => $row[5], + 'birthday' => $row[6], + 'created_at' => $now, + 'updated_at' => $now, + ]; + + if (count($customers) === 1000) { + DB::table('customers')->insert($customers); + $customers = []; + } + } + + if (! empty($customers)) { + DB::table('customers')->insert($customers); + } + + fclose($handle); + + return true; + }; + } + + Concurrency::run($tasks); + + } +} diff --git a/app/Models/StatistikoPlayer.php b/app/Models/StatistikoPlayer.php index 0cae3509..a3f372b7 100644 --- a/app/Models/StatistikoPlayer.php +++ b/app/Models/StatistikoPlayer.php @@ -13,18 +13,18 @@ class StatistikoPlayer extends Model protected $table = 'player'; protected $fillable = [ - 'id_giocatore', - 'giocatore', - 'data_di_nascita', - 'altezza', - 'nazionalita', - 'posizione', + 'player_id', + 'name', + 'full_name', + 'birthdate', + 'height', + 'nationality', + 'position', 'sport_radar_id', 'id_squadra_tm', - 'nome_completo', - 'rigorista', + 'rigorist', 'national_team_id', - 'data_aggiornamento', + 'last_update', 'league_code', 'team_code', 'team_name', @@ -33,8 +33,8 @@ class StatistikoPlayer extends Model protected function casts(): array { return [ - 'data_di_nascita' => 'date', - 'data_aggiornamento' => 'date', + 'birthdate' => 'date', + 'last_update' => 'date', ]; } } diff --git a/app/Providers/Filament/AdminPanelProvider.php b/app/Providers/Filament/AdminPanelProvider.php index fdbc3e3a..118f4f3e 100644 --- a/app/Providers/Filament/AdminPanelProvider.php +++ b/app/Providers/Filament/AdminPanelProvider.php @@ -2,7 +2,7 @@ namespace App\Providers\Filament; -use Agencetwogether\HooksHelper\HooksHelperPlugin; +// use Agencetwogether\HooksHelper\HooksHelperPlugin; use App\Filament\Exports\BetfairExporter; use App\Http\Middleware\RecordUserActivity; use Awcodes\LightSwitch\Enums\Alignment; @@ -18,7 +18,7 @@ use Filament\Http\Middleware\Authenticate; use Filament\Http\Middleware\AuthenticateSession; use Filament\Http\Middleware\DisableBladeIconComponents; use Filament\Http\Middleware\DispatchServingFilamentEvent; -use Filament\Pages\Dashboard; +// use Filament\Pages\Dashboard; use Filament\Panel; use Filament\PanelProvider; use Filament\Support\Enums\Width; @@ -65,7 +65,7 @@ class AdminPanelProvider extends PanelProvider ->emailVerification() ->emailChangeVerification() ->databaseNotifications() - // ->databaseNotificationsPolling('15s') default is 30 + ->databaseNotificationsPolling('10s') // default is 30 ->sidebarCollapsibleOnDesktop() ->profile(isSimple: false) ->default() diff --git a/composer.lock b/composer.lock index 1971595c..3356634b 100644 --- a/composer.lock +++ b/composer.lock @@ -2955,20 +2955,20 @@ }, { "name": "laravel/framework", - "version": "v11.51.0", + "version": "v12.56.0", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "c8f9a04594b7044a189a3194cfb3594251eb74e5" + "reference": "dac16d424b59debb2273910dde88eb7050a2a709" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/c8f9a04594b7044a189a3194cfb3594251eb74e5", - "reference": "c8f9a04594b7044a189a3194cfb3594251eb74e5", + "url": "https://api.github.com/repos/laravel/framework/zipball/dac16d424b59debb2273910dde88eb7050a2a709", + "reference": "dac16d424b59debb2273910dde88eb7050a2a709", "shasum": "" }, "require": { - "brick/math": "^0.9.3|^0.10.2|^0.11|^0.12|^0.13|^0.14", + "brick/math": "^0.11|^0.12|^0.13|^0.14", "composer-runtime-api": "^2.2", "doctrine/inflector": "^2.0.5", "dragonmantank/cron-expression": "^3.4", @@ -2983,32 +2983,34 @@ "fruitcake/php-cors": "^1.3", "guzzlehttp/guzzle": "^7.8.2", "guzzlehttp/uri-template": "^1.0", - "laravel/prompts": "^0.1.18|^0.2.0|^0.3.0", + "laravel/prompts": "^0.3.0", "laravel/serializable-closure": "^1.3|^2.0", - "league/commonmark": "^2.7", + "league/commonmark": "^2.8.1", "league/flysystem": "^3.25.1", "league/flysystem-local": "^3.25.1", "league/uri": "^7.5.1", "monolog/monolog": "^3.0", - "nesbot/carbon": "^2.72.6|^3.8.4", + "nesbot/carbon": "^3.8.4", "nunomaduro/termwind": "^2.0", "php": "^8.2", "psr/container": "^1.1.1|^2.0.1", "psr/log": "^1.0|^2.0|^3.0", "psr/simple-cache": "^1.0|^2.0|^3.0", "ramsey/uuid": "^4.7", - "symfony/console": "^7.0.3", - "symfony/error-handler": "^7.0.3", - "symfony/finder": "^7.0.3", + "symfony/console": "^7.2.0", + "symfony/error-handler": "^7.2.0", + "symfony/finder": "^7.2.0", "symfony/http-foundation": "^7.2.0", - "symfony/http-kernel": "^7.0.3", - "symfony/mailer": "^7.0.3", - "symfony/mime": "^7.0.3", - "symfony/polyfill-php83": "^1.31", - "symfony/process": "^7.0.3", - "symfony/routing": "^7.0.3", - "symfony/uid": "^7.0.3", - "symfony/var-dumper": "^7.0.3", + "symfony/http-kernel": "^7.2.0", + "symfony/mailer": "^7.2.0", + "symfony/mime": "^7.2.0", + "symfony/polyfill-php83": "^1.33", + "symfony/polyfill-php84": "^1.33", + "symfony/polyfill-php85": "^1.33", + "symfony/process": "^7.2.0", + "symfony/routing": "^7.2.0", + "symfony/uid": "^7.2.0", + "symfony/var-dumper": "^7.2.0", "tijsverkoyen/css-to-inline-styles": "^2.2.5", "vlucas/phpdotenv": "^5.6.1", "voku/portable-ascii": "^2.0.2" @@ -3040,6 +3042,7 @@ "illuminate/filesystem": "self.version", "illuminate/hashing": "self.version", "illuminate/http": "self.version", + "illuminate/json-schema": "self.version", "illuminate/log": "self.version", "illuminate/macroable": "self.version", "illuminate/mail": "self.version", @@ -3049,6 +3052,7 @@ "illuminate/process": "self.version", "illuminate/queue": "self.version", "illuminate/redis": "self.version", + "illuminate/reflection": "self.version", "illuminate/routing": "self.version", "illuminate/session": "self.version", "illuminate/support": "self.version", @@ -3072,17 +3076,18 @@ "league/flysystem-read-only": "^3.25.1", "league/flysystem-sftp-v3": "^3.25.1", "mockery/mockery": "^1.6.10", - "orchestra/testbench-core": "^9.18.0", - "pda/pheanstalk": "^5.0.6", + "opis/json-schema": "^2.4.1", + "orchestra/testbench-core": "^10.9.0", + "pda/pheanstalk": "^5.0.6|^7.0.0", "php-http/discovery": "^1.15", - "phpstan/phpstan": "2.1.41", - "phpunit/phpunit": "^10.5.35|^11.3.6|^12.0.1", - "predis/predis": "^2.3", - "resend/resend-php": "^0.10.0", - "symfony/cache": "^7.0.3", - "symfony/http-client": "^7.0.3", - "symfony/psr-http-message-bridge": "^7.0.3", - "symfony/translation": "^7.0.3" + "phpstan/phpstan": "^2.1.41", + "phpunit/phpunit": "^10.5.35|^11.5.3|^12.0.1", + "predis/predis": "^2.3|^3.0", + "resend/resend-php": "^0.10.0|^1.0", + "symfony/cache": "^7.2.0", + "symfony/http-client": "^7.2.0", + "symfony/psr-http-message-bridge": "^7.2.0", + "symfony/translation": "^7.2.0" }, "suggest": { "ably/ably-php": "Required to use the Ably broadcast driver (^1.0).", @@ -3097,7 +3102,7 @@ "ext-pdo": "Required to use all database features.", "ext-posix": "Required to use all features of the queue worker.", "ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0|^6.0).", - "fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).", + "fakerphp/faker": "Required to generate fake data using the fake() helper (^1.23).", "filp/whoops": "Required for friendly error pages in development (^2.14.3).", "laravel/tinker": "Required to use the tinker console command (^2.0).", "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^3.25.1).", @@ -3108,22 +3113,22 @@ "mockery/mockery": "Required to use mocking (^1.6).", "pda/pheanstalk": "Required to use the beanstalk queue driver (^5.0).", "php-http/discovery": "Required to use PSR-7 bridging features (^1.15).", - "phpunit/phpunit": "Required to use assertions and run tests (^10.5.35|^11.3.6|^12.0.1).", - "predis/predis": "Required to use the predis connector (^2.3).", + "phpunit/phpunit": "Required to use assertions and run tests (^10.5.35|^11.5.3|^12.0.1).", + "predis/predis": "Required to use the predis connector (^2.3|^3.0).", "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^6.0|^7.0).", - "resend/resend-php": "Required to enable support for the Resend mail transport (^0.10.0).", - "symfony/cache": "Required to PSR-6 cache bridge (^7.0).", - "symfony/filesystem": "Required to enable support for relative symbolic links (^7.0).", - "symfony/http-client": "Required to enable support for the Symfony API mail transports (^7.0).", - "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^7.0).", - "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^7.0).", - "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^7.0)." + "resend/resend-php": "Required to enable support for the Resend mail transport (^0.10.0|^1.0).", + "symfony/cache": "Required to PSR-6 cache bridge (^7.2).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^7.2).", + "symfony/http-client": "Required to enable support for the Symfony API mail transports (^7.2).", + "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^7.2).", + "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^7.2).", + "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^7.2)." }, "type": "library", "extra": { "branch-alias": { - "dev-master": "11.x-dev" + "dev-master": "12.x-dev" } }, "autoload": { @@ -3134,6 +3139,7 @@ "src/Illuminate/Filesystem/functions.php", "src/Illuminate/Foundation/helpers.php", "src/Illuminate/Log/functions.php", + "src/Illuminate/Reflection/helpers.php", "src/Illuminate/Support/functions.php", "src/Illuminate/Support/helpers.php" ], @@ -3142,7 +3148,8 @@ "Illuminate\\Support\\": [ "src/Illuminate/Macroable/", "src/Illuminate/Collections/", - "src/Illuminate/Conditionable/" + "src/Illuminate/Conditionable/", + "src/Illuminate/Reflection/" ] } }, @@ -3166,7 +3173,7 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2026-03-26T14:54:53+00:00" + "time": "2026-03-26T14:51:54+00:00" }, { "name": "laravel/prompts", @@ -4413,27 +4420,27 @@ }, { "name": "mongodb/laravel-mongodb", - "version": "5.1.1", + "version": "5.7.1", "source": { "type": "git", - "url": "https://github.com/mongodb/laravel-mongodb.git", - "reference": "cc7e5ffd0e8e3a9acfebd7aa5a5aabac2fc5eac4" + "url": "https://github.com/mongodb/laravel-mongodb", + "reference": "6e371e8e6deb9193f99a84c578e6c9d0a960e43a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mongodb/laravel-mongodb/zipball/cc7e5ffd0e8e3a9acfebd7aa5a5aabac2fc5eac4", - "reference": "cc7e5ffd0e8e3a9acfebd7aa5a5aabac2fc5eac4", + "url": "https://api.github.com/repos/mongodb/laravel-mongodb/zipball/6e371e8e6deb9193f99a84c578e6c9d0a960e43a", + "reference": "6e371e8e6deb9193f99a84c578e6c9d0a960e43a", "shasum": "" }, "require": { "composer-runtime-api": "^2.0.0", - "ext-mongodb": "^1.15", - "illuminate/cache": "^10.36|^11", - "illuminate/container": "^10.0|^11", - "illuminate/database": "^10.30|^11", - "illuminate/events": "^10.0|^11", - "illuminate/support": "^10.0|^11", - "mongodb/mongodb": "^1.18", + "ext-mongodb": "^1.21|^2", + "illuminate/cache": "^10.36|^11|^12|^13.0", + "illuminate/container": "^10.0|^11|^12|^13.0", + "illuminate/database": "^10.30|^11|^12|^13.0", + "illuminate/events": "^10.0|^11|^12|^13.0", + "illuminate/support": "^10.0|^11|^12|^13.0", + "mongodb/mongodb": "^1.21|^2", "php": "^8.1" }, "conflict": { @@ -4443,20 +4450,19 @@ "jenssegers/mongodb": "self.version" }, "require-dev": { - "doctrine/coding-standard": "12.0.x-dev", + "doctrine/coding-standard": "^12.0", + "laravel/scout": "^10.3", "league/flysystem-gridfs": "^3.28", "league/flysystem-read-only": "^3.0", "mockery/mockery": "^1.4.4", - "mongodb/builder": "^0.2", - "orchestra/testbench": "^8.0|^9.0", - "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^10.3", - "rector/rector": "^1.2", - "spatie/laravel-query-builder": "^5.6" + "orchestra/testbench": "^8.0|^9.0|^10.0|^11.0", + "phpstan/phpstan": "^1.10|^2.1", + "phpunit/phpunit": "^10.3|^11.5.3|^12.5.12", + "rector/rector": "^1.2|^2.3", + "spatie/laravel-query-builder": "^5.6|^6" }, "suggest": { - "league/flysystem-gridfs": "Filesystem storage in MongoDB with GridFS", - "mongodb/builder": "Provides a fluent aggregation builder for MongoDB pipelines" + "league/flysystem-gridfs": "Filesystem storage in MongoDB with GridFS" }, "type": "library", "extra": { @@ -4482,6 +4488,11 @@ "email": "andreas.braun@mongodb.com", "role": "Leader" }, + { + "name": "Pauline Vos", + "email": "pauline.vos@mongodb.com", + "role": "Maintainer" + }, { "name": "Jérôme Tamarelle", "email": "jerome.tamarelle@mongodb.com", @@ -4510,41 +4521,40 @@ ], "support": { "issues": "https://www.mongodb.com/support", - "security": "https://www.mongodb.com/security", - "source": "https://github.com/mongodb/laravel-mongodb/tree/5.1.1" + "security": "https://www.mongodb.com/security" }, - "time": "2025-01-06T09:22:28+00:00" + "time": "2026-04-15T12:18:12+00:00" }, { "name": "mongodb/mongodb", - "version": "1.20.0", + "version": "2.2.0", "source": { "type": "git", "url": "https://github.com/mongodb/mongo-php-library.git", - "reference": "75da9ea3b63d97b05e0e8648d8c09a17bc54c0b6" + "reference": "bbb13f969e37e047fd822527543df55fdc1c9298" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mongodb/mongo-php-library/zipball/75da9ea3b63d97b05e0e8648d8c09a17bc54c0b6", - "reference": "75da9ea3b63d97b05e0e8648d8c09a17bc54c0b6", + "url": "https://api.github.com/repos/mongodb/mongo-php-library/zipball/bbb13f969e37e047fd822527543df55fdc1c9298", + "reference": "bbb13f969e37e047fd822527543df55fdc1c9298", "shasum": "" }, "require": { "composer-runtime-api": "^2.0", - "ext-hash": "*", - "ext-json": "*", - "ext-mongodb": "^1.20.0", - "php": "^7.4 || ^8.0", + "ext-mongodb": "^2.2", + "php": "^8.1", "psr/log": "^1.1.4|^2|^3", - "symfony/polyfill-php80": "^1.27", - "symfony/polyfill-php81": "^1.27" + "symfony/polyfill-php85": "^1.32" + }, + "replace": { + "mongodb/builder": "*" }, "require-dev": { "doctrine/coding-standard": "^12.0", - "rector/rector": "^1.1", + "phpunit/phpunit": "^10.5.35", + "rector/rector": "^2.3.4", "squizlabs/php_codesniffer": "^3.7", - "symfony/phpunit-bridge": "^5.2", - "vimeo/psalm": "^5.13" + "vimeo/psalm": "~6.14.2" }, "type": "library", "extra": { @@ -4588,9 +4598,9 @@ ], "support": { "issues": "https://github.com/mongodb/mongo-php-library/issues", - "source": "https://github.com/mongodb/mongo-php-library/tree/1.20.0" + "source": "https://github.com/mongodb/mongo-php-library/tree/2.2.0" }, - "time": "2024-09-25T12:54:08+00:00" + "time": "2026-02-11T11:39:56+00:00" }, { "name": "monolog/monolog", @@ -6569,31 +6579,34 @@ }, { "name": "spatie/laravel-permission", - "version": "6.25.0", + "version": "7.3.0", "source": { "type": "git", "url": "https://github.com/spatie/laravel-permission.git", - "reference": "d7d4cb0d58616722f1afc90e0484e4825155b9b3" + "reference": "5272955119759cd217e84e8bbac19443c305ebc3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-permission/zipball/d7d4cb0d58616722f1afc90e0484e4825155b9b3", - "reference": "d7d4cb0d58616722f1afc90e0484e4825155b9b3", + "url": "https://api.github.com/repos/spatie/laravel-permission/zipball/5272955119759cd217e84e8bbac19443c305ebc3", + "reference": "5272955119759cd217e84e8bbac19443c305ebc3", "shasum": "" }, "require": { - "illuminate/auth": "^8.12|^9.0|^10.0|^11.0|^12.0|^13.0", - "illuminate/container": "^8.12|^9.0|^10.0|^11.0|^12.0|^13.0", - "illuminate/contracts": "^8.12|^9.0|^10.0|^11.0|^12.0|^13.0", - "illuminate/database": "^8.12|^9.0|^10.0|^11.0|^12.0|^13.0", - "php": "^8.0" + "illuminate/auth": "^12.0|^13.0", + "illuminate/container": "^12.0|^13.0", + "illuminate/contracts": "^12.0|^13.0", + "illuminate/database": "^12.0|^13.0", + "php": "^8.3", + "spatie/laravel-package-tools": "^1.0" }, "require-dev": { - "laravel/passport": "^11.0|^12.0|^13.0", + "larastan/larastan": "^3.9", + "laravel/passport": "^13.0", "laravel/pint": "^1.0", - "orchestra/testbench": "^6.23|^7.0|^8.0|^9.0|^10.0|^11.0", - "pestphp/pest": "^2.0|^3.0|^4.0", - "pestphp/pest-plugin-laravel": "^2.0|^3.0|^4.0" + "orchestra/testbench": "^10.0|^11.0", + "pestphp/pest": "^3.0|^4.0", + "pestphp/pest-plugin-laravel": "^3.0|^4.1", + "phpstan/phpstan": "^2.1" }, "type": "library", "extra": { @@ -6603,8 +6616,8 @@ ] }, "branch-alias": { - "dev-main": "6.x-dev", - "dev-master": "6.x-dev" + "dev-main": "7.x-dev", + "dev-master": "7.x-dev" } }, "autoload": { @@ -6627,7 +6640,7 @@ "role": "Developer" } ], - "description": "Permission handling for Laravel 8.0 and up", + "description": "Permission handling for Laravel 12 and up", "homepage": "https://github.com/spatie/laravel-permission", "keywords": [ "acl", @@ -6641,7 +6654,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-permission/issues", - "source": "https://github.com/spatie/laravel-permission/tree/6.25.0" + "source": "https://github.com/spatie/laravel-permission/tree/7.3.0" }, "funding": [ { @@ -6649,7 +6662,7 @@ "type": "github" } ], - "time": "2026-03-17T22:46:46+00:00" + "time": "2026-04-07T15:19:42+00:00" }, { "name": "spatie/shiki-php", @@ -8498,86 +8511,6 @@ ], "time": "2026-04-10T16:19:22+00:00" }, - { - "name": "symfony/polyfill-php81", - "version": "v1.36.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", - "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", - "shasum": "" - }, - "require": { - "php": ">=7.2" - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php81\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.36.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": "2024-09-09T11:45:10+00:00" - }, { "name": "symfony/polyfill-php83", "version": "v1.36.0", @@ -8658,6 +8591,86 @@ ], "time": "2026-04-10T17:25:58+00:00" }, + { + "name": "symfony/polyfill-php84", + "version": "v1.36.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php84.git", + "reference": "88486db2c389b290bf87ff1de7ebc1e13e42bb06" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/88486db2c389b290bf87ff1de7ebc1e13e42bb06", + "reference": "88486db2c389b290bf87ff1de7ebc1e13e42bb06", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php84\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php84/tree/v1.36.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-04-10T18:47:49+00:00" + }, { "name": "symfony/polyfill-php85", "version": "v1.36.0", @@ -13580,12 +13593,12 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": {}, + "stability-flags": [], "prefer-stable": true, "prefer-lowest": false, "platform": { "php": "^8.3" }, - "platform-dev": {}, - "plugin-api-version": "2.9.0" + "platform-dev": [], + "plugin-api-version": "2.6.0" } diff --git a/database/migrations/2026_04_20_085306_mongo_db_statistiko_player.php b/database/migrations/2026_04_20_085306_mongo_db_statistiko_player.php new file mode 100644 index 00000000..2e57e7cc --- /dev/null +++ b/database/migrations/2026_04_20_085306_mongo_db_statistiko_player.php @@ -0,0 +1,23 @@ +unique('player_id'); + $collection->index('name'); + }); + } + + public function down(): void + { + Schema::dropIfExists('player'); + } +};