Skip to content

Creer des extensions

Les extensions sont des paquets de code installes que l hote GCS-SSC decouvre au demarrage. Creez une extension lorsqu un processus metier local doit ajouter un comportement sans modifier les ecrans de base pour tous les deploiements.

Cette page est destinee aux developpeurs. Les operateurs devraient utiliser Concepts : Extensions et les onglets Extensions des agences et volets.

Contrat D Auteur

Importez les contrats SDK depuis @gcs-ssc/extensions, les aides serveur depuis @gcs-ssc/extensions/server, les wrappers UI depuis @gcs-ssc/extensions/ui et les aides de test depuis @gcs-ssc/extensions/testing. N importez pas les chemins internes de l hote comme ~~/server, ~~/shared, ~/ ou #imports pour les contrats d extension.

ContratUtilisation
defineGcsExtensionDefinit le manifeste de l extension.
GCS_EXTENSION_SDK_VERSIONVersion SDK courante de l hote pour la compatibilite du manifeste.
GcsExtensionJsonConfigForme JSON de la configuration de volet.
ExtensionEntityTabContextProps des composants d onglet d entite.
defineGcsExtensionMigrationEncapsule les migrations Kysely de l extension.
defineGcsExtensionRouteHandlerEncapsule les gestionnaires serveur avec un contexte de route stable.
registerGcsExtensionCreateOperationHandlerBranche les operations de creation d engagements ou paiements.
createGcsExtensionUserErrorLance des erreurs localisees et visibles par l utilisateur.
Aides KVStockent de l etat non secret par type de proprietaire, id et cle.
Aides de secrets chiffresStockent les valeurs sensibles dans un stockage chiffre gere par l hote.
Wrappers UI et clientsRendent l UI hote et appellent les API d extension ou d hote depuis les composants.

Structure De Paquet

Fichier ou dossierUtilite
extension.config.tsManifeste requis exporte avec defineGcsExtension.
components/Composants Vue pour configuration, emplacements, onglets, actions ou calculateurs.
server/api/Gestionnaires serveur exposes par le repartiteur de l hote.
server/migrations/Migrations propres a l extension.
server/plugins/Plugins Nitro pour les hooks de creation.
server/runtime.tsResolveur facultatif d activation/configuration d execution.
client/ ou dossier d actifsFichiers statiques montes par le manifeste.
i18n/Messages anglais/francais facultatifs.
tests/Tests unitaires de config, routes, UI et logique metier.

Champs Du Manifeste

ts
import { defineGcsExtension } from '@gcs-ssc/extensions'

export default defineGcsExtension({
  key: 'gcs-example',
  sdkVersion: '^0.1.0',
  requiredHostCapabilities: [
    'stream-config-modal',
    'server-handlers',
    'server-handler-rbac',
    'extension-api-client'
  ],
  name: { en: 'Example', fr: 'Exemple' },
  description: {
    en: 'Adds local behaviour.',
    fr: 'Ajoute un comportement local.'
  }
})
ChampRegle
keyCle stable. Utilisez kebab-case minuscule et ne la changez pas apres creation de donnees.
sdkVersionPlage de version SDK compatible requise, par exemple ^0.1.0. L hote rejette les versions non prises en charge.
requiredHostCapabilitiesListe requise des capacites hote utilisees par le manifeste ou le code. L hote rejette les capacites manquantes ou inconnues.
nameNom bilingue requis.
descriptionDescription bilingue facultative pour les ecrans d administration.
adminComposants de configuration d agence, modale de volet ou page de volet.
clientEmplacements, onglets d entite, actions de creation et calculateurs.
css, i18n, assetsStyles, messages et actifs statiques facultatifs.
serverHandlersRoutes authentifiees d extension exposees par l hote.
migrationsMigrations Kysely lancees a l activation ou a la demande.
runtimeResolveur facultatif pour activation et configuration d emplacements.
nitroPluginPlugin serveur facultatif pour les hooks.

L hote valide les chemins de composants, gestionnaires, actifs et migrations afin qu ils restent dans le paquet d extension.

Capacites Prises En Charge

Declarez chaque capacite dont l extension depend :

