Skip to content

perf(backend): requêtes asynchrones#992

Merged
ocruze merged 13 commits intomainfrom
perf/async-requests
Mar 27, 2026
Merged

perf(backend): requêtes asynchrones#992
ocruze merged 13 commits intomainfrom
perf/async-requests

Conversation

@ocruze
Copy link
Member

@ocruze ocruze commented Mar 13, 2026

Réécriture complète des ApiService :

@ocruze ocruze force-pushed the perf/async-requests branch 4 times, most recently from 12c6705 to f309983 Compare March 19, 2026 13:14
@ocruze ocruze force-pushed the perf/async-requests branch from f309983 to 9683782 Compare March 20, 2026 14:37
@ocruze ocruze marked this pull request as ready for review March 20, 2026 17:20
@ocruze ocruze requested a review from Copilot March 20, 2026 17:27
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Ce PR introduit un nouveau client HTTP backend orienté “promesses” pour permettre le parallélisme (pagination, fetch de détails) et refactorise les appels Entrepôt/EspaceCo pour en tirer parti, afin d’améliorer les performances côté serveur et réduire les temps d’attente sur les écrans concernés.

Changes:

  • Ajout d’un ApiClient (promesses, pagination, résolution parallèle, upload multipart) + parseurs d’erreurs dédiés.
  • Refactorisation des services API Entrepôt/EspaceCo et des contrôleurs pour consommer ResponsePromise / PaginatedPromise.
  • Découplage du chargement de la liste des services d’une fiche de données (endpoint dédié + requête React Query dédiée).

Reviewed changes

