feat(billing): implement robust in-app subscription cancellation & fix CI/CD socket port typo

This commit is contained in:
Antigravity
2026-05-28 20:50:11 +00:00
parent f5608372dc
commit 457c6fa626
22 changed files with 656 additions and 460 deletions

View File

@@ -68,35 +68,40 @@ Pour offrir une expérience de saisie supérieure à celle de Notion (plus perfo
---
### US-4: Vue Structurée de Carnet Inline *(Redesign — voir [`docs/story-nextgen-editor-us4-redesign.md`](./story-nextgen-editor-us4-redesign.md))*
### US-4: Base de Données Inline (`structuredViewBlock`)
> ⚠️ **DEPRECATED** — La spec précédente (bloc "Auteurs & Œuvres") est **rejetée par le fondateur**.
> Le code legacy (`tiptap-database-block-extension.tsx`, `database-block-editor.tsx`, `database-block-types.ts`) doit être supprimé.
> La nouvelle spec complète (problème, options produit, Given/When/Then, modèle de données, migration, i18n, QA RTL) est dans [`docs/story-nextgen-editor-us4-redesign.md`](./story-nextgen-editor-us4-redesign.md).
> ⚠️ **Rejeté et supprimé :** l'ancien bloc marketing « Auteurs & Œuvres » (`tiptap-database-block-extension.tsx`, `database-block-editor.tsx`, `database-block-types.ts`).
> **Spec historique embed-only carnet :** [`docs/story-nextgen-editor-us4-redesign.md`](./story-nextgen-editor-us4-redesign.md) — **non retenue** ; le produit livré est le **dual-mode** ci-dessous.
**En tant que** rédacteur dans un carnet structuré,
**Je veux** insérer une vue en lecture de mon tableau de notes directement dans le corps de ma note,
**Afin de** voir mes données structurées en contexte, sans quitter l'éditeur.
**En tant que** rédacteur,
**Je veux** insérer un tableau interactif type Notion directement dans ma note, avec option de le lier au carnet structuré,
**Afin de** gérer des données en contexte ou synchroniser avec les notes du carnet.
#### Critères d'Acceptation (résumé) :
* **Étant donné** que ma note est dans un carnet structuré, **quand** je tape `/vue`, **alors** un bloc `structuredViewBlock` s'insère avec les données réelles du carnet — aucune donnée de démo.
* **Étant donné** que le carnet n'a pas de schéma, **alors** le bloc affiche un callout contextuel vers le wizard, pas une erreur.
* **Étant donné** qu'une note contient un ancien `databaseBlock`, **alors** il est retiré silencieusement sans crash.
#### Deux modes (même nœud TipTap `structuredViewBlock`) :
*(Voir `docs/story-nextgen-editor-us4-redesign.md` pour les critères complets, le modèle de données, et la checklist QA FR+fa RTL.)*
| Mode | Déclencheur par défaut | Données | UI |
|------|------------------------|---------|-----|
| **Base locale autonome** | `/database`, `/vue`, menu « Transformer en → Base de données » | Colonnes/lignes dans `localColumnsJson` / `localRowsJson` (attrs TipTap) | Tableau éditable, analyses, Memory Echo, conversion en carnet |
| **Vue liée au carnet** | Bouton « Lier à un carnet » ou sélecteur de carnet | API schéma + notes du carnet (`notebookId`) | Table / Galerie via `StructuredViewsContainer` |
#### Critères d'Acceptation :
* **Étant donné** une note ouverte, **quand** je tape `/database` ou `/vue`, **alors** un bloc **base locale autonome** s'insère (tableau vide éditable, pas de démo Auteurs/Œuvres).
* **Étant donné** un bloc local, **quand** je clique « Lier à un carnet », **alors** je peux afficher la vue structurée d'un carnet (table/galerie, données réelles).
* **Étant donné** un carnet lié sans schéma, **alors** callout vers le wizard — pas de crash.
* **Étant donné** un ancien `databaseBlock` HTML, **alors** migration vers bloc local par défaut — note charge sans crash.
* **Étant donné** n'importe quelle locale (dont `fa`), **alors** tous les libellés UI passent par i18n (`structuredViewBlock.*`) — pas de texte FR en dur dans l'embed.
---
## Spécifications Techniques d'Implémentation
### 1. Structure du Nœud `structuredViewBlock` (TipTap) — *US-4 Redesign*
### 1. Structure du Nœud `structuredViewBlock` (TipTap) — *US-4*
> ⚠️ **DEPRECATED :** L'ancienne section `DatabaseBlock` est remplacée. Voir [`docs/story-nextgen-editor-us4-redesign.md`](./story-nextgen-editor-us4-redesign.md) §7 pour le modèle complet.
Extension TipTap `StructuredViewBlockExtension` dans `tiptap-structured-view-block-extension.tsx` :
- Attributs : `notebookId` (string), `displayMode` ('table'|'gallery'), `filterJson` (string JSON `{}`)
- ReactNodeViewRenderer`structured-view-block-embed.tsx`
- Aucune donnée de démo — aucun payload JSON d'auteurs/livres dans les attrs.
Extension `StructuredViewBlockExtension` (`tiptap-structured-view-block-extension.tsx`) :
- Attributs partagés : `notebookId`, `displayMode` ('table'|'gallery'), `filterJson`
- Mode local : `isLocal: true`, `localColumnsJson`, `localRowsJson` (insertion par défaut)
- Mode carnet : `isLocal: false`, `notebookId` renseigné
- NodeView React`structured-view-block-embed.tsx` (dual-mode, i18n complet)
### 2. Le Plugin Drag Handle & Gutter en ProseMirror *(US-1, inchangé)*
Développer un plugin custom dans `/components/tiptap-drag-handle-plugin.ts` :
@@ -107,14 +112,13 @@ Développer un plugin custom dans `/components/tiptap-drag-handle-plugin.ts` :
### 3. Fichiers à modifier / créer / supprimer :
* `[NEW]` `memento-note/components/tiptap-drag-handle-plugin.ts` — Plugin Gutter (US-1)
* `[NEW]` `memento-note/components/tiptap-structured-view-block-extension.tsx` — Nœud Vue Structurée (US-4 redesign)
* `[NEW]` `memento-note/components/structured-view-block-embed.tsx`React NodeView avec SWR + états dégradés
* `[DELETE]` `memento-note/components/tiptap-database-block-extension.tsx` — Legacy rejeté
* `[DELETE]` `memento-note/components/database-block-editor.tsx` — Legacy rejeté
* `[DELETE]` `memento-note/lib/editor/database-block-types.ts`Legacy rejeté
* `[MODIFY]` `memento-note/components/note-content-area.tsx`Passer `notebookId` à l'éditeur
* `[MODIFY]` `memento-note/components/rich-text-editor.tsx` — Swap extension DB → Vue Structurée, mise à jour slash
* `[MODIFY]` `memento-note/components/block-action-menu.tsx` — Remplacer option "Database" par "Vue structurée"
* `[LIVRÉ]` `memento-note/components/tiptap-structured-view-block-extension.tsx` — Nœud dual-mode
* `[LIVRÉ]` `memento-note/components/structured-view-block-embed.tsx`UI base locale + vue carnet
* `[DELETE]` legacy `database-block-*` (Auteurs & Œuvres)
* `[MODIFY]` `memento-note/locales/en.json` + `fr.json` — clés `structuredViewBlock.*` (i18n embed)
* `[MODIFY]` `memento-note/components/note-content-area.tsx``notebookId` → éditeur
* `[MODIFY]` `memento-note/components/rich-text-editor.tsx`slash `/database` + `/vue`
* `[MODIFY]` `memento-note/components/block-action-menu.tsx` — « Transformer en → Base de données »
* `[MODIFY]` `memento-note/app/globals.css` — Gutter, poignée, glassmorphic dropdowns
---
@@ -125,9 +129,9 @@ Développer un plugin custom dans `/components/tiptap-drag-handle-plugin.ts` :
1. **Vérification Gutter :** Survoler des textes longs et vérifier que la poignée se positionne correctement à gauche. Glisser un paragraphe sur un autre et valider le réordonnancement.
2. **Vérification Menu :** Cliquer sur la poignée, dupliquer le bloc, supprimer le bloc, et le transformer en d'autres types.
3. **Vérification Paste :** Copier une référence de bloc, la coller, et vérifier que la transclusion est proposée et s'insère sous forme de `LiveBlock`.
4. **Vérification Vue Structurée Inline (US-4 redesign) :**
- Taper `/vue` dans une note de carnet structuré → bloc avec données réelles (pas Jules Verne).
- Taper `/vue` dans un carnet sans schéma → callout wizard, pas de crash.
- Ouvrir une note avec ancien `databaseBlock` → note charge sans erreur.
- Passer la langue en `fa` (persan) → libellés traduits, layout RTL correct.
- Voir checklist complète dans `docs/story-nextgen-editor-us4-redesign.md` §11.
4. **Vérification Base inline (US-4) :**
- `/database` ou `/vue` → base locale autonome (tableau éditable, design actuel).
- « Lier à un carnet » → vue table/galerie du carnet choisi.
- Carnet sans schéma → callout wizard.
- Ancien `databaseBlock` → charge sans crash.
- Locale `fa` → libellés i18n, RTL (`dir="auto"`).