CapaciteUtilisation
agency-configComposant de configuration d agence.
stream-config-modalConfiguration de volet rendue dans la modale Extensions du volet.
stream-config-pageRoute pleine page de configuration via admin.streamConfigPage.
entity-tabsOnglets d entente, promoteur, reclamation ou surveillance.
textarea-slotsComposants d emplacement dans les zones prises en charge.
create-actionsActions de creation pour engagements ou paiements d entente.
payment-amount-calculatorsComposants de calcul de montant de paiement.
server-handlersRoutes API sous /api/extensions/{extensionKey}.
server-handler-rbacRBAC et contexte d entite resolus par l hote.
migrationsMigrations propres a l extension.
runtime-resolutionResolveur d execution pour disponibilite/configuration.
public-assetsActifs statiques montes par l hote.
extension-uiWrappers UI et composants hote fournis.
extension-api-clientuseExtensionApi ou clients API d extension.
host-api-clientuseHostApi ou clients API hote stables.
extension-kvAides cle-valeur pour etat JSON non secret.
extension-secretsAides de secrets chiffres.
extension-create-operation-hooksHooks Nitro d operation de creation.
extension-lifecycle-hooksHooks de cycle de vie/creation exposes par l integration.

Configuration De Volet

Utilisez admin.agency lorsque l extension a besoin de reglages non secrets au niveau de l agence:

ts
admin: {
  agency: {
    path: './components/ExampleAgencyConfig.vue'
  }
}

Les composants de configuration d agence recoivent la configuration JSON courante avec v-model, ainsi que les props extension et agencyId. Stockez les valeurs sensibles par des gestionnaires serveur d extension et les aides de secrets chiffres plutot que dans la configuration d agence.

Utilisez admin.streamConfig lorsque l extension a besoin d une configuration de volet en modale :

ts
admin: {
  streamConfig: {
    path: './components/ExampleStreamConfig.vue'
  }
}

Utilisez admin.streamConfigPage lorsque la configuration a besoin d une page dediee :

ts
admin: {
  streamConfigPage: {
    path: './components/ExampleStreamConfigPage.vue'
  }
}

Les composants de configuration recoivent la config JSON courante avec v-model et les props de contexte :

vue
<script setup lang="ts">
import type { GcsExtensionJsonConfig } from '@gcs-ssc/extensions'
import type { GcsStreamConfigComponentProps } from '@gcs-ssc/extensions/ui'

defineProps<GcsStreamConfigComponentProps>()

const config = defineModel<GcsExtensionJsonConfig>({ required: true })
</script>

Les composants pleine page recoivent aussi hostLayout: true et peuvent utiliser l espace de page pour une configuration complexe. Les composants de modale devraient rester compacts.

RegleComportement
La config doit etre JSONUtilisez seulement primitives, tableaux et objets.
La config n est pas un coffre de secretsStockez des references d identifiants, pas les valeurs sensibles. Utilisez les aides de secrets chiffres pour les secrets.
L agence doit etre activee d abordLa configuration de volet est indisponible tant que l extension n est pas activee a l agence.
Les ids optionnels doivent etre toleresCertains contextes peuvent omettre transferPaymentId ou agencyId.
Validez avant sauvegardeRejetez les combinaisons incompletes dans le composant ou la validation serveur.
Rendez la config versionnableAjoutez un champ de version si la forme peut changer.

Emplacements D Execution

Les emplacements affichent des composants d extension dans des pages existantes.

EmplacementZone hote
textarea.afterApres-zone de texte generique.
agreement.descriptions.afterDescriptions anglaise/francaise d entente.
agreement.profile.classification.fieldsSection Classification de l entente.
agreement.profile.profile.fieldsSection Profil de l entente.
agreement.profile.risk-management.fieldsSection Gestion du risque de l entente.
agreement.profile.sections.afterApres les sections du profil d entente.
proponent.descriptions.afterDescriptions anglaise/francaise du promoteur.

Les composants d emplacement doivent rester discrets et ne pas dupliquer les champs de base. Si un emplacement ecrit des donnees, stockez-les sous la cle de l extension.

Onglets D Entite

Les onglets peuvent cibler agreement, proponent, claim ou monitor.

