Exporter une vue Archi vers un format JSON

🚀 Export de vues Archi au format JSON

Depuis plusieurs années, je travaille sur des outils d’export et d’import de données dans Archi au format JSON.
Ce projet vise à faciliter le partage, la duplication et l’automatisation des modèles Archi, tout en gardant une structure claire et ouverte.

🧩 Le programme d’export de vue Archi au format JSON

J’ai développé plusieurs programmes d’import et d’export de données depuis Archi, qui repose sur le format JSON.

Dans cette article, je propose un programme d’export de vues JSON, permettant d’extraire l’ensemble des éléments constitutifs d’une vue :

  • les composants
  • les relations
  • les propriétés
  • les notes
  • les liens

Le tout est désormais opérationnel. Cette version 0.9.4 marque une étape importante : l’export est complet, validé et conforme à la structure JSON que j’ai définie et testée sur plusieurs vues.


⚙️ Avant de commencer

Le format d’export JSON est encore susceptible d’évoluer.
J’ai expérimenté plusieurs paramètres et différentes configurations de vues afin d’assurer la cohérence et la robustesse du format.


🧠 Un format d’échange simple et extensible

Le format JSON retenu se veut facile à comprendre et à manipuler.
Il ouvre la porte à de nombreuses possibilités :

  • génération automatique de documentation
  • création de matrices de flux
  • création de scripts CI/CD
  • et bien d’autres usages encore…

🏗️ Le modèle JSON

Ce modèle JSON s’appuie sur la structure des objets définie dans JArchi, garantissant une compatibilité directe avec l’environnement.

L’export JSON est basé sur un script JArchi que j’ai conçu et adapté pour ce projet. Pour l’utiliser, il faut installer JArchi au dessus de Archi.


📝 Et la suite ?

Dans le prochain article, je vous présenterai le programme d’import des vues, qui permettra de reconstruire automatiquement les vues à partir du format JSON.
Je travaille actuellement sur plusieurs approches :

  • une version 1.0.0 ,
  • et une version expérimentale intégrant des formulaires interactifs.

Voici le repositorie sous GitHUB :

https://github.com/TNT44/scriptJarchi


💡 En résumé
Cette version 1.0.0 pose les bases d’un véritable format d’échange JSON pour Archi, extensible et interopérable.
C’est une première étape vers un écosystème complet de scripts d’export/import, facilitant la duplication et la maintenance des vues complexes.

Publié dans Archi | Laisser un commentaire

Next.js : Intégration d’un projet Express Sequelize PostgreSQL.

Pour intégrer votre application Node.js avec Express et Sequelize dans une application Next.js, vous pouvez conserver votre architecture backend tout en structurant votre projet pour combiner l’API existante avec les fonctionnalités frontend de Next.js. Voici une proposition de structure et un guide pour l’intégration.


Structure proposée

/my-nextjs-app
├── /app                   # Répertoire pour les pages et les API de Next.js
│   ├── /api               # API internes spécifiques à Next.js (complémentaires à Express)
│   │   └── route.js       # Exemple d'API Next.js
│   ├── /dashboard
│   │   ├── layout.js      # Layout partagé
│   │   └── page.js        # Page principale pour `/dashboard`
│   └── layout.js          # Layout global
│   └── page.js            # Page d'accueil `/`
├── /backend               # Répertoire contenant l'application Node.js Express/Sequelize existante
│   ├── /config            # Configuration de Sequelize et autres fichiers
│   ├── /models            # Modèles Sequelize
│   ├── /routes            # Routes Express
│   ├── /services          # Logique métier
│   ├── app.js             # Configuration Express
│   └── server.js          # Point d'entrée du serveur Express
├── /components            # Composants React réutilisables
├── /lib                   # Bibliothèques partagées
│   ├── api.js             # Client pour communiquer avec l'API Express
│   └── db.js              # Connexion Sequelize si utilisée dans Next.js
├── /public                # Fichiers publics (images, favicon, etc.)
├── /styles                # Fichiers CSS globaux
├── .env                   # Variables d'environnement
├── next.config.js         # Configuration Next.js
├── package.json           # Dépendances
└── README.md              # Documentation


Étapes pour l’intégration

1. Conserver l’application Express dans /backend

  • Copiez les répertoires models, config, services, et routes existants dans le répertoire /backend.
  • Créez un fichier server.js dans /backend pour lancer votre application Express indépendamment :
// backend/server.js
const express = require('express');
const app = require('./app');

const PORT = process.env.BACKEND_PORT || 4000;

