diff --git a/app/Models/Category.php b/app/Models/Category.php new file mode 100644 index 0000000..04bbfcc --- /dev/null +++ b/app/Models/Category.php @@ -0,0 +1,50 @@ + */ + use HasFactory; + use SoftDeletes; + + protected $fillable = [ + 'name', + 'slug', + 'description', + 'icon', + 'image', + 'color', + 'is_active', + 'sort_order', + ]; + + protected $casts = [ + 'is_active' => 'boolean', + ]; + + /** + * Les développeurs appartenant à cette catégorie. + * + * @return HasMany + */ + public function developers(): HasMany + { + return $this->hasMany(Profile::class); + } + + /** + * Les projets appartenant à cette catégorie. + * + * @return HasMany + */ + public function projects(): HasMany + { + return $this->hasMany(Project::class); + } +} diff --git a/app/Services/NotificationService.php b/app/Services/NotificationService.php index 7c8d8ae..e683cb4 100644 --- a/app/Services/NotificationService.php +++ b/app/Services/NotificationService.php @@ -2,18 +2,19 @@ namespace App\Services; -class NotificationService { - +class NotificationService +{ /** * @param String $emailAddress * @return String */ - public function sendMail(String $emailAddress): String { + public function sendMail(String $emailAddress): String + { $randomArray = [ 'item1', 'item2', 'items3', ]; - return "Mail sent"; + return "Mail sent"; } } diff --git a/composer.json b/composer.json index 6abad85..089f25b 100644 --- a/composer.json +++ b/composer.json @@ -94,6 +94,9 @@ "allow-plugins": { "pestphp/pest-plugin": true, "php-http/discovery": true + }, + "platform": { + "php": "8.3.33" } }, "minimum-stability": "stable", diff --git a/composer.lock b/composer.lock index 91eb373..1ef2875 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "5ba0db117082e2c86eb636254051e48f", + "content-hash": "ba1faafa36dcb753b8190381bb6e3fcf", "packages": [ { "name": "brick/math", @@ -382,11 +382,6 @@ { "name": "doctrine/lexer", "version": "3.0.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/lexer.git", - "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd" - }, "dist": { "type": "zip", "url": "https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", @@ -409,7 +404,6 @@ "Doctrine\\Common\\Lexer\\": "src" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -440,21 +434,12 @@ "issues": "https://github.com/doctrine/lexer/issues", "source": "https://github.com/doctrine/lexer/tree/3.0.1" }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", - "type": "tidelift" - } - ], - "time": "2024-02-05T11:56:58+00:00" + "time": "2024-02-05T11:56:58+00:00", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd" + } }, { "name": "dragonmantank/cron-expression", @@ -523,11 +508,6 @@ { "name": "egulias/email-validator", "version": "4.0.4", - "source": { - "type": "git", - "url": "https://github.com/egulias/EmailValidator.git", - "reference": "d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa" - }, "dist": { "type": "zip", "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa", @@ -557,7 +537,6 @@ "Egulias\\EmailValidator\\": "src" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -579,13 +558,12 @@ "issues": "https://github.com/egulias/EmailValidator/issues", "source": "https://github.com/egulias/EmailValidator/tree/4.0.4" }, - "funding": [ - { - "url": "https://github.com/egulias", - "type": "github" - } - ], - "time": "2025-03-06T22:45:56+00:00" + "time": "2025-03-06T22:45:56+00:00", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa" + } }, { "name": "firebase/php-jwt", @@ -2971,11 +2949,6 @@ { "name": "paragonie/random_compat", "version": "v9.99.100", - "source": { - "type": "git", - "url": "https://github.com/paragonie/random_compat.git", - "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a" - }, "dist": { "type": "zip", "url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a", @@ -2993,7 +2966,6 @@ "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." }, "type": "library", - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -3016,7 +2988,12 @@ "issues": "https://github.com/paragonie/random_compat/issues", "source": "https://github.com/paragonie/random_compat" }, - "time": "2020-10-15T08:29:30+00:00" + "time": "2020-10-15T08:29:30+00:00", + "source": { + "type": "git", + "url": "https://github.com/paragonie/random_compat.git", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a" + } }, { "name": "phpoption/phpoption", @@ -3253,11 +3230,6 @@ { "name": "psr/clock", "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/clock.git", - "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" - }, "dist": { "type": "zip", "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", @@ -3273,7 +3245,6 @@ "Psr\\Clock\\": "src/" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -3296,16 +3267,16 @@ "issues": "https://github.com/php-fig/clock/issues", "source": "https://github.com/php-fig/clock/tree/1.0.0" }, - "time": "2022-11-25T14:36:26+00:00" + "time": "2022-11-25T14:36:26+00:00", + "source": { + "type": "git", + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + } }, { "name": "psr/container", "version": "2.0.2", - "source": { - "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" - }, "dist": { "type": "zip", "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", @@ -3326,7 +3297,6 @@ "Psr\\Container\\": "src/" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -3349,16 +3319,16 @@ "issues": "https://github.com/php-fig/container/issues", "source": "https://github.com/php-fig/container/tree/2.0.2" }, - "time": "2021-11-05T16:47:00+00:00" + "time": "2021-11-05T16:47:00+00:00", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + } }, { "name": "psr/event-dispatcher", "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/event-dispatcher.git", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" - }, "dist": { "type": "zip", "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", @@ -3379,7 +3349,6 @@ "Psr\\EventDispatcher\\": "src/" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -3399,7 +3368,12 @@ "issues": "https://github.com/php-fig/event-dispatcher/issues", "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" }, - "time": "2019-01-08T18:20:26+00:00" + "time": "2019-01-08T18:20:26+00:00", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + } }, { "name": "psr/http-client", @@ -3564,11 +3538,6 @@ { "name": "psr/log", "version": "3.0.2", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" - }, "dist": { "type": "zip", "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", @@ -3589,7 +3558,6 @@ "Psr\\Log\\": "src" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -3609,7 +3577,12 @@ "support": { "source": "https://github.com/php-fig/log/tree/3.0.2" }, - "time": "2024-09-11T13:17:53+00:00" + "time": "2024-09-11T13:17:53+00:00", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" + } }, { "name": "psr/simple-cache", @@ -4065,11 +4038,6 @@ { "name": "symfony/clock", "version": "v7.4.8", - "source": { - "type": "git", - "url": "https://github.com/symfony/clock.git", - "reference": "674fa3b98e21531dd040e613479f5f6fa8f32111" - }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/clock/zipball/674fa3b98e21531dd040e613479f5f6fa8f32111", @@ -4096,7 +4064,6 @@ "/Tests/" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -4120,34 +4087,16 @@ "support": { "source": "https://github.com/symfony/clock/tree/v7.4.8" }, - "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-03-24T13:12:05+00:00" + "time": "2026-03-24T13:12:05+00:00", + "source": { + "type": "git", + "url": "https://github.com/symfony/clock.git", + "reference": "674fa3b98e21531dd040e613479f5f6fa8f32111" + } }, { "name": "symfony/console", "version": "v7.4.15", - "source": { - "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "088ec6fe0ef6819cbc301174093b6bfa4ad26930" - }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/console/zipball/088ec6fe0ef6819cbc301174093b6bfa4ad26930", @@ -4193,7 +4142,6 @@ "/Tests/" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -4218,34 +4166,16 @@ "support": { "source": "https://github.com/symfony/console/tree/v7.4.15" }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2026-07-27T13:51:00+00:00" + "time": "2026-07-27T13:51:00+00:00", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "088ec6fe0ef6819cbc301174093b6bfa4ad26930" + } }, { "name": "symfony/css-selector", "version": "v7.4.9", - "source": { - "type": "git", - "url": "https://github.com/symfony/css-selector.git", - "reference": "b75663ed96cf4756e28e3105476f220f92886cc4" - }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/css-selector/zipball/b75663ed96cf4756e28e3105476f220f92886cc4", @@ -4264,7 +4194,6 @@ "/Tests/" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -4287,34 +4216,16 @@ "support": { "source": "https://github.com/symfony/css-selector/tree/v7.4.9" }, - "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-18T13:18:21+00:00" + "time": "2026-04-18T13:18:21+00:00", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "b75663ed96cf4756e28e3105476f220f92886cc4" + } }, { "name": "symfony/deprecation-contracts", "version": "v3.7.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "f3202fa1b5097b0af062dc978b32ecf63404e31d" - }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/f3202fa1b5097b0af062dc978b32ecf63404e31d", @@ -4339,7 +4250,6 @@ "function.php" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -4358,34 +4268,16 @@ "support": { "source": "https://github.com/symfony/deprecation-contracts/tree/v3.7.1" }, - "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-06-05T06:23:12+00:00" + "time": "2026-06-05T06:23:12+00:00", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "f3202fa1b5097b0af062dc978b32ecf63404e31d" + } }, { "name": "symfony/error-handler", "version": "v7.4.15", - "source": { - "type": "git", - "url": "https://github.com/symfony/error-handler.git", - "reference": "d49f6a19f326db41ae7103bdc38e3eb35a791261" - }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/error-handler/zipball/d49f6a19f326db41ae7103bdc38e3eb35a791261", @@ -4421,7 +4313,6 @@ "/Tests/" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -4440,34 +4331,16 @@ "support": { "source": "https://github.com/symfony/error-handler/tree/v7.4.15" }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2026-07-21T15:13:06+00:00" + "time": "2026-07-21T15:13:06+00:00", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "d49f6a19f326db41ae7103bdc38e3eb35a791261" + } }, { "name": "symfony/event-dispatcher", "version": "v7.4.15", - "source": { - "type": "git", - "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "336e7f3b9e95aba04f93ea9143920c2186abfbb9" - }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/336e7f3b9e95aba04f93ea9143920c2186abfbb9", @@ -4506,7 +4379,6 @@ "/Tests/" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -4525,34 +4397,16 @@ "support": { "source": "https://github.com/symfony/event-dispatcher/tree/v7.4.15" }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2026-07-21T15:13:06+00:00" + "time": "2026-07-21T15:13:06+00:00", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "336e7f3b9e95aba04f93ea9143920c2186abfbb9" + } }, { "name": "symfony/event-dispatcher-contracts", "version": "v3.7.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "c7de7a00ffb67842132da02ea92988a39ccd9f4e" - }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/c7de7a00ffb67842132da02ea92988a39ccd9f4e", @@ -4578,7 +4432,6 @@ "Symfony\\Contracts\\EventDispatcher\\": "" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -4605,34 +4458,16 @@ "support": { "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.7.1" }, - "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-06-05T06:23:12+00:00" + "time": "2026-06-05T06:23:12+00:00", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "c7de7a00ffb67842132da02ea92988a39ccd9f4e" + } }, { "name": "symfony/finder", "version": "v7.4.14", - "source": { - "type": "git", - "url": "https://github.com/symfony/finder.git", - "reference": "13b38720174286f55d1761152b575a8d1436fc25" - }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/finder/zipball/13b38720174286f55d1761152b575a8d1436fc25", @@ -4654,7 +4489,6 @@ "/Tests/" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -4673,34 +4507,16 @@ "support": { "source": "https://github.com/symfony/finder/tree/v7.4.14" }, - "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-06-27T08:31:18+00:00" + "time": "2026-06-27T08:31:18+00:00", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "13b38720174286f55d1761152b575a8d1436fc25" + } }, { "name": "symfony/http-foundation", "version": "v7.4.15", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-foundation.git", - "reference": "1f898ee8188adda9417fb52cf8425a8342c254e7" - }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/http-foundation/zipball/1f898ee8188adda9417fb52cf8425a8342c254e7", @@ -4736,7 +4552,6 @@ "/Tests/" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -4755,34 +4570,16 @@ "support": { "source": "https://github.com/symfony/http-foundation/tree/v7.4.15" }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2026-07-29T07:12:33+00:00" + "time": "2026-07-29T07:12:33+00:00", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "1f898ee8188adda9417fb52cf8425a8342c254e7" + } }, { "name": "symfony/http-kernel", "version": "v7.4.15", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-kernel.git", - "reference": "403275d94f94d5626c3288c599b3b48093ba24f7" - }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/http-kernel/zipball/403275d94f94d5626c3288c599b3b48093ba24f7", @@ -4855,7 +4652,6 @@ "/Tests/" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -4874,34 +4670,16 @@ "support": { "source": "https://github.com/symfony/http-kernel/tree/v7.4.15" }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2026-07-29T11:40:42+00:00" + "time": "2026-07-29T11:40:42+00:00", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "403275d94f94d5626c3288c599b3b48093ba24f7" + } }, { "name": "symfony/mailer", "version": "v7.4.15", - "source": { - "type": "git", - "url": "https://github.com/symfony/mailer.git", - "reference": "68c1f27c97edd0222eb8d440a6c8c4da5354ab46" - }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/mailer/zipball/68c1f27c97edd0222eb8d440a6c8c4da5354ab46", @@ -4939,7 +4717,6 @@ "/Tests/" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -4958,34 +4735,16 @@ "support": { "source": "https://github.com/symfony/mailer/tree/v7.4.15" }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2026-07-28T07:33:02+00:00" + "time": "2026-07-28T07:33:02+00:00", + "source": { + "type": "git", + "url": "https://github.com/symfony/mailer.git", + "reference": "68c1f27c97edd0222eb8d440a6c8c4da5354ab46" + } }, { "name": "symfony/mime", "version": "v7.4.15", - "source": { - "type": "git", - "url": "https://github.com/symfony/mime.git", - "reference": "0c1daf58bc931628df0bea26840d1fc8b9a3d34b" - }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/mime/zipball/0c1daf58bc931628df0bea26840d1fc8b9a3d34b", @@ -5024,7 +4783,6 @@ "/Tests/" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -5047,34 +4805,16 @@ "support": { "source": "https://github.com/symfony/mime/tree/v7.4.15" }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2026-07-29T07:59:49+00:00" + "time": "2026-07-29T07:59:49+00:00", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "0c1daf58bc931628df0bea26840d1fc8b9a3d34b" + } }, { "name": "symfony/polyfill-ctype", "version": "v1.37.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "141046a8f9477948ff284fa65be2095baafb94f2" - }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/141046a8f9477948ff284fa65be2095baafb94f2", @@ -5105,7 +4845,6 @@ "Symfony\\Polyfill\\Ctype\\": "" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -5130,34 +4869,16 @@ "support": { "source": "https://github.com/symfony/polyfill-ctype/tree/v1.37.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-10T16:19:22+00:00" + "time": "2026-04-10T16:19:22+00:00", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "141046a8f9477948ff284fa65be2095baafb94f2" + } }, { "name": "symfony/polyfill-intl-grapheme", "version": "v1.41.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "bb899c1db0aa8127dc3afe8cda4a67eb24915f8d" - }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/bb899c1db0aa8127dc3afe8cda4a67eb24915f8d", @@ -5185,7 +4906,6 @@ "Symfony\\Polyfill\\Intl\\Grapheme\\": "" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -5212,34 +4932,16 @@ "support": { "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.41.0" }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2026-07-28T08:25:59+00:00" + "time": "2026-07-28T08:25:59+00:00", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "bb899c1db0aa8127dc3afe8cda4a67eb24915f8d" + } }, { "name": "symfony/polyfill-intl-idn", "version": "v1.38.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "dc21118016c039a66235cf93d96b435ffb282412" - }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/dc21118016c039a66235cf93d96b435ffb282412", @@ -5268,7 +4970,6 @@ "Symfony\\Polyfill\\Intl\\Idn\\": "" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -5299,34 +5000,16 @@ "support": { "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.38.1" }, - "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-05-25T15:22:23+00:00" + "time": "2026-05-25T15:22:23+00:00", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "dc21118016c039a66235cf93d96b435ffb282412" + } }, { "name": "symfony/polyfill-intl-normalizer", "version": "v1.38.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "2d446c214bdbe5b71bde5011b060a05fece3ae6b" - }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/2d446c214bdbe5b71bde5011b060a05fece3ae6b", @@ -5357,7 +5040,6 @@ "Resources/stubs" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -5384,34 +5066,16 @@ "support": { "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.38.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-05-25T13:48:31+00:00" + "time": "2026-05-25T13:48:31+00:00", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "2d446c214bdbe5b71bde5011b060a05fece3ae6b" + } }, { "name": "symfony/polyfill-mbstring", "version": "v1.38.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6" - }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6", @@ -5443,7 +5107,6 @@ "Symfony\\Polyfill\\Mbstring\\": "" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -5469,34 +5132,16 @@ "support": { "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.38.2" }, - "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-05-27T06:59:30+00:00" + "time": "2026-05-27T06:59:30+00:00", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6" + } }, { "name": "symfony/polyfill-php80", "version": "v1.37.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "dfb55726c3a76ea3b6459fcfda1ec2d80a682411" - }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/dfb55726c3a76ea3b6459fcfda1ec2d80a682411", @@ -5524,7 +5169,6 @@ "Resources/stubs" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -5553,34 +5197,16 @@ "support": { "source": "https://github.com/symfony/polyfill-php80/tree/v1.37.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-10T16:19:22+00:00" + "time": "2026-04-10T16:19:22+00:00", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "dfb55726c3a76ea3b6459fcfda1ec2d80a682411" + } }, { "name": "symfony/polyfill-php83", "version": "v1.41.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "5ea99087fb99c273a9b9236ed4c31e78b16103c6" - }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/5ea99087fb99c273a9b9236ed4c31e78b16103c6", @@ -5608,7 +5234,6 @@ "Resources/stubs" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -5633,34 +5258,16 @@ "support": { "source": "https://github.com/symfony/polyfill-php83/tree/v1.41.0" }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2026-07-01T12:47:55+00:00" + "time": "2026-07-01T12:47:55+00:00", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "5ea99087fb99c273a9b9236ed4c31e78b16103c6" + } }, { "name": "symfony/polyfill-php84", "version": "v1.38.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php84.git", - "reference": "f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa" - }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa", @@ -5688,7 +5295,6 @@ "Resources/stubs" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -5713,34 +5319,16 @@ "support": { "source": "https://github.com/symfony/polyfill-php84/tree/v1.38.1" }, - "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-05-26T12:51:13+00:00" + "time": "2026-05-26T12:51:13+00:00", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php84.git", + "reference": "f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa" + } }, { "name": "symfony/polyfill-php85", "version": "v1.41.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php85.git", - "reference": "255fab485aaa1006ed411040c42aecd7b5302d7a" - }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/255fab485aaa1006ed411040c42aecd7b5302d7a", @@ -5768,7 +5356,6 @@ "Resources/stubs" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -5793,34 +5380,16 @@ "support": { "source": "https://github.com/symfony/polyfill-php85/tree/v1.41.0" }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2026-07-01T12:47:55+00:00" + "time": "2026-07-01T12:47:55+00:00", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php85.git", + "reference": "255fab485aaa1006ed411040c42aecd7b5302d7a" + } }, { "name": "symfony/polyfill-php86", "version": "v1.41.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php86.git", - "reference": "6bc356ed3d8dbfeea8f0de235e34d670704e880e" - }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/polyfill-php86/zipball/6bc356ed3d8dbfeea8f0de235e34d670704e880e", @@ -5848,7 +5417,6 @@ "Resources/stubs" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -5873,34 +5441,16 @@ "support": { "source": "https://github.com/symfony/polyfill-php86/tree/v1.41.0" }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2026-07-02T13:42:24+00:00" + "time": "2026-07-02T13:42:24+00:00", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php86.git", + "reference": "6bc356ed3d8dbfeea8f0de235e34d670704e880e" + } }, { "name": "symfony/polyfill-uuid", "version": "v1.37.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-uuid.git", - "reference": "26dfec253c4cf3e51b541b52ddf7e42cb0908e94" - }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/26dfec253c4cf3e51b541b52ddf7e42cb0908e94", @@ -5931,7 +5481,6 @@ "Symfony\\Polyfill\\Uuid\\": "" } }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -5956,34 +5505,16 @@ "support": { "source": "https://github.com/symfony/polyfill-uuid/tree/v1.37.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-10T16:19:22+00:00" + "time": "2026-04-10T16:19:22+00:00", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-uuid.git", + "reference": "26dfec253c4cf3e51b541b52ddf7e42cb0908e94" + } }, { "name": "symfony/process", "version": "v7.4.13", - "source": { - "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "f5804be144caceb570f6747519999636b664f24c" - }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/process/zipball/f5804be144caceb570f6747519999636b664f24c", @@ -6002,7 +5533,6 @@ "/Tests/" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -6021,34 +5551,16 @@ "support": { "source": "https://github.com/symfony/process/tree/v7.4.13" }, - "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-05-23T16:05:06+00:00" + "time": "2026-05-23T16:05:06+00:00", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "f5804be144caceb570f6747519999636b664f24c" + } }, { "name": "symfony/routing", "version": "v7.4.15", - "source": { - "type": "git", - "url": "https://github.com/symfony/routing.git", - "reference": "80c0a93d3f8e7499f716204a1fb38ead942a7a2b" - }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/routing/zipball/80c0a93d3f8e7499f716204a1fb38ead942a7a2b", @@ -6081,7 +5593,6 @@ "/Tests/" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -6106,34 +5617,16 @@ "support": { "source": "https://github.com/symfony/routing/tree/v7.4.15" }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2026-07-21T15:13:06+00:00" + "time": "2026-07-21T15:13:06+00:00", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "80c0a93d3f8e7499f716204a1fb38ead942a7a2b" + } }, { "name": "symfony/service-contracts", "version": "v3.7.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/service-contracts.git", - "reference": "c0a284bab1ed8aa0417e3d69250ab437739563a0" - }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/service-contracts/zipball/c0a284bab1ed8aa0417e3d69250ab437739563a0", @@ -6166,7 +5659,6 @@ "/Test/" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -6193,34 +5685,16 @@ "support": { "source": "https://github.com/symfony/service-contracts/tree/v3.7.1" }, - "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-06-16T09:55:08+00:00" + "time": "2026-06-16T09:55:08+00:00", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "c0a284bab1ed8aa0417e3d69250ab437739563a0" + } }, { "name": "symfony/string", "version": "v7.4.15", - "source": { - "type": "git", - "url": "https://github.com/symfony/string.git", - "reference": "e394af32256bf9e7bf80849d95e589167c10097b" - }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/string/zipball/e394af32256bf9e7bf80849d95e589167c10097b", @@ -6257,7 +5731,6 @@ "/Tests/" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -6272,46 +5745,28 @@ } ], "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", - "homepage": "https://symfony.com", - "keywords": [ - "grapheme", - "i18n", - "string", - "unicode", - "utf-8", - "utf8" - ], - "support": { - "source": "https://github.com/symfony/string/tree/v7.4.15" - }, - "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" - } + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" ], - "time": "2026-07-28T07:33:02+00:00" + "support": { + "source": "https://github.com/symfony/string/tree/v7.4.15" + }, + "time": "2026-07-28T07:33:02+00:00", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "e394af32256bf9e7bf80849d95e589167c10097b" + } }, { "name": "symfony/translation", "version": "v7.4.14", - "source": { - "type": "git", - "url": "https://github.com/symfony/translation.git", - "reference": "a1af4dacb24eb7ef4f1ca71b94da8ddbce572281" - }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/translation/zipball/a1af4dacb24eb7ef4f1ca71b94da8ddbce572281", @@ -6365,7 +5820,6 @@ "/Tests/" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -6384,34 +5838,16 @@ "support": { "source": "https://github.com/symfony/translation/tree/v7.4.14" }, - "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-06-06T09:33:19+00:00" + "time": "2026-06-06T09:33:19+00:00", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "a1af4dacb24eb7ef4f1ca71b94da8ddbce572281" + } }, { "name": "symfony/translation-contracts", "version": "v3.7.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/translation-contracts.git", - "reference": "ccb206b98faccc511ebae8e5fad50f2dc0b30621" - }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/ccb206b98faccc511ebae8e5fad50f2dc0b30621", @@ -6439,7 +5875,6 @@ "/Test/" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -6466,34 +5901,16 @@ "support": { "source": "https://github.com/symfony/translation-contracts/tree/v3.7.1" }, - "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-06-05T06:23:12+00:00" + "time": "2026-06-05T06:23:12+00:00", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "ccb206b98faccc511ebae8e5fad50f2dc0b30621" + } }, { "name": "symfony/type-info", "version": "v7.4.9", - "source": { - "type": "git", - "url": "https://github.com/symfony/type-info.git", - "reference": "cafeedbf157b890e94ac5b83eaed85595106d5d6" - }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/type-info/zipball/cafeedbf157b890e94ac5b83eaed85595106d5d6", @@ -6520,7 +5937,6 @@ "/Tests/" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -6549,34 +5965,16 @@ "support": { "source": "https://github.com/symfony/type-info/tree/v7.4.9" }, - "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-22T15:21:55+00:00" + "time": "2026-04-22T15:21:55+00:00", + "source": { + "type": "git", + "url": "https://github.com/symfony/type-info.git", + "reference": "cafeedbf157b890e94ac5b83eaed85595106d5d6" + } }, { "name": "symfony/uid", "version": "v7.4.9", - "source": { - "type": "git", - "url": "https://github.com/symfony/uid.git", - "reference": "2676b524340abcfe4d6151ec698463cebafee439" - }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/uid/zipball/2676b524340abcfe4d6151ec698463cebafee439", @@ -6599,7 +5997,6 @@ "/Tests/" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -6627,34 +6024,16 @@ "support": { "source": "https://github.com/symfony/uid/tree/v7.4.9" }, - "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-30T15:19:22+00:00" + "time": "2026-04-30T15:19:22+00:00", + "source": { + "type": "git", + "url": "https://github.com/symfony/uid.git", + "reference": "2676b524340abcfe4d6151ec698463cebafee439" + } }, { "name": "symfony/var-dumper", "version": "v7.4.15", - "source": { - "type": "git", - "url": "https://github.com/symfony/var-dumper.git", - "reference": "04ba4add636a95ff437af3a5a9499bb1d6c6d4bd" - }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/var-dumper/zipball/04ba4add636a95ff437af3a5a9499bb1d6c6d4bd", @@ -6691,7 +6070,6 @@ "/Tests/" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -6714,34 +6092,16 @@ "support": { "source": "https://github.com/symfony/var-dumper/tree/v7.4.15" }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2026-07-21T15:13:06+00:00" + "time": "2026-07-21T15:13:06+00:00", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "04ba4add636a95ff437af3a5a9499bb1d6c6d4bd" + } }, { "name": "symfony/yaml", "version": "v7.4.15", - "source": { - "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "e101850ded5d2c0d44bf32abb8996404afec2dec" - }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/yaml/zipball/e101850ded5d2c0d44bf32abb8996404afec2dec", @@ -6771,7 +6131,6 @@ "/Tests/" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -6790,25 +6149,12 @@ "support": { "source": "https://github.com/symfony/yaml/tree/v7.4.15" }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2026-07-21T15:13:06+00:00" + "time": "2026-07-21T15:13:06+00:00", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "e101850ded5d2c0d44bf32abb8996404afec2dec" + } }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -10891,11 +10237,6 @@ { "name": "symfony/filesystem", "version": "v7.4.15", - "source": { - "type": "git", - "url": "https://github.com/symfony/filesystem.git", - "reference": "ff16a16bf87fdf264638b8f6995b3515975e3c79" - }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/filesystem/zipball/ff16a16bf87fdf264638b8f6995b3515975e3c79", @@ -10919,7 +10260,6 @@ "/Tests/" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -10938,34 +10278,16 @@ "support": { "source": "https://github.com/symfony/filesystem/tree/v7.4.15" }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2026-07-22T07:36:05+00:00" + "time": "2026-07-22T07:36:05+00:00", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "ff16a16bf87fdf264638b8f6995b3515975e3c79" + } }, { "name": "symfony/options-resolver", "version": "v7.4.8", - "source": { - "type": "git", - "url": "https://github.com/symfony/options-resolver.git", - "reference": "2888fcdc4dc2fd5f7c7397be78631e8af12e02b4" - }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/options-resolver/zipball/2888fcdc4dc2fd5f7c7397be78631e8af12e02b4", @@ -10985,7 +10307,6 @@ "/Tests/" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -11009,34 +10330,16 @@ "support": { "source": "https://github.com/symfony/options-resolver/tree/v7.4.8" }, - "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-03-24T13:12:05+00:00" + "time": "2026-03-24T13:12:05+00:00", + "source": { + "type": "git", + "url": "https://github.com/symfony/options-resolver.git", + "reference": "2888fcdc4dc2fd5f7c7397be78631e8af12e02b4" + } }, { "name": "symfony/polyfill-php81", "version": "v1.38.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "6bfb9c766cacffbc8e118cb87217d08ed84e5cd7" - }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/6bfb9c766cacffbc8e118cb87217d08ed84e5cd7", @@ -11064,7 +10367,6 @@ "Resources/stubs" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -11089,34 +10391,16 @@ "support": { "source": "https://github.com/symfony/polyfill-php81/tree/v1.38.1" }, - "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-05-26T12:45:58+00:00" + "time": "2026-05-26T12:45:58+00:00", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "6bfb9c766cacffbc8e118cb87217d08ed84e5cd7" + } }, { "name": "symfony/stopwatch", "version": "v7.4.8", - "source": { - "type": "git", - "url": "https://github.com/symfony/stopwatch.git", - "reference": "70a852d72fec4d51efb1f48dcd968efcaf5ccb89" - }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/stopwatch/zipball/70a852d72fec4d51efb1f48dcd968efcaf5ccb89", @@ -11136,7 +10420,6 @@ "/Tests/" ] }, - "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -11155,25 +10438,12 @@ "support": { "source": "https://github.com/symfony/stopwatch/tree/v7.4.8" }, - "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-03-24T13:12:05+00:00" + "time": "2026-03-24T13:12:05+00:00", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "70a852d72fec4d51efb1f48dcd968efcaf5ccb89" + } }, { "name": "theseer/tokenizer", @@ -11228,12 +10498,15 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": {}, + "stability-flags": [], "prefer-stable": true, "prefer-lowest": false, "platform": { "php": "^8.3" }, - "platform-dev": {}, - "plugin-api-version": "2.6.0" + "platform-dev": [], + "platform-overrides": { + "php": "8.3.33" + }, + "plugin-api-version": "2.9.0" } diff --git a/database/factories/CategoryFactory.php b/database/factories/CategoryFactory.php new file mode 100644 index 0000000..e201511 --- /dev/null +++ b/database/factories/CategoryFactory.php @@ -0,0 +1,32 @@ + + */ +class CategoryFactory extends Factory +{ + /** + * @return array + */ + public function definition(): array + { + $name = fake()->unique()->words(2, true); + + return [ + 'name' => ucwords($name), + 'slug' => Str::slug($name), + 'description' => fake()->optional()->sentence(), + 'icon' => fake()->optional()->word(), + 'image' => fake()->optional()->imageUrl(), + 'color' => fake()->optional()->hexColor(), + 'is_active' => true, + 'sort_order' => fake()->numberBetween(0, 100), + ]; + } +} diff --git a/database/migrations/2026_08_01_123632_create_categories_table.php b/database/migrations/2026_08_01_123632_create_categories_table.php new file mode 100644 index 0000000..793dc70 --- /dev/null +++ b/database/migrations/2026_08_01_123632_create_categories_table.php @@ -0,0 +1,41 @@ +id(); + $table->string('name'); + $table->string('slug')->unique(); + + $table->text('description')->nullable(); + + $table->string('icon')->nullable(); + $table->string('image')->nullable(); + + $table->string('color', 20)->nullable(); + + $table->boolean('is_active')->default(true); + + $table->unsignedInteger('sort_order')->default(0); + $table->timestamps(); + $table->softDeletes(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('categories'); + } +}; diff --git a/routes/api_v1.php b/routes/api_v1.php index e05788d..3eb209f 100644 --- a/routes/api_v1.php +++ b/routes/api_v1.php @@ -22,5 +22,5 @@ // Route::middleware('auth:sanctum')->group(function () { // Route::get('me', [AuthController::class, 'me'])->name('auth.me'); - + // }); diff --git a/tests/Feature/Api/V1/ProfileControllerTest.php b/tests/Feature/Api/V1/ProfileControllerTest.php new file mode 100644 index 0000000..a933b5f --- /dev/null +++ b/tests/Feature/Api/V1/ProfileControllerTest.php @@ -0,0 +1,141 @@ +count(2)->create(); + + $response = $this->getJson(self::ENDPOINT); + + $response->assertOk() + ->assertJsonStructure([ + 'data', + 'current_page', + 'per_page', + 'total', + ]); + + $this->assertGreaterThanOrEqual(2, $response->json('total')); + } + + #[Test] + public function test_store_returns_not_implemented(): void + { + $response = $this->postJson(self::ENDPOINT, []); + + $response->assertStatus(501) + ->assertJsonPath('code', 'NOT_IMPLEMENTED'); + } + + #[Test] + public function test_can_show_profile(): void + { + $profile = Profile::factory()->create(); + + $response = $this->getJson(self::ENDPOINT . '/' . $profile->id); + + $response->assertOk() + ->assertJsonPath('data.id', $profile->id) + ->assertJsonStructure([ + 'data' => [ + 'id', + 'name', + 'skills', + 'projects', + ], + ]); + } + + #[Test] + public function test_can_update_profile(): void + { + $profile = Profile::factory()->create([ + 'name' => 'Old Name', + 'bio' => 'Old bio', + ]); + + $response = $this->patchJson(self::ENDPOINT . '/' . $profile->id, [ + 'name' => 'New Name', + 'bio' => 'New bio', + 'headline' => 'New headline', + 'location' => 'Paris', + ]); + + $response->assertOk() + ->assertJsonPath('data.name', 'New Name') + ->assertJsonPath('data.bio', 'New bio'); + + $this->assertDatabaseHas('profiles', [ + 'id' => $profile->id, + 'name' => 'New Name', + 'bio' => 'New bio', + ]); + } + + #[Test] + public function test_update_profile_requires_name(): void + { + $profile = Profile::factory()->create(); + + $response = $this->patchJson(self::ENDPOINT . '/' . $profile->id, [ + 'bio' => 'Missing name', + ]); + + $response->assertStatus(422) + ->assertJsonValidationErrors(['name']); + } + + #[Test] + public function test_can_validate_profile(): void + { + $profile = Profile::factory()->pendingValidation()->create(); + + $response = $this->putJson(self::ENDPOINT . '/' . $profile->id . '/validate', [ + 'account_status' => ProfileAccountStatus::VALIDATED->value, + ]); + + $response->assertOk() + ->assertJsonPath('data.account_status', ProfileAccountStatus::VALIDATED->value); + + $this->assertDatabaseHas('profiles', [ + 'id' => $profile->id, + 'account_status' => ProfileAccountStatus::VALIDATED->value, + ]); + } + + #[Test] + public function test_validate_profile_requires_account_status(): void + { + $profile = Profile::factory()->create(); + + $response = $this->putJson(self::ENDPOINT . '/' . $profile->id . '/validate', []); + + $response->assertStatus(422) + ->assertJsonValidationErrors(['account_status']); + } + + #[Test] + public function test_destroy_returns_not_implemented(): void + { + $profile = Profile::factory()->create(); + + $response = $this->deleteJson(self::ENDPOINT . '/' . $profile->id); + + $response->assertStatus(501) + ->assertJsonPath('code', 'NOT_IMPLEMENTED'); + } +} diff --git a/tests/Unit/Http/Middleware/EnsureUserIsAdminTest.php b/tests/Unit/Http/Middleware/EnsureUserIsAdminTest.php new file mode 100644 index 0000000..bcfe0d1 --- /dev/null +++ b/tests/Unit/Http/Middleware/EnsureUserIsAdminTest.php @@ -0,0 +1,57 @@ +create(['role' => UserRole::Admin]); + $request = Request::create('/admin', 'GET'); + $request->setUserResolver(static fn () => $user); + + $middleware = new EnsureUserIsAdmin(); + $response = $middleware->handle($request, static fn () => response('ok')); + + $this->assertSame('ok', $response->getContent()); + } + + #[Test] + public function test_rejects_non_admin_users(): void + { + $user = User::factory()->create(['role' => UserRole::User]); + $request = Request::create('/admin', 'GET'); + $request->setUserResolver(static fn () => $user); + + $middleware = new EnsureUserIsAdmin(); + + $this->expectException(HttpException::class); + + $middleware->handle($request, static fn () => response('ok')); + } + + #[Test] + public function test_rejects_guests(): void + { + $request = Request::create('/admin', 'GET'); + $request->setUserResolver(static fn () => null); + + $middleware = new EnsureUserIsAdmin(); + + $this->expectException(HttpException::class); + + $middleware->handle($request, static fn () => response('ok')); + } +} diff --git a/tests/Unit/Models/CategoryTest.php b/tests/Unit/Models/CategoryTest.php new file mode 100644 index 0000000..20d245b --- /dev/null +++ b/tests/Unit/Models/CategoryTest.php @@ -0,0 +1,77 @@ +create([ + 'name' => 'Backend', + 'slug' => 'backend', + 'is_active' => true, + 'sort_order' => 1, + ]); + + $this->assertDatabaseHas('categories', [ + 'id' => $category->id, + 'name' => 'Backend', + 'slug' => 'backend', + 'sort_order' => 1, + ]); + } + + #[Test] + public function test_is_active_is_cast_to_boolean(): void + { + $category = Category::factory()->create(['is_active' => 1]); + + $this->assertTrue($category->is_active); + $this->assertIsBool($category->is_active); + } + + #[Test] + public function test_can_soft_delete_category(): void + { + $category = Category::factory()->create(); + + $category->delete(); + + $this->assertSoftDeleted($category); + $this->assertNull(Category::query()->find($category->id)); + $this->assertNotNull(Category::withTrashed()->find($category->id)); + } + + #[Test] + public function test_developers_relation(): void + { + $category = Category::factory()->create(); + + $relation = $category->developers(); + + $this->assertInstanceOf(HasMany::class, $relation); + $this->assertSame(Profile::class, $relation->getRelated()::class); + } + + #[Test] + public function test_projects_relation(): void + { + $category = Category::factory()->create(); + + $relation = $category->projects(); + + $this->assertInstanceOf(HasMany::class, $relation); + $this->assertSame(Project::class, $relation->getRelated()::class); + } +} diff --git a/tests/Unit/Services/NotificationServiceTest.php b/tests/Unit/Services/NotificationServiceTest.php index e1769dd..d6d29b4 100644 --- a/tests/Unit/Services/NotificationServiceTest.php +++ b/tests/Unit/Services/NotificationServiceTest.php @@ -18,4 +18,4 @@ public function test_send_notification_sends_notification(): void $this->assertSame('Mail sent', $resut); } -} \ No newline at end of file +}