ts
client: {
  tabs: [
    {
      target: 'agreement',
      id: 'risk-notes',
      label: { en: 'Risk notes', fr: 'Notes de risque' },
      icon: 'i-lucide-database',
      path: './components/AgreementRiskNotesTab.vue',
      rbac: { subject: 'agreement', action: 'update' }
    }
  ]
}
PropContenu
extensionKeyCle du manifeste.
contextCible, ids agence/volet/entente/promoteur/reclamation/surveillance, proprietaire, portee et exigence RBAC.
configConfiguration resolue de volet ou d agence.
rbacExigence RBAC declaree par l onglet.
RegleComportement
Les ids d onglet sont uniques par cibleUtilisez kebab-case minuscule.
Les onglets exigent l activationEntente, reclamation et surveillance exigent activation agence et volet; promoteur exige activation agence.
Les onglets exigent le RBACL hote verifie le sujet et l action declares avant affichage.
Les promoteurs sans agence principale n affichent pas d ongletsL activation des onglets promoteur passe par l agence principale.

Gestionnaires Serveur

ts
serverHandlers: [
  {
    route: '/agreements/[agreementId]/risk-notes',
    method: 'post',
    path: './server/api/risk-notes.post.ts',
    rbac: {
      subject: 'agreement',
      action: 'update',
      entity: {
        target: 'agreement',
        param: 'agreementId'
      }
    }
  }
]

Les fichiers de gestionnaire devraient utiliser defineGcsExtensionRouteHandler :

ts
import { defineGcsExtensionRouteHandler } from '@gcs-ssc/extensions/server'

export default defineGcsExtensionRouteHandler(async ({ db, params, config, entity, readBody }) => {
  const body = await readBody<{ note?: string }>()
  return { ok: true, agreementId: params.agreementId, config, entity, body, dbAvailable: Boolean(db) }
})

Le contexte stable contient db, params, auth, config, entity, stream, agency, authorizedScope, readBody et getHeader. context.event reste disponible comme echappatoire, mais les gestionnaires normaux ne devraient pas lire les details H3 internes de l hote.

RegleComportement
Declarez le RBAC pour les donnees d entiteL hote resout l entite depuis le parametre de route, verifie l activation, transmet config/contexte et applique le sujet/action.
Les parametres doivent etre explicitesentity.param, stream.param ou agency.param doit correspondre a un parametre de route.
Utilisez auth: "manual" seulement deliberementLes gestionnaires manuels doivent faire leur propre autorisation metier; ils ne peuvent pas combiner auth: "manual" avec rbac.
Utilisez GcsExtensionUserError pour les erreurs utilisateurLes messages localises de l extension permettent la traduction par l interface.
Validez toutes les entreesLes gestionnaires d extension valident leurs propres requetes.
Respectez la propriete hoteResoudre entente, promoteur, reclamation, surveillance, volet et agence avant d ecrire lorsque l hote ne l a pas deja fait.

Runtime UI

@gcs-ssc/extensions/ui expose les wrappers et composables fournis par l hote. Utilisez-les au lieu d importer Nuxt UI ou les composants Common* de l hote directement.

Les exports courants incluent ExtensionButton, ExtensionFormField, ExtensionInput, ExtensionSelect, ExtensionTable, ExtensionResourceLayoutCard, ExtensionSection, ExtensionSaveButton, ExtensionStatusBadge, useExtensionI18n, useExtensionToast, useExtensionFetch, useExtensionApi, useHostApi et useExtensionGroupedTableExpansion.

Utilisez useExtensionApi(extensionKey) pour les routes propres a l extension sous /api/extensions/{extensionKey}. Utilisez useHostApi() seulement pour les routes hote stables et declarez host-api-client.

Actions De Creation

OperationSurface hote
agreement.commitments.createOnglet Engagements de l entente.
agreement.payments.createOnglet Paiements de l entente.
ModeComportement
appendGarde le bouton Ajouter de l hote et ajoute l action d extension.
replaceCache le bouton Ajouter lorsqu un seul remplacement actif existe.

Si plusieurs extensions actives remplacent la meme operation, l hote bloque l action jusqu a correction de la configuration. Appelez onCreated() apres une creation reussie pour rafraichir la table.

Un hook serveur de creation vit dans un plugin Nitro:

ts
import { registerGcsExtensionCreateOperationHandler } from '@gcs-ssc/extensions/server'

export default defineNitroPlugin(nitroApp => {
  registerGcsExtensionCreateOperationHandler(
    'gcs-example',
    'agreement.payments.create',
    async context => ({ status: 'continue' }),
    nitroApp
  )
})
ResultatComportement
continue ou aucun resultatLa creation de base continue.
handledL extension fournit la reponse et la creation de base s arrete.

Lorsqu un hook de creation bloque une action corrigeable par l utilisateur, lancez createGcsExtensionUserError avec des valeurs bilingues pour message et details. L hote choisit la langue de la requete et retourne ces messages dans la forme d erreur API normale.

