Skip to content

Conversation

@StephaneTrebel
Copy link
Collaborator

@StephaneTrebel StephaneTrebel commented Sep 25, 2025

Ticket lié: #1623

Contexte

Dans le cadre d'une possible orientation de Console vers un mode de fonctionnement plutôt SSR (Server Side Rendering), dans lequel client et server seraient fusionné en un seul projet core qui recevrait ensuite ses plugins via de l'injection de dépendance, il nous faut envisager que les plugins soient "auto-portés", c'est-à-dire qu'ils contiendront à la fois les parties d'API de backend, et à la fois les parties de Composant de FrontEnd. Les plugins pourraient alors être chargés indépendamment (au graphe de dépendance près) et alimenter ainsi la Console dans son ensemble, plutôt que d'être "hard-codés" tantôt côté client, tantôt côté server.

Pour permettre une transition de la Console vers ce possible mode de fonctionnement futur, il nous faut explorer la possibilité de faire un rendu, côté server, de composants Vue.js, de manière à progressivement transformer notre full-SPA (Single Page Application) en hybride SPA/SSR (via de l'hydration des composant Vue.js qui auront été rendus côté serveur).

De cette manière l'application Console pourrait grosso modo suivre le fonctionnement suivant:

  • La partie fondamentale (core) serait initialement démarrée. Il s'agirait d'une application Vue.js SPA/SSR qui aurait ses composants basiques (home page, login, etc.) et les routes d'API qui vont avec.
  • Les plugins, qui seraient tous in fine externes à console, et qui seraient alors chargés au démarrage, chacun exposant des routes HTTP permettant de récupérer les composants Vue.js, et des routes HTTP d'API pour leur fonctionnement métier.

Si un fonctionnement tel qu'énoncé est possible, alors CPiN pourra devenir une "variante" de la Console avec ses plugins propres (ArgoCD, Vault, OpenCDS, etc.), et les autres utilisateurs de la Console pourront avoir "leurs" plugins (Flux, AWS Secret Manager, MonPluginCustom, etc.).

Contenu de cette MR

  • Ajout d'un composant Vue.js "standalone" (qui ne dépend ni de apps/client, ni de apps/server)
  • Ce composant est sérialisé en string lors d'un appel de client vers server sur la route GET /api/v1/opencds (note: le JWT de session est passé afin d'éviter une 302 vers Keycloak 😅 )
  • Vue.js récupère la chaîne brute et l'insère en innerHTML dans le template concerné de l'application cliente (ici j'ai créé un ListServiceChainBis qui me sert de placeholder, vu que ListServiceChain est déclaré dans le router. Je n'ai donc rien à recréer ici, je "squatte" la place)
  • Une fois le DOM mis à jour, un onUpdate va se déclencher et déclencher un deuxième rendu du composant ce qui permettra de le monter (au sens Vue.js du terme) et donc d'avoir les évènements du DOM qui vont avec (@click, par ex).

Reste à faire

  • Charger un "vrai" composant (typiquement le contenu de ListServiceChain qui est ici squatté) ce qui permettra de valider que tout un composant Vue.js avec sa diversité et sa complexité va fonctionner dans ce nouveau mode
  • Tester le passage de "props" (ou du moins faire en sorte que ça soit le moins bricolé possible)

Notes

  • Pour l'instant le composant plugins/opencds/app.js est lié symboliquement (ln -s) en client/src/opencds/app.js et server/src/opencds/app.js afin de ne pas lutter contre les règles d'import Typescript qui imposent que tous les scripts imports soient localisés dans src/. Dans la cible, où client et server seraient fusionné, ce sujet serait caduc.

mathieulaude and others added 30 commits August 25, 2025 16:16
The current quality gate raises "errors" that just aren't. Duplication,
Coverage, all these indicators are interesting, but they should not be
used with arbitrary values to achieve our quality goals.

Hence we will disable the Quality Gate check on Github actions side,
while keeping it on Sonarqube side for regular analysis.
It's not a plugin like ArgoCD, Gitlab, etc. but it's a dedicated
component with its own lifecycle, docker image, etc.
We thought it could be handled as a plugin like ArgoCD and others, but
in the end it's more like an adhoc integration that might even be moved
outside of this repository.
StephaneTrebel and others added 17 commits September 11, 2025 15:51
In this commit, I added a `plugins/opencds/app.js` script that is a standalone,
SSR-ready Vue.js component.

This component is retrieved as a rendered raw string through a `GET
/api/v1/opencds` HTTP request made by `client` (in the user's browser)
and then loaded by Vue.js in the DOM thanks to the `v-html` directive.

Then, a dedicated `onUpdated` callback is triggred by the DOM update and this
will trigger _another render_ of the component, on the client this time, that
will be "mounted" by Vue.js on the SSR DOM node.

Thus the component is rendered by the server, loaded by the client, and Vue.js
handles all the 🪄MAGIC🪄.
mathieulaude
mathieulaude previously approved these changes Sep 25, 2025
Copy link
Collaborator

@mathieulaude mathieulaude left a comment

Choose a reason for hiding this comment

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

Approve with ❤️

@cloud-pi-native-sonarqube
Copy link

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.

4 participants