Copilot reviewed 95 out of 96 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
src/Workflow/UploadIntegrationWorkflow.php Consommation des appels API via ResponsePromise (->array(), ->await()).
src/Utils.php Refactor de array_deep_equals + ajout helper normalize_query().
src/Services/SandboxService.php Consomme désormais CommunityApiService->get()->array().
src/Services/EspaceCoApi/WfsApiService.php Refactor vers ApiClient + retour ResponsePromise.
src/Services/EspaceCoApi/UserApiService.php Refactor vers ApiClient + retours ResponsePromise/->array().
src/Services/EspaceCoApi/TransactionApiService.php Refactor pagination via PaginatedResponse.
src/Services/EspaceCoApi/StyleApiService.php Refactor vers ApiClient style + lecture text() + headers.
src/Services/EspaceCoApi/ReportApiService.php Refactor complet (list/all CRUD) vers ApiClient.
src/Services/EspaceCoApi/ReplyApiService.php Refactor CRUD vers ApiClient.
src/Services/EspaceCoApi/PermissionApiService.php Refactor vers ApiClient + requestAll()/PaginatedPromise.
src/Services/EspaceCoApi/LayerApiService.php Refactor update layer vers ApiClient.
src/Services/EspaceCoApi/GridApiService.php Refactor pagination + getPageCount() côté client.
src/Services/EspaceCoApi/GeoserviceApiService.php Refactor vers ApiClient.
src/Services/EspaceCoApi/EmailPlannerApiService.php Refactor vers ApiClient + PaginatedPromise.
src/Services/EspaceCoApi/DatabaseApiService.php Refactor endpoints DB/table/col + requestAll().
src/Services/EspaceCoApi/CommunityLayerApiService.php Refactor getLayers() vers requestAll().
src/Services/EspaceCoApi/CommunityDocumentApiService.php Refactor endpoints documents + upload via sendFile().
src/Services/EspaceCoApi/CommunityApiService.php Refactor vers ApiClient + résolution async/then() sur requestAll().
src/Services/EspaceCoApi/BaseEspaceCoApiService.php Supprimé (ancien socle remplacé par ApiClient).
src/Services/EntrepotApi/UserDocumentsApiService.php Refactor documents utilisateur vers ApiClient (+ nettoyage fichiers via Filesystem).
src/Services/EntrepotApi/UserApiService.php Refactor users/me/keys/permissions vers ApiClient (suppression getMyDatastores).
src/Services/EntrepotApi/StoredDataApiService.php Refactor + normalisation query + fetch détails en parallèle.
src/Services/EntrepotApi/StaticApiService.php Refactor statics vers ApiClient + pagination.
src/Services/EntrepotApi/ServiceAccount.php Ajuste getMe() en ->array().
src/Services/EntrepotApi/ProcessingApiService.php Refactor processings vers ApiClient + fetch détails en parallèle.
src/Services/EntrepotApi/MetadataApiService.php Refactor metadata vers ApiClient + upload et tags.
src/Services/EntrepotApi/DatastoreApiService.php Refactor + cache + requestAll() permissions.
src/Services/EntrepotApi/ConfigurationApiService.php Refactor configurations/offerings vers ApiClient + détails async.
src/Services/EntrepotApi/CommunityApiService.php Refactor communauté Entrepôt vers ApiClient.
src/Services/EntrepotApi/CatalogsApiService.php Refactor catalog endpoints vers ApiClient.
src/Services/EntrepotApi/CartesStylesApiService.php Adaptation aux retours promesses (resolve(), text(), await()).
src/Services/EntrepotApi/CartesStoredDataApiService.php Adaptation suppression stored_data/processings en await()/resolve().
src/Services/EntrepotApi/CartesMetadataApiService.php Adaptation metadata/annexes/download en text() et actions en await().
src/Services/EntrepotApi/BaseEntrepotApiService.php Supprimé (ancien socle remplacé par ApiClient).
src/Services/EntrepotApi/AnnexeApiService.php Refactor annexes vers ApiClient + pagination.
src/Services/CapabilitiesService.php Adaptation à PaginatedPromise->resolve() pour offerings/annexes.
src/Services/AbstractApiService.php Supprimé (remplacé par ApiClient).
src/Security/KeycloakUserProvider.php Consommation de getMe()->array() pour user provider.
src/Dto/Services/PyramidVector/PyramidVectorGenerateDTO.php Ajustement whitespace (format).
src/Controller/EspaceCo/WfsController.php Utilise ->text() pour renvoyer XML/JSON brut.
src/Controller/EspaceCo/UserController.php Consomme ResponsePromise->array().
src/Controller/EspaceCo/TransactionController.php Consomme PaginatedResponse (content, headers).
src/Controller/EspaceCo/ReportController.php Consomme PaginatedResponse + text() pour RSS/WFS.
src/Controller/EspaceCo/ReplyController.php Consomme ResponsePromise->array().
src/Controller/EspaceCo/PermissionController.php Résolution PaginatedPromise->resolve() + actions await().
src/Controller/EspaceCo/GridController.php Consomme ->array() sur get().
src/Controller/EspaceCo/GeoserviceController.php Consomme ->array().
src/Controller/EspaceCo/EmailPlannerController.php Utilise resolve()/await() selon endpoints.
src/Controller/EspaceCo/DatabaseController.php Utilise resolve()/array() selon endpoints.
src/Controller/EspaceCo/CommunityLayerController.php getLayers()->resolve() + update await().
src/Controller/EspaceCo/CommunityDocumentController.php Consomme ->array() + delete en await().
src/Controller/EspaceCo/CommunityController.php Consomme ->array()/resolve() pour appels EspaceCo.
src/Controller/Entrepot/WmsVectorController.php Passage à ->array()/await() pour offerings/configs/statics.
src/Controller/Entrepot/WfsController.php Passage à ->array() pour offering/config.
src/Controller/Entrepot/UserDocumentsController.php PaginatedResponse + téléchargement text() + deletes en await().
src/Controller/Entrepot/UserController.php getMe()->array(), lists en resolve(), mutations en await(); suppression route datastores.
src/Controller/Entrepot/UploadController.php resolve() pour listes, await() pour side-effects, text()/array() pour contenus.
src/Controller/Entrepot/StyleController.php Consomme offering/config via ->array() + annexes await().
src/Controller/Entrepot/StoredDataController.php resolve() pour listes, ->array() pour get/report/uses, logs via ->array().
src/Controller/Entrepot/StaticController.php List PaginatedResponse, download via text(), delete via await().
src/Controller/Entrepot/ServiceController.php Offerings via resolve() + offering/config via ->array().
src/Controller/Entrepot/PyramidVectorController.php ->array() + mutations await() + strict bool style.
src/Controller/Entrepot/PyramidRasterController.php ->array() + mutations await() + annexes/statics via resolve().
src/Controller/Entrepot/ProcessingController.php Listes via resolve() (et détaillées via helper).
src/Controller/Entrepot/MetadataController.php Listes via resolve(), fichiers via text(), mutations via await().
src/Controller/Entrepot/DatastoreController.php Permissions via resolve(), CRUD via array()/await(), nettoyage attributs Route.
src/Controller/Entrepot/DatasheetDocumentController.php Downloads annexes via text(), listes via resolve(), delete en await().
src/Controller/Entrepot/DatasheetController.php Parallélisation des fetchs init + extraction endpoint getServices() + suppression service_list du détail.
src/Controller/Entrepot/CommunityController.php Passage à ->array()/resolve() et mutations en await().
src/Controller/Entrepot/CatalogsController.php requestAll()->resolve() pour catalogs.
src/Controller/Entrepot/AnnexeController.php resolve() pour listes, download via text(), mutations via await().
src/Controller/ContactController.php getMe()->array() pour enrichir mail support.
src/ApiClient/ResponsePromise.php Nouveau wrapper de réponse lazy + résolution parallèle (stream).
src/ApiClient/RequestOptions.php Nouveau DTO d’options HTTP (query/json/upload).
src/ApiClient/PaginatedResponse.php Nouveau conteneur pagination + calcul pageCount.
src/ApiClient/PaginatedPromise.php Nouveau wrapper lazy pour pagination complète (resolve()).
src/ApiClient/ErrorParser/EspaceCoErrorParser.php Nouveau parseur d’erreurs EspaceCo.
src/ApiClient/ErrorParser/ErrorParserInterface.php Contrat de parseur d’erreurs pour ApiClient.
src/ApiClient/ErrorParser/EntrepotErrorParser.php Nouveau parseur d’erreurs Entrepôt.
src/ApiClient/AuthenticatedHttpClient.php Ajoute automatiquement le Bearer token Keycloak.
src/ApiClient/ApiClientFactory.php Factory de clients configurés (Entrepôt/EspaceCo/Style).
src/ApiClient/ApiClient.php Client HTTP unifié (verbes, upload, pagination, parallélisme).
docs/developer/README.md Ajoute un lien de doc ApiClient (mais introduit une redondance).
config/services.yaml Déclare les services app.api_client.* via factory.
config/packages/framework.yaml Configure retries HttpClient (GET sur codes 0/5xx).
assets/main.tsx Ajuste l’affichage toolbar Symfony (dev vs prod).
assets/entrepot/pages/datasheet/DatasheetView/ServiceListTab/ServicesListTab.tsx Liste services via UseQueryResult + état loading.
assets/entrepot/pages/datasheet/DatasheetView/ServiceListTab/ServicesListItem.tsx MAJ cache React Query sur la nouvelle query key “services”.
assets/entrepot/pages/datasheet/DatasheetView/DatasheetView/DatasheetView.tsx Ajoute query dédiée “services” + préchargement offering cache.
assets/entrepot/pages/datasheet/DatasheetView/DatasetListTab/StoredDataDeleteConfirmDialog.tsx Met à jour caches datasheet + services list lors d’une suppression.
assets/entrepot/api/user.ts Supprime getDatastoresList (endpoint backend retiré).
assets/@types/app.ts Retire service_list de DatasheetDetailed.
CLAUDE.md Ajoute doc de repo (mais contient une incohérence sur AbstractApiService).
Comments suppressed due to low confidence (1)

