API
Routes HTTP d'admin et publiques, et fonctions serveur importables pour lire des pages sans aller-retour HTTP.
Le module expose ses pages de deux façons : des routes HTTP pour le navigateur, et des fonctions serveur pour les composants et scripts qui tournent dans le même processus.
Règle absolue : depuis un Server Component, un bloc ou un sitemap.js, ne jamais appeler les routes HTTP avec fetch. C'est un aller-retour réseau vers le processus courant. Importer les fonctions serveur.
Import
| Sous-chemin | Runtime | Contenu |
|---|---|---|
@lrvo/module-pages | serveur | manifest, register, createTables, dropTables. |
@lrvo/module-pages/public | serveur | Vue publique et fonctions de lecture. |
@lrvo/module-pages/client | client | registerPageTemplate. |
import { listPublicChildPages, getPublishedPageBySegments } from '@lrvo/module-pages/public';@lrvo/module-pages/public exporte aussi default et generateMetadata, destinés au re-export dans un catch-all. Voir Installation.
API
| Signature | Retour | Description |
|---|---|---|
listPublicChildPages(parentId, options?) | Promise<Page[]> | Pages publiques enfants d'un parent. |
getPublishedPageBySegments(segments) | Promise<Page | null> | Résout une page publique par sa chaîne de slugs. |
listPublicChildPages(parentId, options?)
Renvoie les pages de visibilité publique dont le parent est parentId, triées par titre. Passer null pour les pages racine.
options accepte limit (200 par défaut) et offset (0 par défaut).
Chaque page renvoyée porte un champ url déjà calculé, contenant son chemin public complet. Le chemin de base du parent est résolu une seule fois pour toute la liste, il n'y a donc pas de requête par page. C'est la seule fonction du module qui calcule une URL.
import { listPublicChildPages } from '@lrvo/module-pages/public';
const racine = await listPublicChildPages(null);
const enfants = await listPublicChildPages(12, { limit: 50 });blocks est volontairement absent du résultat : c'est une liste légère. Charger la page individuellement pour obtenir son contenu.
getPublishedPageBySegments(segments)
Résout une page publique en descendant la chaîne des parents depuis la racine. Renvoie null si un segment ne correspond pas, ou si la page cible n'est pas publique.
Le résultat est la ligne de la table, blocs compris, enrichis de leurs métadonnées médias et donc directement rendables. Il ne porte pas de champ url : le chemin est celui des segments passés en argument.
import { getPublishedPageBySegments } from '@lrvo/module-pages/public';
const segments = ['a-propos', 'equipe'];
const page = await getPublishedPageBySegments(segments);
if (page) {
console.log(page.title, '/' + segments.join('/'));
}Utile pour retrouver l'identifiant d'un parent passé sous forme de chemin, avant d'appeler listPublicChildPages.
Routes HTTP
Toutes sont montées sous le préfixe /lrvo/api, comme le veut core/api.
Admin
| Méthode | Chemin | Permission |
|---|---|---|
GET | /admin/pages | pages.view |
POST | /admin/pages | pages.manage |
GET | /admin/pages/templates | pages.view |
GET | /admin/pages/:id | pages.view |
PUT | /admin/pages/:id | pages.manage |
POST | /admin/pages/:id/duplicate | pages.manage |
DELETE | /admin/pages/:id | pages.manage |
GET /admin/pages accepte visibility, limit (100 par défaut) et offset. Les lignes renvoyées sont légères : blocks en est absent. Charger la page par son identifiant pour obtenir son contenu.
Corps de requête
POST /admin/pages accepte les champs suivants, tous optionnels sauf title :
| Champ | Type | Défaut |
|---|---|---|
title | chaîne | requis, non vide |
slug | chaîne | dérivé du titre |
parent_id | entier ou null | null, page racine |
template | chaîne | 'default' |
blocks | tableau | [] |
seo | objet | {} |
visibility | 'public' ou 'private' | 'public' |
PUT /admin/pages/:id est partiel : seuls les champs présents dans le corps sont écrits. Il accepte les mêmes champs, plus created_at, qui attend une date ISO dans le passé. Une date future ou illisible remonte en 400.
POST /admin/pages/:id/duplicate crée une copie de la page, titre suffixé de (copie), avec le même parent, le même template, les mêmes blocs, le même SEO et la même visibilité. Le slug est ré-unicifié automatiquement puisqu'il entre en collision avec l'original. La copie porte sa propre date de création.
Public
| Méthode | Chemin | Paramètres |
|---|---|---|
GET | /pages/by-path | path, requis |
GET | /pages | parent, limit, offset |
GET /pages/by-path attend le chemin en paramètre de requête, pas en segments d'URL, parce que le routeur ne gère pas les segments attrape-tout. Le format est about/team, sans barre oblique initiale. La réponse porte la ligne complète, blocks compris, mais sans enrichissement média : les blocs image n'y portent ni URL, ni texte alternatif, ni légende. C'est une raison de plus de passer par getPublishedPageBySegments dès qu'on est côté serveur.
GET /pages liste les pages enfants publiques. parent accepte un identifiant numérique, un chemin de slugs, ou la valeur root. Absent, il liste les pages racine. Les lignes portent url, et n'ont ni blocks ni seo.
Les deux routes filtrent sur la visibilité publique et ne renvoient jamais de page privée.
Notes
- Les routes d'admin vérifient la permission avant d'atteindre le handler. Ne jamais court-circuiter cette vérification.
- Une erreur de validation de slug, de parent inexistant ou de cycle dans la hiérarchie remonte en
400avec son message. - Les fonctions serveur ne vérifient aucune permission : elles servent le rendu public et filtrent sur la visibilité, rien de plus. Ne pas les exposer telles quelles dans une route sans contrôle d'accès.