SDK Node.js
SDK officiel Node.js/TypeScript pour l'API MonCréneau, publié sur npm.
Installation
npm install @moncreneau/api
# ou
yarn add @moncreneau/api
# ou
pnpm add @moncreneau/api
Configuration
import Moncreneau from '@moncreneau/api';
const client = new Moncreneau('YOUR_API_KEY');
CommonJS :
const { default: Moncreneau } = require('@moncreneau/api');
const client = new Moncreneau('YOUR_API_KEY');
Avec variables d'environnement :
import Moncreneau from '@moncreneau/api';
const client = new Moncreneau(process.env.MONCRENEAU_API_KEY);
Lister les départements
import Moncreneau from '@moncreneau/api';
const client = new Moncreneau('YOUR_API_KEY');
async function listDepartments() {
try {
const departments = await client.departments.list();
departments.forEach(dept => {
console.log(`ID: ${dept.id} - ${dept.name}`);
});
} catch (error) {
console.error('Erreur:', error.message);
}
}
listDepartments();
Créer un rendez-vous
import Moncreneau from '@moncreneau/api';
const client = new Moncreneau('YOUR_API_KEY');
async function createAppointment() {
try {
const appointment = await client.appointments.create({
departmentId: 5,
dateTime: '2026-02-15T10:00:00',
name: 'Amadou Diallo'
});
console.log('✅ Rendez-vous créé !');
console.log('ID:', appointment.id);
console.log('QR Code:', appointment.qrCode);
console.log('Statut:', appointment.status);
} catch (error) {
if (error.code === 'INSUFFICIENT_CREDITS') {
console.error('❌ Crédits insuffisants:', error.message);
} else {
console.error('❌ Erreur:', error.message);
}
}
}
createAppointment();
Vérifier la disponibilité d'un créneau
Le backend vérifie un créneau précis (dateTime), pas une plage de dates.
import Moncreneau from '@moncreneau/api';
const client = new Moncreneau('YOUR_API_KEY');
async function checkAvailability() {
try {
const availability = await client.departments.getAvailability(
'5',
'2026-02-15T10:00:00'
);
if (availability.available) {
console.log('✅ Créneau disponible !');
console.log('Places restantes:', availability.remainingSlots);
} else {
console.log('❌ Créneau indisponible');
console.log('Raison:', availability.unavailabilityReason);
}
} catch (error) {
console.error('Erreur:', error.message);
}
}
checkAvailability();
Annuler un rendez-vous
import Moncreneau from '@moncreneau/api';
const client = new Moncreneau('YOUR_API_KEY');
async function cancelAppointment(appointmentId) {
try {
await client.appointments.cancel(appointmentId);
console.log('✅ Rendez-vous annulé, 1 crédit remboursé');
} catch (error) {
console.error('❌ Erreur:', error.message);
}
}
cancelAppointment('123');
Intégration Express
import express from 'express';
import Moncreneau from '@moncreneau/api';
const app = express();
app.use(express.json());
const client = new Moncreneau(process.env.MONCRENEAU_API_KEY);
// Créer un rendez-vous
app.post('/appointments', async (req, res) => {
try {
const { departmentId, dateTime, name } = req.body;
const appointment = await client.appointments.create({
departmentId,
dateTime,
name
});
res.status(201).json(appointment);
} catch (error) {
if (error.code === 'INSUFFICIENT_CREDITS') {
return res.status(402).json({ error: error.message });
}
res.status(error.statusCode || 500).json({ error: error.message });
}
});
// Vérifier la disponibilité d'un créneau
app.get('/departments/:id/availability', async (req, res) => {
try {
const { id } = req.params;
const { dateTime } = req.query;
const availability = await client.departments.getAvailability(id, dateTime);
res.json(availability);
} catch (error) {
res.status(error.statusCode || 500).json({ error: error.message });
}
});
app.listen(3000, () => {
console.log('Server running on port 3000');
});
Gestion des erreurs
Il n'existe qu'une seule classe d'erreur, MoncreneauError — le code métier se distingue via .code :
import Moncreneau, { MoncreneauError } from '@moncreneau/api';
const client = new Moncreneau('YOUR_API_KEY');
try {
const appointment = await client.appointments.create(data);
} catch (error) {
if (error instanceof MoncreneauError) {
switch (error.code) {
case 'INSUFFICIENT_CREDITS':
console.error('Crédits insuffisants:', error.message);
break;
case 'VALIDATION_ERROR':
console.error('Validation:', error.details);
break;
case 'INVALID_API_KEY':
console.error('Clé API invalide');
break;
default:
console.error(`Erreur ${error.code} (HTTP ${error.statusCode}):`, error.message);
}
} else {
console.error('Erreur réseau:', error);
}
}
Configuration avancée
import Moncreneau from '@moncreneau/api';
const client = new Moncreneau('YOUR_API_KEY', {
baseUrl: 'https://mc-prd.duckdns.org/api/v1',
timeout: 30000, // 30 secondes
maxRetries: 3
});
Vérification des webhooks
verifyWebhookSignature est une méthode statique sur la classe Moncreneau, pas une méthode d'instance :
import express from 'express';
import Moncreneau from '@moncreneau/api';
const app = express();
app.post('/webhooks/moncreneau', express.raw({ type: 'application/json' }), (req, res) => {
const signature = req.headers['x-moncreneau-signature'];
const payload = req.body.toString('utf8');
const isValid = Moncreneau.verifyWebhookSignature(
payload,
signature,
process.env.WEBHOOK_SECRET
);
if (!isValid) {
return res.status(401).send('Invalid signature');
}
const event = JSON.parse(payload);
console.log('Event:', req.headers['x-moncreneau-event'], event);
res.json({ received: true });
});
Voir Sécurité des webhooks pour le détail du format de signature.
TypeScript
Le SDK est écrit en TypeScript et exporte tous ses types :
import Moncreneau, {
Department,
Appointment,
CreateAppointmentRequest,
SlotAvailability
} from '@moncreneau/api';
const client = new Moncreneau('YOUR_API_KEY');
async function example(): Promise<void> {
const departments: Department[] = await client.departments.list();
const request: CreateAppointmentRequest = {
departmentId: 5,
dateTime: '2026-02-15T10:00:00',
name: 'Amadou Diallo'
};
const appointment: Appointment = await client.appointments.create(request);
}