assets/entrepot/pages/datasheet/DatasheetView/ServiceListTab/ServicesListTab.tsx:29

  • En cas d'erreur React Query (services_list_query.isError), le composant retombe sur data ?? [] et affiche le message « aucun service », ce qui masque une erreur réseau/API et induit l'utilisateur en erreur. Ajouter un rendu dédié à l'état d'erreur (alerte + éventuel retry) éviterait ce faux négatif.
    if (services_list_query.isLoading) {
        return <LoadingText as="p" withSpinnerIcon />;
    }

    const servicesList = services_list_query.data ?? [];

    if (!servicesList || servicesList.length === 0) {
        return (
            <div className={fr.cx("fr-grid-row", "fr-grid-row--middle")}>
                <p>{t("services_tab.no_service")}</p>
            </div>

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 95 out of 96 changed files in this pull request and generated 5 comments.

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 96 out of 97 changed files in this pull request and generated 4 comments.

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 96 out of 97 changed files in this pull request and generated 7 comments.

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 96 out of 97 changed files in this pull request and generated 6 comments.

@ocruze ocruze requested a review from slafayIGN March 23, 2026 15:05
Copy link
Contributor

@slafayIGN slafayIGN left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Améliore un peu les performances, maintenant ça dépend surtout du backend.
C'est bon pour moi.

@ocruze ocruze merged commit 4b8ccc4 into main Mar 27, 2026
14 checks passed
@ocruze ocruze deleted the perf/async-requests branch March 27, 2026 12:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants