Travailler avec le modèle de données
Vue d’ensemble
La spécification d'un modèle de données est l'une des grandes étapes du cycle de développement d'un OAV. Il intervient après le recueil des besoins du métier.
Le modèle de données est spécifié au format OpenAPI. L'OIP met à disposition des outils pour la génération du code des entités à partir de ce fichier.
Ce cas d'usage détaille l'utilisation de l'ensemble de ces outils.
Prérequis
Ce cas d'usage nécessite un projet initialisé. Pour cela, référez-vous au démarrage rapide.
Cas d'usage
Modèle de données
Considérez le modèle de données ci-dessous.
openapi: 3.1.2
info:
title: Project
version: 4.0.0
contact:
email: [email protected]
components:
schemas:
Project:
type: object
x-fasst-entity-category: OIP_ENTITY_ROOT
description: L'entité Project est l'entité principale qui porte l'ensemble des autres entités
required: ['name', 'externalId']
properties:
name:
description: Nom du projet client
type: string
externalId:
description: Identifiant externe du projet
type: string
companies:
description: liste des entreprises associées au projet client
type: array
readOnly: false
items:
$ref: "#/components/schemas/Company"
customers:
description: liste des clients associées au projet client
type: array
readOnly: false
items:
$ref: "#/components/schemas/Customer"
Company:
x-fasst-entity-category: OIP_ENTITY
description: L'entité Company contient les informations de l'entreprise
type : object
properties:
name:
description: Nom de l'entreprise
type: string
siret:
description: Numéro SIRET de l'entreprise
type: string
Customer:
x-fasst-entity-category: OIP_ENTITY
description: L'entité Customer contient les informations du client
type : object
properties:
firstName:
description: Prénom du client
type: string
lastName:
description: Nom du client
type: stringCe fichier définit trois relations et leurs relations :
- une entité Project (entité racine) ;
- une entité Company ;
- une entité Customer ;
- une relation de l'entité Project vers l'entité Company ;
- une relation de l'entité Project vers l'entité Customer.
Génération du code
La commande pour générer le code des entités à partir du modèle de données est :
npm run entities:genLa commande écrit sur la sortie standard du terminal :
- la liste des entités détectées ;
- la liste des fichiers générés ;
- les éventuelles erreurs.
Entités
La commande a généré 4 fichiers dans le dossier entities :
- entities.mjs ;
- Company/index.mjs ;
- Customer/index.mjs ;
- Project/index.mjs.
Le fichier entities.mjs contient la définition des entités.
Les fichiers index.mjs contiennent les fonctions de manipulation de l'entité et l'ensemble des accesseurs pour manipuler ses propriétés.
// Code generated by gen. DO NOT EDIT.
export default {
Project: {
properties: {
name: { type: 'string' },
externalId: { type: 'string' },
},
relations: ['Company', 'Customer'],
},
Company: {
properties: {
name: { type: 'string' },
siret: { type: 'string' },
},
},
Customer: {
properties: {
firstName: { type: 'string' },
lastName: { type: 'string' },
},
},
};
Migrations
La commande a également généré 1 fichier dans le dossier migrations :
- 1776258982390_migration.js.
Ce fichier contient le code SQL pour enregistrer les entités et leurs relations.
// Code generated by gen. DO NOT EDIT.
// Detected entities: Company, Customer, Project
// Detected entity relations: Project->Company, Project->Customer
// Migration file generated at: 2026-04-15T13:16:22.389Z
export const up = (pgm) => {
const { OAV_ID } = process.env;
// insert entity Project
pgm.sql(`
insert into entities_types (type, is_root, application_id)
values ('Project', true, (select id from applications where public_id = '${OAV_ID}'))
on conflict do nothing;
`);
// insert entity Company
pgm.sql(`
insert into entities_types (type, is_root, application_id)
values ('Company', false, (select id from applications where public_id = '${OAV_ID}'))
on conflict do nothing;
`);
// insert entity Customer
pgm.sql(`
insert into entities_types (type, is_root, application_id)
values ('Customer', false, (select id from applications where public_id = '${OAV_ID}'))
on conflict do nothing;
`);
// insert relation Project->Company
pgm.sql(`
insert into entities_relations_types (src_type_id, tgt_type_id)
values ((
select id from entities_types where type = 'Project' and application_id = (select id from applications where public_id = '${OAV_ID}')), (
select id from entities_types where type = 'Company' and application_id = (select id from applications where public_id = '${OAV_ID}')))
on conflict do nothing;
`);
// insert relation Project->Customer
pgm.sql(`
insert into entities_relations_types (src_type_id, tgt_type_id)
values ((
select id from entities_types where type = 'Project' and application_id = (select id from applications where public_id = '${OAV_ID}')), (
select id from entities_types where type = 'Customer' and application_id = (select id from applications where public_id = '${OAV_ID}')))
on conflict do nothing;
`);
};
export const down = false;Application des migrations
La commande pour appliquer les migrations SQL est :
npm run migrate:devLa commande écrit sur la sortie standard du terminal :
- la liste des fichiers exécutés ;
- les éventuelles erreurs.
Résumé
La génération du code des entités à partir d'un modèle de données se résume à l'exécution de deux commandes :
npm run entities:gen
npm run migrate:devCes commandes sont à exécuter à chaque nouvelle version du fichier config/entities/entities.openapi.yml.