app.listen(PORT, () => {
  console.log(`Express backend running on http://localhost:${PORT}`);
});


2. Utiliser l’application Express avec Next.js

Vous pouvez configurer Next.js pour exécuter votre serveur Express via un serveur personnalisé.

Exemple d’un serveur Next.js avec Express :
// server.js (point d'entrée principal)
const express = require('express');
const next = require('next');
const backendApp = require('./backend/app'); // Importez votre app Express

const dev = process.env.NODE_ENV !== 'production';
const app = next({ dev });
const handle = app.getRequestHandler();

const PORT = process.env.PORT || 3000;

app.prepare().then(() => {
  const server = express();

  // Routes backend via Express
  server.use('/api', backendApp); // Utilise l'API Express sous `/api`

  // Routes Next.js
  server.all('*', (req, res) => {
    return handle(req, res);
  });

  server.listen(PORT, () => {
    console.log(`Next.js + Express running on http://localhost:${PORT}`);
  });
});


3. Communiquer avec l’API Express depuis Next.js

Utilisez le répertoire /lib pour centraliser les appels vers votre API Express.

Exemple d’un client API :
// lib/api.js
const API_URL = process.env.BACKEND_URL || 'http://localhost:4000';

export async function fetchUsers() {
  const response = await fetch(`${API_URL}/users`);
  if (!response.ok) throw new Error('Failed to fetch users');
  return response.json();
}

Dans une page Next.js, vous pouvez alors consommer cette API :

// app/users/page.js
import { fetchUsers } from '@/lib/api';

export default async function UsersPage() {
  const users = await fetchUsers();

  return (
    <div>
      <h1>Liste des utilisateurs</h1>
      <ul>
        {users.map(user => (
          <li key={user.id}>{user.name}</li>
        ))}
      </ul>
    </div>
  );
}


4. Base de données avec Sequelize

Si vous souhaitez utiliser Sequelize directement dans Next.js pour certaines fonctionnalités (par exemple, dans des API routes spécifiques), configurez une instance dans /lib/db.js.

Exemple de configuration Sequelize :
// lib/db.js
const { Sequelize } = require('sequelize');
const sequelize = new Sequelize(process.env.DB_URL, { dialect: 'postgres' });

module.exports = sequelize;

Dans une API Next.js :

// app/api/products/route.js
import db from '@/lib/db';

export async function GET() {
  const products = await db.models.Product.findAll();
  return new Response(JSON.stringify(products), { status: 200 });
}


5. Graduellement migrer les routes Express vers Next.js (optionnel)

Si vous souhaitez réduire la dépendance à Express, migrez vos routes Express en API Routes Next.js dans /app/api.

Exemple de migration :

Route Express existante :

// backend/routes/users.js
const express = require('express');
const router = express.Router();
router.get('/', async (req, res) => {
  const users = await User.findAll();
  res.json(users);
});
module.exports = router;

Migrée vers Next.js :

// app/api/users/route.js
import db from '@/lib/db';

export async function GET() {
  const users = await db.models.User.findAll();
  return new Response(JSON.stringify(users), { status: 200 });
}


Avantages de cette structure

  1. Modularité : Conservez votre application backend séparée dans /backend.
  2. Progressivité : Vous pouvez choisir de conserver Express ou de migrer progressivement vos routes vers Next.js.
  3. Réutilisabilité : Centralisez la logique métier dans /backend/services et partagez-la entre Express et Next.js.

Excellente question ! Voici une clarification complète pour répondre à vos doutes et simplifier la structure proposée.


Plusieurs questions

J’ai 2 fichiers server.js ou sont il ?

Dans un projet express sequelize, j’ai un fichier index.js qui contient la logique de connexion vers la base de données, qui utilise un fichier de properties dans le répertoire config.

Pourquoi je créer un fichier lib/db.js ?

1. Les deux fichiers server.js mentionnés

a) server.js pour Express (dans /backend)

  • Ce fichier sert uniquement à exécuter votre application Express séparée, indépendante de Next.js.
  • C’est là où vous configurez votre application Express + Sequelize pour qu’elle fonctionne en dehors de Next.js.
  • Par exemple : /backend ├── server.js <- Lance uniquement l'application Express. ├── app.js ├── config/ ├── models/ ├── routes/

b) server.js pour Next.js personnalisé (dans la racine /)

  • Ce fichier est un serveur personnalisé utilisé pour combiner votre application Next.js et Express.
  • Il agit comme un point d’entrée principal qui redirige :
    • Les requêtes frontend vers Next.js.
    • Les requêtes backend vers votre Express via /api.

