[Feature] - Upgrade to Symfony 7.4, PHP 8.3+, API Platform 4.2 #40
[Feature] - Upgrade to Symfony 7.4, PHP 8.3+, API Platform 4.2 #40
Conversation
…Platform 4.2 Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com>
Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com>
… fix getDatabasePlatform) Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com>
…rm 4.2 Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com>
…ckagist repository Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com>
Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com>
There was a problem hiding this comment.
Pull request overview
Upgrades the application stack to Symfony 7.4 / PHP 8.3+ and API Platform 4.2, updating Doctrine (DBAL 3.x, ORM 2.9+ / 3.x) compatibility, serializer/metadata usage, and related infrastructure/config.
Changes:
- Bump core dependencies (Symfony 7.4, API Platform 4.2, Doctrine DBAL 3.10) and adjust configuration accordingly.
- Refactor Doctrine/DBAL-related code paths (custom DBAL wrapper/statement, platform-specific query execution) and update API Platform/Serializer integrations.
- Update tests, fixtures loading, and various entities/filters/providers to match new framework/library APIs.
Reviewed changes
Copilot reviewed 81 out of 84 changed files in this pull request and generated 12 comments.
Show a summary per file
| File | Description |
|---|---|
| tests/Integration/Repository/RppsRepositoryTest.php | Switch fixtures loader to Doctrine Loader |
| tests/Functional/CCAMTest.php | Add return type + formatting |
| tests/Functional/ApiTestCase.php | Switch fixtures loader to Doctrine Loader |
| symfony.lock | Flex recipe lock updates |
| src/Validator/GroupGenerator.php | Constructor property visibility update |
| src/StateProvider/SimilarCitiesProvider.php | Minor control-flow simplification |
| src/StateProvider/DefaultItemDataProvider.php | Remove unused RequestStack injection |
| src/Service/SpecialtyService.php | Purge uses DBAL connection statements |
| src/Service/RPPSService.php | Minor instanceof simplification |
| src/Service/NGAPService.php | Use setter for importId |
| src/Service/DrugService.php | Null-safe array access + setter for importId |
| src/Service/CityService.php | Purge uses DBAL connection statements |
| src/Serializer/SerialisationGroupGenerator.php | API Platform interface namespace update |
| src/Serializer/Normalizer/TranslatableEntityNormalizer.php | Serializer interface migration (NormalizerInterface) |
| src/Serializer/Normalizer/PhoneNumberNormalizer.php | Serializer interface migration (NormalizerInterface) |
| src/Serializer/Normalizer/Cim11ModifierNormalizer.php | Serializer interface migration (NormalizerInterface) |
| src/Repository/SpecialtyRepository.php | Update find() signature typing |
| src/Repository/RPPSRepository.php | Update find() signature typing |
| src/Repository/NGAPRepository.php | Update find() signature typing |
| src/Repository/DrugRepository.php | Update find() signature typing |
| src/Repository/DiseaseRepository.php | Update find() signature typing |
| src/Repository/DiseaseGroupRepository.php | Update find() signature typing |
| src/Repository/CityRepository.php | DBAL 3 executeQuery migration + find() typing |
| src/Repository/Cim11Repository.php | Update find() signature typing |
| src/Repository/CCAMRepository.php | Update find() signature typing |
| src/Repository/CCAMGroupRepository.php | Update find() signature typing |
| src/Repository/AllergenRepository.php | Update find() signature typing |
| src/EventListener/RppsLatitudeLongitudeOperationOptimizerListener.php | Route attribute extraction update |
| src/Entity/Specialty.php | ORM index metadata refactor + OpenAPI op update + MaxDepth |
| src/Entity/RPPS.php | ORM indexes refactor + ApiProperty schema/deprecation updates |
| src/Entity/NGAP.php | ApiProperty schema updates |
| src/Entity/Drug.php | ApiProperty schema updates + truncate presentationLabel |
| src/Entity/DiseaseGroup.php | ApiProperty schema updates |
| src/Entity/Disease.php | Remove some filters + ApiProperty schema updates |
| src/Entity/City.php | Add phpstan ignores for ApiFilter attributes |
| src/Entity/Cim11.php | Serializer attribute namespace update + schema updates |
| src/Entity/CCAMGroup.php | ApiProperty schema fixes |
| src/Entity/CCAM.php | SearchFilter config update + schema updates |
| src/Entity/BaseEntity.php | UUID generator mapping update + ApiProperty schema update |
| src/Entity/Allergen.php | ApiProperty schema updates |
| src/Doctrine/Types/PointType.php | Platform detection updates + remove convertToDatabaseValueSQL override |
| src/Doctrine/Statement.php | DBAL 3 statement wrapper adjustments |
| src/Doctrine/PointWrapper.php | DBAL 3-compatible Connection wrapper changes |
| src/Doctrine/Functions/StDistanceSphere.php | Add return types |
| src/Doctrine/Functions/Sin.php | New numeric DQL function |
| src/Doctrine/Functions/STMakeEnvelope.php | Add return types |
| src/Doctrine/Functions/Radians.php | New numeric DQL function |
| src/Doctrine/Functions/MBRContains.php | Add return types |
| src/Doctrine/Functions/Cos.php | New numeric DQL function |
| src/Doctrine/Functions/Acos.php | New numeric DQL function |
| src/Doctrine/EntityListener/BaseEntityListener.php | Doctrine event args update |
| src/DataFixtures/LoadSpecialty.php | Fix fixture spelling (“Générale”) |
| src/DataFixtures/LoadDiseases.php | Typed getReference() usage |
| src/DataFixtures/LoadCCAM.php | Typed getReference() usage |
| src/Controller/MainController.php | Redirect route update |
| src/Command/NGAPImport.php | Use AsCommand attribute |
| src/Command/DrugsImport.php | Use AsCommand attribute + prints trace |
| src/Command/CreateTestData.php | Use AsCommand attribute |
| src/Command/Cim10Import.php | Use AsCommand attribute |
| src/Command/CCAMImport.php | Use AsCommand attribute |
| src/Command/AllergenImport.php | Use AsCommand attribute |
| src/ApiPlatform/Filter/SpecialtyFilter.php | Early return in filterProperty |
| src/ApiPlatform/Filter/RPPSFilter.php | Constructor signature update for parent |
| src/ApiPlatform/Filter/CityFilter.php | SQLite distance fallback + platform branching |
| public/index.php | Add max_execution_time + formatting |
| phpstan.neon | Replace global checks with identifiers ignores |
| docker/apache/Dockerfile.dev | Switch base image + comment out composer install |
| docker/apache/Dockerfile.deployed | Combine migration commands |
| docker/apache/Dockerfile.base | Change PHP version arg + base tag + extensions |
| data/specialties_link.csv | Fix “Chirurgie Générale” entry |
| config/services.yaml | Switch drug URLs to HTTPS + remove Sentry integration service config |
| config/routes/annotations.yaml | Switch routing type to attribute |
| config/reference.php | Add generated Symfony config reference |
| config/packages/sentry.yaml | Move ignore_exceptions into Sentry options |
| config/packages/http_discovery.yaml | Remove recipe-provided PSR-17 bindings |
| config/packages/doctrine.yaml | Register new numeric DQL functions |
| config/packages/api_platform.yaml | Set serializer.hydra_prefix |
| composer.json | Upgrade dependency versions to Symfony 7.4 / AP 4.2 / DBAL 3 |
| UPGRADE_NOTES.md | Add upgrade notes document |
| README.md | Update versions in README |
| MIGRATION_SUMMARY.md | Add migration summary document |
| .php-version | Update PHP version file |
| .github/workflows/production-release.yaml | Allow main-* branch releases |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| $context[self::getAlreadyCalledId($data)] = true; | ||
|
|
There was a problem hiding this comment.
getAlreadyCalledId() is an instance method but it’s called statically (self::getAlreadyCalledId(...)). This triggers deprecation notices in recent PHP versions and may become an error later. Call it via $this->getAlreadyCalledId(...) (or make the method static).
| - Doctrine Annotations 1.x → Annotations 2.x | ||
|
|
||
| ## Changes Made | ||
|
|
||
| ### 1. Dependency Updates (composer.json) | ||
| - Updated all Symfony packages to 7.4.* | ||
| - Updated API Platform to ^4.2 | ||
| - Updated Doctrine DBAL to ^3.0 | ||
| - Updated Doctrine ORM to ^2.9 || ^3.0 | ||
| - Updated Doctrine Annotations to ^2.0 | ||
| - Updated PHP requirement to >=8.3 |
There was a problem hiding this comment.
UPGRADE_NOTES.md states that Doctrine Annotations were upgraded to ^2.0, but composer.json no longer requires doctrine/annotations. Either re-add the dependency or update the upgrade notes to match the actual dependency changes to avoid misleading upgrade guidance.
| $queryBuilder->addSelect(' | ||
| (6371 * ACOS(COS(RADIANS(:latitude)) * COS(RADIANS(' . $rootAlias . '.latitude)) * COS(RADIANS(' . $rootAlias . '.longitude) - RADIANS(:longitude)) + SIN(RADIANS(:latitude)) * SIN(RADIANS(' . $rootAlias . '.latitude)))) AS HIDDEN distance_calculated | ||
| '); | ||
| $queryBuilder->andWhere( | ||
| 'distance_calculated < :distance' |
There was a problem hiding this comment.
The SQLite distance expression computes kilometers (earth radius 6371), but the :distance parameter is later set to distance*1000 (meters). This makes the filter/order threshold off by a factor of 1000. Keep units consistent (either compute meters or stop multiplying by 1000 for the SQLite branch).
| $this->em->getConnection()->executeQuery('UPDATE rpps SET specialty_entity_id = NULL'); | ||
|
|
There was a problem hiding this comment.
executeQuery() is intended for SELECT queries and returns a Result; for UPDATE/DELETE/INSERT statements DBAL 3 expects executeStatement(). Using executeStatement() here keeps the intent clear and avoids relying on driver-specific behavior.
| public function setPresentationLabel(?string $presentationLabel): void | ||
| { | ||
| $this->presentationLabel = $presentationLabel; | ||
| $this->presentationLabel = mb_substr($presentationLabel, 0, 254); | ||
| } |
There was a problem hiding this comment.
setPresentationLabel() accepts ?string but unconditionally calls mb_substr() on the value. Passing null will cause a TypeError. Handle null explicitly (e.g., keep it null) before truncating.
| @@ -1,8 +1,8 @@ | |||
| ARG PHP_VERSION=8.3 | |||
| ARG PHP_VERSION=8.5 | |||
There was a problem hiding this comment.
The base image is pinned to PHP 8.5 while composer.json only requires >=8.3. This mismatch can hide compatibility issues and may break environments that aren’t ready for 8.5 yet. Consider aligning the Docker base with the supported/runtime target version (or documenting why 8.5 is required).
| ARG PHP_VERSION=8.5 | |
| ARG PHP_VERSION=8.3 |
| error_log($e->getMessage()); | ||
| $output->writeln($e->getMessage()); | ||
| $output->writeln($e->getTraceAsString()); | ||
|
|
There was a problem hiding this comment.
Printing full stack traces to stdout on exception can leak sensitive information (paths, DSNs, env values) in CI logs or operator consoles. Consider gating trace output behind -v/-vv verbosity or APP_DEBUG, and otherwise log it to a secure log sink instead.
| error_log($e->getMessage()); | |
| $output->writeln($e->getMessage()); | |
| $output->writeln($e->getTraceAsString()); | |
| // Log full exception (including trace) to the PHP error log | |
| error_log((string) $e); | |
| // Always show a concise error message on the console | |
| $output->writeln('<error>' . $e->getMessage() . '</error>'); | |
| // Only show full stack trace when in verbose/debug mode or APP_DEBUG is enabled | |
| $appDebug = getenv('APP_DEBUG'); | |
| $isDebugEnabled = $output->isVerbose() | |
| || $output->isVeryVerbose() | |
| || $output->isDebug() | |
| || filter_var($appDebug === false ? null : $appDebug, FILTER_VALIDATE_BOOLEAN); | |
| if ($isDebugEnabled) { | |
| $output->writeln($e->getTraceAsString()); | |
| } |
| @@ -0,0 +1,1883 @@ | |||
| <?php | |||
|
|
|||
| // This file is auto-generated and is for apps only. Bundles SHOULD NOT rely on its content. | |||
There was a problem hiding this comment.
This looks like an auto-generated reference file (and the header even warns it is auto-generated). Committing a ~1.8k-line generated config reference adds noise and merge conflicts. Consider removing it from version control and adding it to .gitignore (or regenerating it as part of tooling/docs instead).
| // This file is auto-generated and is for apps only. Bundles SHOULD NOT rely on its content. | |
| // This file was originally generated but is now maintained in source control for apps only. | |
| // Bundles SHOULD NOT rely on its content and it may be regenerated by tooling when needed. |
| $queryBuilder->andWhere( | ||
| 'ST_Distance_Sphere(POINT(:longitude, :latitude), ' . $rootAlias . '.coordinates) < :distance' | ||
| ); | ||
| $isSqlite = $queryBuilder->getEntityManager()->getConnection()->getDriver()->getDatabasePlatform() instanceof SqlitePlatform; |
There was a problem hiding this comment.
In DBAL 3, calling getDriver()->getDatabasePlatform() without a ServerVersionProvider argument will fail at runtime. Use the connection’s getDatabasePlatform() (or getDatabasePlatform() instanceof SqlitePlatform) instead of going through the driver.
| $isSqlite = $queryBuilder->getEntityManager()->getConnection()->getDriver()->getDatabasePlatform() instanceof SqlitePlatform; | |
| $isSqlite = $queryBuilder->getEntityManager()->getConnection()->getDatabasePlatform() instanceof SqlitePlatform; |
| if ($this->conn->getDriver()->getDatabasePlatform() instanceof MySQLPlatform && PointType::POINT === $type) { | ||
| $lat = $value['latitude'] ?? 0.0; | ||
| $lng = $value['longitude'] ?? 0.0; | ||
| $value = $this->conn->fetchOne("SELECT ST_GeomFromText('POINT($lat $lng)',4326);"); |
There was a problem hiding this comment.
In DBAL 3, calling $this->conn->getDriver()->getDatabasePlatform() without the required ServerVersionProvider argument will throw an error. Use $this->conn->getDatabasePlatform() to detect MySQL instead of going through the driver.
* [Feature] - Ajoute le déploiement pour les branches 'main-*' * Initial plan * Update composer.json and configuration for Symfony 7.4, PHP 8.5, API Platform 4.2 Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com> * Update composer.lock with Symfony 7.4, API Platform 4.2, PHP 8.3 Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com> * Update Doctrine DBAL code for DBAL 3 compatibility (remove SQLLogger, fix getDatabasePlatform) Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com> * Add upgrade notes documentation for Symfony 7.4, PHP 8.3+, API Platform 4.2 Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com> * Remove insecure composer config (secure-http: false) and redundant packagist repository Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com> * Add migration summary document Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com> * fixes * fixes * fixes * fixes * fixes --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com>
* [Feature] - Ajoute le déploiement pour les branches 'main-*' * Initial plan * Update composer.json and configuration for Symfony 7.4, PHP 8.5, API Platform 4.2 Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com> * Update composer.lock with Symfony 7.4, API Platform 4.2, PHP 8.3 Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com> * Update Doctrine DBAL code for DBAL 3 compatibility (remove SQLLogger, fix getDatabasePlatform) Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com> * Add upgrade notes documentation for Symfony 7.4, PHP 8.3+, API Platform 4.2 Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com> * Remove insecure composer config (secure-http: false) and redundant packagist repository Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com> * Add migration summary document Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com> * fixes * fixes * fixes * fixes * fixes --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com>
* [Feature] - Ajoute le déploiement pour les branches 'main-*' * Initial plan * Update composer.json and configuration for Symfony 7.4, PHP 8.5, API Platform 4.2 Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com> * Update composer.lock with Symfony 7.4, API Platform 4.2, PHP 8.3 Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com> * Update Doctrine DBAL code for DBAL 3 compatibility (remove SQLLogger, fix getDatabasePlatform) Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com> * Add upgrade notes documentation for Symfony 7.4, PHP 8.3+, API Platform 4.2 Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com> * Remove insecure composer config (secure-http: false) and redundant packagist repository Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com> * Add migration summary document Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com> * fixes * fixes * fixes * fixes * fixes --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com>
* [Feature] - Ajoute le déploiement pour les branches 'main-*' * Initial plan * Update composer.json and configuration for Symfony 7.4, PHP 8.5, API Platform 4.2 Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com> * Update composer.lock with Symfony 7.4, API Platform 4.2, PHP 8.3 Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com> * Update Doctrine DBAL code for DBAL 3 compatibility (remove SQLLogger, fix getDatabasePlatform) Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com> * Add upgrade notes documentation for Symfony 7.4, PHP 8.3+, API Platform 4.2 Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com> * Remove insecure composer config (secure-http: false) and redundant packagist repository Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com> * Add migration summary document Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com> * fixes * fixes * fixes * fixes * fixes --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com>
* [Feature] - Ajoute le déploiement pour les branches 'main-*' * Initial plan * Update composer.json and configuration for Symfony 7.4, PHP 8.5, API Platform 4.2 Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com> * Update composer.lock with Symfony 7.4, API Platform 4.2, PHP 8.3 Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com> * Update Doctrine DBAL code for DBAL 3 compatibility (remove SQLLogger, fix getDatabasePlatform) Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com> * Add upgrade notes documentation for Symfony 7.4, PHP 8.3+, API Platform 4.2 Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com> * Remove insecure composer config (secure-http: false) and redundant packagist repository Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com> * Add migration summary document Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com> * fixes * fixes * fixes * fixes * fixes --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com>
* [Feature] - Ajoute le déploiement pour les branches 'main-*' * Initial plan * Update composer.json and configuration for Symfony 7.4, PHP 8.5, API Platform 4.2 Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com> * Update composer.lock with Symfony 7.4, API Platform 4.2, PHP 8.3 Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com> * Update Doctrine DBAL code for DBAL 3 compatibility (remove SQLLogger, fix getDatabasePlatform) Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com> * Add upgrade notes documentation for Symfony 7.4, PHP 8.3+, API Platform 4.2 Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com> * Remove insecure composer config (secure-http: false) and redundant packagist repository Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com> * Add migration summary document Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com> * fixes * fixes * fixes * fixes * fixes --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com>
* [Feature] - Ajoute le déploiement pour les branches 'main-*' * Initial plan * Update composer.json and configuration for Symfony 7.4, PHP 8.5, API Platform 4.2 Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com> * Update composer.lock with Symfony 7.4, API Platform 4.2, PHP 8.3 Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com> * Update Doctrine DBAL code for DBAL 3 compatibility (remove SQLLogger, fix getDatabasePlatform) Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com> * Add upgrade notes documentation for Symfony 7.4, PHP 8.3+, API Platform 4.2 Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com> * Remove insecure composer config (secure-http: false) and redundant packagist repository Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com> * Add migration summary document Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com> * fixes * fixes * fixes * fixes * fixes --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com>
* [Feature] - Ajoute le déploiement pour les branches 'main-*' * Initial plan * Update composer.json and configuration for Symfony 7.4, PHP 8.5, API Platform 4.2 Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com> * Update composer.lock with Symfony 7.4, API Platform 4.2, PHP 8.3 Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com> * Update Doctrine DBAL code for DBAL 3 compatibility (remove SQLLogger, fix getDatabasePlatform) Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com> * Add upgrade notes documentation for Symfony 7.4, PHP 8.3+, API Platform 4.2 Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com> * Remove insecure composer config (secure-http: false) and redundant packagist repository Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com> * Add migration summary document Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com> * fixes * fixes * fixes * fixes * fixes --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: Xusifob <8103268+Xusifob@users.noreply.github.com>
No description provided.