N'oubliez pas de consulter la documentation à l'URL http://localhost:7777/api-docs !!!
Toutes les sections de l'API sont présentes dans le module api.
// Importer les classes nécessaires
import api from "@/api";
// J'accède à l'API des utilisateurs
const userApi = api.users;
// Puis à celui des appareils...
const deviceApi = api.devices;Toutes les méthodes de l'API renvoient des Promises, ce qui vous permet d'utiliser .then() et .catch().
// Exemple: Récupérer le profil de l'utilisateur connecté
api.users.me()
.then(user => {
console.log("Utilisateur connecté:", user.profile.firstName);
console.log("Points:", user.secret.points);
})
.catch(error => {
console.error("Erreur lors de la récupération du profil:", error);
});Pour un code plus lisible, utilisez async/await pour gérer les appels à l'API.
// Exemple: Connexion d'un utilisateur
async function loginUser(email, password) {
try {
const loginInput = {
email: email,
password: password
};
const user = await api.users.login({ loginInput });
console.log("Connexion réussie pour:", user.profile.firstName);
return user;
} catch (error) {
console.error("Échec de la connexion:", error);
throw error; // Propagez l'erreur pour la gérer plus haut si nécessaire
}
}
// Utilisation
api.users.login("utilisateur@exemple.com", "motdepasse")
.then(user => {
// Faire quelque chose avec l'utilisateur connecté
})
.catch(err => {
// Gérer l'erreur
});Les erreurs de l'API contiennent des informations utiles dans l'objet ErrorResponse.
Les fonctions findResponse et findErrData peuvent aider à extraire ces informations.
// Approche complète pour gérer les erreurs
async function registerUser(userData) {
try {
const user = await api.users.register({ registerInput: userData });
return user;
} catch (error) {
// Vérifier s'il y a une réponse d'erreur structurée
const response = findResponse(error);
if (response != null && response.errData != null) {
const errData = response.errData;
// Accéder aux propriétés de l'ErrorResponse
console.error("Code d'erreur:", errData.code);
console.error("Message:", errData.message);
// Utilisation des données supplémentaires (utiles pour les erreurs de validation)
if (errData.data) {
console.error("Détails:", errData.data);
}
// Vous pouvez adapter votre gestion selon le code d'erreur
if (errData.code === "EMAIL_ALREADY_EXISTS") {
return { status: "error", message: "Cette adresse email est déjà utilisée" };
}
}
// Erreur générique si rien de spécifique n'est trouvé
throw error;
}
}import api, {findResponse} from "@/api";
async function getCurrentUser() {
try {
const user = await api.users.me();
return {
id: user.profile.id,
name: `${user.profile.firstName} ${user.profile.lastName}`,
email: user.secret.email,
role: user.profile.role,
points: user.secret.points,
isEmailConfirmed: user.secret.emailConfirmed
};
} catch (error) {
// Si l'erreur est 401, l'utilisateur n'est pas connecté
const response = findResponse(error);
if (response != null && response.status === 401) {
// Faire des trucs
}
throw error;
}
}async function signUp(firstName, lastName, email, password, gender, role) {
const registerInput = {
firstName,
lastName,
email,
password,
gender, // MALE, FEMALE ou UNDISCLOSED
role // RESIDENT, CAREGIVER ou ADMIN
};
try {
const newUser = await api.users.register({ registerInput });
return newUser;
} catch (error) {
// Gérer spécifiquement les erreurs de validation (422)
const response = findResponse(error);
if (response != null && response.status === 422) {
const errData = response.errData;
return {
success: false,
message: errData.message,
validationErrors: errData.data
};
}
throw error;
}
}async function login(email, password) {
const loginInput = { email, password };
try {
const user = await api.users.login({ loginInput });
return {
success: true,
user: user
};
} catch (error) {
const response = findResponse(error);
if (response && response.status === 401) {
return {
success: false,
message: "Email ou mot de passe incorrect"
};
}
throw error;
}
}async function logout() {
try {
await api.users.logout();
return true;
} catch (error) {
console.error("Erreur lors de la déconnexion:", error);
return false;
}
}async function findUserById(userId) {
try {
const userProfile = await api.users.findUser({ userId });
// Si la réponse est null (status 204), l'utilisateur n'existe pas
if (!userProfile) {
return { found: false };
}
return {
found: true,
user: userProfile
};
} catch (error) {
console.error(`Erreur lors de la recherche de l'utilisateur ${userId}:`, error);
throw error;
}
}async function loadDashboardData(userId) {
try {
// Exécuter plusieurs requêtes en parallèle
const [currentUser, targetUser] = await Promise.all([
api.users.me(),
api.users.findUser({ userId })
]);
return {
currentUser,
targetUser
};
} catch (error) {
console.error("Erreur lors du chargement des données:", error);
throw error;
}
}Utiliser les middleware dans api/index.ts
- Toujours gérer les erreurs - Utilisez try/catch avec async/await ou .catch() avec Promises
- Centraliser la logique API - Créez des services ou hooks qui encapsulent les appels API
- Validez les données avant de les envoyer à l'API pour éviter les erreurs 422
- Utilisez les codes HTTP pour déterminer le type d'erreur (401 pour auth, 422 pour validation, etc.)
- Implémentez une gestion de session pour rediriger vers la page de connexion en cas d'expiration
- 401: Non authentifié (token manquant ou expiré)
- 422: Erreur de validation des données
- 204: Ressource non trouvée (dans le cas de findUser)
- 500: Erreur serveur interne
// userService.js
import api, { findResponse } from "@/api";
class UserService {
constructor() {
this.api = api.users;
}
async getCurrentUser() {
try {
return await this.api.me();
} catch (error) {
this.handleError(error);
return null;
}
}
async login(email, password) {
try {
return await this.api.login({ loginInput: { email, password } });
} catch (error) {
this.handleError(error);
throw error;
}
}
async register(userData) {
try {
return await this.api.register({ registerInput: userData });
} catch (error) {
this.handleError(error);
throw error;
}
}
async logout() {
try {
await this.api.logout();
return true;
} catch (error) {
this.handleError(error);
return false;
}
}
handleError(error) {
const response = findResponse(error);
if (response) {
const errData = response.errData;
console.error(`[API Error ${response.status}]`, errData?.message || 'Unknown error');
// Vous pouvez implémenter une logique spécifique ici
if (response.status === 401) {
// Gérer l'expiration de session
}
} else {
console.error('[API Error]', error.message);
}
}
}
export default new UserService();