Structure proposée :

/my-nextjs-app
├── server.js       <- Lance l'application Next.js et inclut votre Express.
├── /backend/
│   ├── server.js   <- Exclusivement pour votre backend standalone.

Pourquoi deux fichiers ?

  • Si vous voulez séparer complètement Express et Next.js pour les exécuter indépendamment, conservez les deux.
  • Si vous voulez tout intégrer dans Next.js, vous pourriez n’utiliser qu’un seul server.js (celui à la racine). On peut adapter cela selon votre besoin.

2. Fichier lib/db.js vs config/index.js

Actuellement dans votre projet Express :

  • Vous avez un fichier (par exemple config/index.js) qui contient :
    • La connexion Sequelize.
    • Les paramètres de configuration pour la base de données (via un fichier config.json ou .env).

Exemple :

// backend/config/index.js
const { Sequelize } = require('sequelize');
const config = require('./properties'); // Exemple d'importation

const sequelize = new Sequelize(
  config.database,
  config.username,
  config.password,
  { host: config.host, dialect: config.dialect }
);

module.exports = sequelize;

Dans Next.js avec lib/db.js :

  • Le fichier lib/db.js sert de pont entre Sequelize et les API routes spécifiques à Next.js.
  • Pourquoi ?
    • Pour rendre la connexion accessible directement aux API routes de Next.js (sans répéter la configuration Sequelize dans chaque route).
    • Permet de centraliser les dépendances côté Next.js.

Exemple simplifié :

// lib/db.js
import sequelize from '../backend/config/index'; // Réutilise votre logique existante

export default sequelize;

Alternatives :

  • Si vous ne voulez pas créer un nouveau fichier lib/db.js, vous pouvez directement utiliser votre fichier config/index.js dans Next.js. Exemple : // app/api/users/route.js import db from '../../backend/config/index'; export async function GET() { const users = await db.models.User.findAll(); return new Response(JSON.stringify(users), { status: 200 }); }

3. Doit-on vraiment séparer la base de données entre Express et Next.js ?

Non, vous pouvez centraliser tout dans votre backend actuel.

Si vous voulez garder Express comme principal backend :

  • Toutes les opérations de base de données restent dans Express.
  • Next.js se contente d’appeler votre API via /api.

Si vous voulez migrer certaines fonctionnalités vers Next.js :

  • Créez un fichier partagé (lib/db.js ou backend/config/index.js) pour une connexion réutilisable dans les API Routes de Next.js.

Recommandations pour simplifier :

Option A : Centralisez tout dans /backend

  • Continuez à gérer Sequelize uniquement dans Express (dans /backend/config).
  • Faites en sorte que Next.js consomme cette API via fetch : // lib/api.js const API_URL = 'http://localhost:4000'; // Point d'entrée Express export async function fetchUsers() { const response = await fetch(`${API_URL}/users`); return await response.json(); }

Option B : Intégrez Sequelize directement dans Next.js

  • Déplacez la configuration Sequelize dans /lib/db.js et migrez certaines routes Express vers des API Next.js.
  • Exemple : // lib/db.js import { Sequelize } from 'sequelize'; const sequelize = new Sequelize(process.env.DB_URL, { dialect: 'postgres' }); export default sequelize; Ensuite, dans une API route Next.js : // app/api/users/route.js import db from '@/lib/db'; export async function GET() { const users = await db.models.User.findAll(); return new Response(JSON.stringify(users), { status: 200 }); }

Conclusion

  1. Si vous souhaitez conserver votre backend Express tel quel, inutile de créer un fichier lib/db.js. Reutilisez backend/config/index.js.
  2. Si vous voulez migrer progressivement vers un système sans Express, utilisez un fichier centralisé comme lib/db.js pour gérer les connexions dans Next.js.

Quelle option correspond mieux à vos besoins ? Souhaitez-vous un exemple détaillé d’intégration ?

Publié dans Cloud computing | Laisser un commentaire

Next.js : Structure d’un projet Next.js 15 avec Express

Voici une structure recommandée pour un projet Next.js 15, en tenant compte de votre existant avec Node.js/Express et vos besoins spécifiques pour inclure des pages, des composants, une base de données et des API.


Structure globale du projet

