Skip to content

feat(client): switch repositories to API v2 - #2441

Merged
KepoParis merged 1 commit into
mainfrom
feat/client-repositories-v2
Aug 7, 2026
Merged

feat(client): switch repositories to API v2#2441
KepoParis merged 1 commit into
mainfrom
feat/client-repositories-v2

Conversation

@KepoParis

Copy link
Copy Markdown
Contributor

Issues liées

Issues numéro: #2423, #2422


Quel est le comportement actuel ?

Le client consomme les routes v1 des dépôts via apiClient.Repositories :

  • listRepositories({ query: { projectId } })
  • createRepository({ body: { ...repoData, projectId } })
  • updateRepository({ params: { repositoryId }, body: { ...repoData, projectId } })
  • deleteRepository({ params: { repositoryId } })
  • syncRepository({ params: { repositoryId }, body: { branchName, syncAllBranches } })

Le projectId transite donc dans la query string ou dans le body. Le formulaire envoie par ailleurs son résultat brut au gestionnaire : sur une mise à jour, les champs non modifiables (id, projectId, internalRepoName, horodatages) et la clé de formulaire isStandalone partent dans le body, et le placeholder fakeToken — affiché à la place du token existant, jamais renvoyé par l'API — est réémis tel quel.

Quel est le nouveau comportement ?

Le client passe sur apiClient.RepositoriesV2, aligné sur les routes /api/v2/projects/:projectId/repositories :

  • listRepositoriesV2({ params: { projectId } })
  • createRepositoryV2({ params: { projectId }, body })
  • updateRepositoryV2({ params: { projectId, repositoryId }, body })
  • deleteRepositoryV2({ params: { projectId, repositoryId } })
  • syncRepositoryV2({ params: { projectId, repositoryId }, body })

projectId est un paramètre de chemin, plus un champ de query/body.

Deux adaptateurs isolent la conversion « résultat de formulaire → corps v2 » dans apps/client/src/utils/repository-utils.ts :

  • toCreateRepositoryBody construit la branche attendue par l'union discriminée du contrat v2 : isPrivate: true porte externalUserName / externalToken, isPrivate: false ne les envoie pas.
  • toUpdateRepositoryBody retire les champs que la route v2 refuse (id, projectId, createdAt, updatedAt, internalRepoName, isStandalone) et n'envoie externalToken que s'il a réellement été saisi : un token vide ou resté à fakeToken est omis, ce qui signale « inchangé » au back-end (💡 [REQUEST] - Expliciter l'intention de mise à jour des credentials de dépôt (API v2) #2422) au lieu d'écraser le secret en Vault par un placeholder.

La synchronisation construit désormais un body conforme à l'union du contrat : { syncAllBranches: true } ou { syncAllBranches: false, branchName }, au lieu d'un branchName potentiellement undefined.

Fichiers touchés :

  • apps/client/src/utils/project-utils.ts — appels et types du gestionnaire Repositories
  • apps/client/src/utils/repository-utils.ts — nouveau, les deux adaptateurs
  • apps/client/src/components/ProjectResources.vuesaveRepo / syncRepository passent par les adaptateurs
  • apps/client/src/stores/project.spec.ts — le spy cible RepositoriesV2.listRepositoriesV2
  • packages/shared/src/contracts/v2/repository.ts — export des types de body (ClientInferRequest, donc les entrées des schémas avant transformation)

Vérifications : vue-tsc --noEmit passe ; repository-utils.spec.ts (8 tests, nouveaux) et project.spec.ts (4 tests) passent.

Cette PR introduit-elle un breaking change ?

Non côté utilisateur : mêmes écrans, mêmes formulaires, mêmes actions. Le changement est interne au transport HTTP.

Correction de comportement au passage : modifier un dépôt privé sans toucher au champ token ne réécrit plus le secret avec fakeToken.

Prérequis de déploiement : les routes /api/v2/projects/:projectId/repositories doivent être servies (bloc nginx générique /api/v2 + back-end v2). Sans cela, les écrans dépôts retournent 404.

Autres informations

@KepoParis KepoParis self-assigned this Aug 7, 2026
@KepoParis KepoParis added the enhancement New feature or request label Aug 7, 2026
@KepoParis KepoParis added this to the 9.24.0 milestone Aug 7, 2026
@KepoParis KepoParis linked an issue Aug 7, 2026 that may be closed by this pull request
4 tasks
@github-actions github-actions Bot added the built label Aug 7, 2026
Base automatically changed from feat/repository-v2-await-reconciliation to main August 7, 2026 14:41
@KepoParis
KepoParis force-pushed the feat/client-repositories-v2 branch from 01dc717 to e9cc05b Compare August 7, 2026 14:43
@StephaneTrebel
StephaneTrebel requested a review from a team August 7, 2026 14:55
StephaneTrebel
StephaneTrebel previously approved these changes Aug 7, 2026
@KepoParis
KepoParis force-pushed the feat/client-repositories-v2 branch from e9cc05b to f98373f Compare August 7, 2026 15:10
@KepoParis
KepoParis changed the base branch from main to fix/repository-v2-private-credentials August 7, 2026 15:10
@KepoParis

Copy link
Copy Markdown
Contributor Author

Base automatically changed from fix/repository-v2-private-credentials to main August 7, 2026 15:45
@KepoParis
KepoParis force-pushed the feat/client-repositories-v2 branch from f98373f to abc8587 Compare August 7, 2026 15:50
@cloud-pi-native-sonarqube

Copy link
Copy Markdown

@KepoParis
KepoParis added this pull request to the merge queue Aug 7, 2026
Merged via the queue into main with commit 7431511 Aug 7, 2026
34 checks passed
@KepoParis
KepoParis deleted the feat/client-repositories-v2 branch August 7, 2026 16:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

built enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

💡 [REQUEST] - Exposer la gestion des repositories via l’API v2

3 participants