/**
* @module api
* @description Module gérant les communications réseau (requêtes HTTP) avec l'API backend Python.
* Centralise tous les appels axios pour l'inscription, la récupération et la connexion.
*/
import axios from "axios";
const port = process.env.REACT_APP_SERVER_PORT || 8000;
const API_URL = `http://${window.location.hostname}:${port}`;
/**
* Envoie les données d'inscription vers notre API Python.
* @async
* @function registerUserAPI
* @param {Object} userData - Les données brutes du formulaire.
* @param {string} userData.lastName - Le nom de famille.
* @param {string} userData.firstName - Le prénom.
* @param {string} userData.email - L'adresse email.
* @param {string} userData.birthDate - La date de naissance.
* @returns {Promise<Object>} L'utilisateur créé
* @throws {Error} Lance une erreur en cas d'échec réseau ou de validation (422).
*/
export const registerUserAPI = async (userData) => {
const payload = {
name: userData.lastName,
firstName: userData.firstName,
email: userData.email,
birthDate: userData.birthDate,
};
try {
const response = await axios.post(`${API_URL}/users`, payload);
return response.data;
} catch (error) {
if (error.response?.status === 422) {
console.error("Détail 422 :", JSON.stringify(error.response.data.detail, null, 2));
}
// ✅ Fix : on traduit le 400 en message lisible pour le composant React
if (error.response?.status === 400) {
throw new Error('Cet email existe déjà.');
}
throw error;
}
};
/**
* Récupère la liste des utilisateurs depuis notre API Python au démarrage.
* @async
* @function getUsersAPI
* @returns {Promise<Array<Object>>} La liste des utilisateurs formatée pour le frontend.
* @throws {Error} Lance une erreur si la récupération échoue.
*/
export const getUsersAPI = async () => {
try {
const response = await axios.get(`${API_URL}/users`);
return response.data.utilisateurs.map(user => ({
...user,
lastName: user.name
}));
} catch (error) {
console.error("Erreur réseau lors de la récupération des utilisateurs :", error);
throw error;
}
};
/**
* Connecte un utilisateur (admin) et récupère le token JWT.
* @async
* @function loginAPI
* @param {string} email - L'email de l'administrateur
* @param {string} password - Le mot de passe de l'administrateur
* @returns {Promise<string>} Le token JWT
* @throws {Error} Lance une erreur si les identifiants sont invalides ou en cas de problème réseau.
*/
export const loginAPI = async (email, password) => {
try {
const response = await axios.post(`${API_URL}/login`, { email, password });
return response.data.token;
} catch (error) {
console.error("Erreur réseau lors de la connexion :", error);
throw error;
}
};