/my-nextjs-app
├── /app                    # Répertoire pour les routes et les pages (Next.js 13+ App Router)
│   ├── /api                # API Routes internes (opérable sans dépendre de votre Express existant)
│   │   └── route.js        # Exemple : API pour des données internes
│   ├── /dashboard          # Exemple d'une route "dashboard"
│   │   ├── layout.js       # Layout partagé pour toutes les pages sous /dashboard
│   │   └── page.js         # Page principale pour /dashboard
│   ├── layout.js           # Layout global pour l'application
│   ├── page.js             # Page d'accueil `/`
│   ├── /about
│   │   └── page.js         # Page pour `/about`
├── /components             # Composants réutilisables (UI, formulaires, boutons, etc.)
│   ├── Header.js           # Exemple de composant d'en-tête
│   ├── Footer.js           # Exemple de composant de pied de page
│   └── Button.js           # Bouton réutilisable
├── /lib                    # Bibliothèques et utilitaires partagés
│   ├── db.js               # Connexion à la base de données (via Prisma, Sequelize, etc.)
│   └── fetcher.js          # Fonctions pour requêtes externes
├── /public                 # Fichiers publics accessibles directement (images, favicon, etc.)
│   ├── /images             # Images statiques
│   └── favicon.ico         # Icône de la page
├── /styles                 # Feuilles de style globales et modules CSS
│   ├── globals.css         # Styles globaux
│   └── variables.css       # Variables CSS personnalisées
├── /pages                  # Répertoire pour pages spécifiques ou API (si nécessaire)
│   ├── /api                # API routes supplémentaires (intégré avec Express ou pour migration)
│   │   └── hello.js        # Exemple d'API route
├── /tests                  # Tests unitaires ou d'intégration
│   ├── /components         # Tests pour les composants
│   ├── /pages              # Tests pour les pages
│   └── setupTests.js       # Configuration des tests
├── .env                    # Variables d'environnement (Base de données, clés API, etc.)
├── next.config.js          # Configuration Next.js
├── package.json            # Dépendances et scripts
└── README.md               # Documentation du projet


Détails des répertoires et fichiers clés

1. Pages et Routes (/app)

  • Utilisez le répertoire /app (système de routage moderne de Next.js) pour définir vos pages.
  • Exemple :
    • Une page à /dashboard :
      • app/dashboard/page.js
    • Un layout partagé :
      • app/dashboard/layout.js

2. Composants réutilisables (/components)

  • Placez les composants UI (entête, boutons, cartes, etc.) dans /components.
  • Exemple d’un composant bouton réutilisable : // components/Button.js export default function Button({ label, onClick }) { return <button onClick={onClick}>{label}</button>; }

3. Base de données (/lib/db.js)

  • Centralisez la connexion à la base de données ici.
  • Exemple avec Prisma : // lib/db.js import { PrismaClient } from '@prisma/client'; const prisma = new PrismaClient(); export default prisma;
  • Si vous utilisez une base liée à Express, vous pouvez la connecter ici et la réutiliser.

4. API Routes (/app/api ou /pages/api)

  • Pour des API internes ou publiques, utilisez le répertoire /app/api.
  • Exemple d’API pour récupérer des données : // app/api/data/route.js export async function GET() { const data = await fetchDataFromDatabase(); // Utilise /lib/db.js return new Response(JSON.stringify(data), { status: 200 }); }

5. Intégration d’Express existant

  • Si vous souhaitez intégrer votre API Express actuelle, configurez un serveur personnalisé avec Next.js.
  • Exemple : // server.js const express = require('express'); const next = require('next'); const app = next({ dev: process.env.NODE_ENV !== 'production' }); const handle = app.getRequestHandler(); app.prepare().then(() => { const server = express(); // Vos routes Express server.use('/api', require('./your-express-routes')); // Gestion des routes Next.js server.all('*', (req, res) => { return handle(req, res); }); server.listen(3000, () => console.log('> Ready on http://localhost:3000')); });

6. Public (/public)

  • Placez ici les fichiers accessibles directement (logos, images, etc.).
  • Exemple :
    • Une image public/images/logo.png sera accessible via /images/logo.png.

7. Styles (/styles)

  • Utilisez les fichiers CSS globaux ou les modules CSS pour styliser vos composants/pages.

Migration depuis Node.js/Express

  1. API Routes :
    • Si vos API sont simples, migrez-les directement dans /app/api.
    • Pour des API complexes, conservez votre serveur Express et utilisez-le avec un serveur Next.js personnalisé.
  2. Pages Frontend :
    • Remplacez vos routes Express qui servent des pages par des fichiers dans /app.
  3. Base de données :
    • Réutilisez vos configurations existantes dans /lib/db.js.
  4. Dépendances communes :
    • Intégrez vos dépendances actuelles dans package.json (e.g., dotenv, express).

Publié dans Cloud computing | Laisser un commentaire