Calculateurs De Montant

Les calculateurs de paiement peuvent fournir montant suggere, plafond, devise, details, etat de chargement et donnees d extension pour agreement.payments.create. Un seul calculateur actif peut s appliquer a la fois.

RegleComportement
Le calculateur doit correspondre a l operationL hote actuel prend en charge la creation de paiements d entente.
Le calculateur doit etre uniqueLes conflits entre calculateurs actifs bloquent le formulaire.
Le plafond est applique dans le formulaireL utilisateur ne peut pas sauvegarder un montant au-dessus du plafond.
La validation serveur reste requiseReverifiez les montants generes avant d ecrire.

Migrations, KV Et Secrets

ts
import {
  defineGcsExtensionMigration,
  setEncryptedExtensionSecret,
  getEncryptedExtensionSecret,
  deleteEncryptedExtensionSecret
} from '@gcs-ssc/extensions/server'
StockageUtilisation
Les migrations appartiennent a l extensionUtilisez le schema extensions et des noms de table propres a l extension.
Les chemins sont listes dans le manifesteL hote lance les migrations listees pour les extensions activees.
Les imports de paquet standard sont permisLes fichiers de migration peuvent importer des dependances comme kysely; l hote les resout depuis l installation de l application.
L historique est propre a chaque extensionChaque extension utilise ses propres tables d historique et de verrouillage; les migrations en attente sont suivies separement.
Aides KVStockez un etat JSON simple non secret par type de proprietaire, id et cle. Les entrees KV sont supprimees logiquement.
Aides de secrets chiffresStockez des valeurs JSON sensibles comme cles privees, jetons API, jetons de rafraichissement, secrets de signature ou identifiants de service externe.
Les workflows complexes meritent des tables explicitesUtilisez des migrations pour rapports, relations, etats ou gros dossiers.

Les secrets chiffres utilisent la table extensions.secret_entry et AES-256-GCM. Les valeurs sont liees a la cle d extension, au type de proprietaire, a l id de proprietaire, a la cle de secret et a la version de cle. Les metadonnees peuvent stocker seulement des champs non sensibles, comme une etiquette ou un suffixe masque.

La cle racine de chiffrement de l hote est GCS_EXTENSION_SECRETS_KEY, une cle de deploiement de 32 octets encodee en base64. Ne la stockez pas dans la config d extension, KV, controle source, donnees semees de vrais environnements ou config runtime visible au navigateur.

Les aides de secrets chiffres sont exposees par @gcs-ssc/extensions/server: setEncryptedExtensionSecret, getEncryptedExtensionSecret et deleteEncryptedExtensionSecret.

Actifs Et I18n

FonctionChampGuidance
Actifs statiquesassetsMontez seulement les fichiers requis a l execution avec un baseURL unique.
Actifs de paquetassets.package et packagePathUtile pour modeles ou actifs tiers.
Messages bilinguesi18nFournissez libelles et erreurs anglais/francais.
CSScssGardez les styles limites et evitez d ecraser globalement les jetons de l hote.

Liste De Verification

Utilisez installExtensionTestUiRuntime depuis @gcs-ssc/extensions/testing pour les tests autonomes de composants qui ont besoin des wrappers UI de l hote.

TestResultat attendu
Import du manifesteextension.config.ts importe et valide sans chemins internes de l hote.
Declarations de capacitesChaque fonction hote utilisee est listee dans requiredHostCapabilities.
Activation d agenceL extension apparait dans l onglet Extensions et les migrations s executent.
Configuration de voletLa modale ou page sauvegarde du JSON valide et rejette les combinaisons invalides.
Emplacements et ongletsLes composants apparaissent seulement lorsque activation et RBAC le permettent.
Gestionnaires serveurPropriete, activation, RBAC ou autorisation manuelle et validation sont appliques.
Clients APIuseExtensionApi et useHostApi produisent les chemins attendus et gerent les erreurs.
SecretsLes secrets sont chiffres/dechiffres cote serveur et jamais retournes a la config navigateur.
Conflits d actionsLes remplacements multiples sont detectes.
Conflits de calculateursLes calculateurs multiples sont detectes.
Interface bilingueLibelles, erreurs et onglets existent en anglais et francais.
Suppression logiqueLes donnees d extension preservent l historique lorsque requis.