95 lines
2.5 KiB
TypeScript
95 lines
2.5 KiB
TypeScript
import { Router } from 'express';
|
|
import { PrismaClient } from '@prisma/client';
|
|
import * as bcrypt from 'bcrypt';
|
|
import jwt from 'jsonwebtoken';
|
|
|
|
const router = Router();
|
|
const prisma = new PrismaClient();
|
|
const JWT_SECRET = process.env.JWT_SECRET || 'your-secret-key';
|
|
|
|
// Route de connexion
|
|
router.post('/login', async (req, res) => {
|
|
try {
|
|
const { email, password } = req.body;
|
|
|
|
// Vérifier les identifiants
|
|
const admin = await prisma.admin.findUnique({
|
|
where: { email }
|
|
});
|
|
|
|
if (!admin) {
|
|
return res.status(401).json({ error: 'Identifiants invalides' });
|
|
}
|
|
|
|
// Vérifier le mot de passe
|
|
const validPassword = await bcrypt.compare(password, admin.password);
|
|
if (!validPassword) {
|
|
return res.status(401).json({ error: 'Identifiants invalides' });
|
|
}
|
|
|
|
// Vérifier si le mot de passe doit être changé
|
|
if (!admin.passwordChanged) {
|
|
return res.status(403).json({
|
|
error: 'Changement de mot de passe requis',
|
|
requiresPasswordChange: true
|
|
});
|
|
}
|
|
|
|
// Générer le token JWT
|
|
const token = jwt.sign(
|
|
{
|
|
id: admin.id,
|
|
email: admin.email,
|
|
role: 'admin'
|
|
},
|
|
JWT_SECRET,
|
|
{ expiresIn: '24h' }
|
|
);
|
|
|
|
res.json({ token });
|
|
} catch (error) {
|
|
console.error('Erreur lors de la connexion:', error);
|
|
res.status(500).json({ error: 'Erreur serveur' });
|
|
}
|
|
});
|
|
|
|
// Route de changement de mot de passe
|
|
router.post('/change-password', async (req, res) => {
|
|
try {
|
|
const { email, currentPassword, newPassword } = req.body;
|
|
|
|
// Vérifier l'administrateur
|
|
const admin = await prisma.admin.findUnique({
|
|
where: { email }
|
|
});
|
|
|
|
if (!admin) {
|
|
return res.status(404).json({ error: 'Administrateur non trouvé' });
|
|
}
|
|
|
|
// Vérifier l'ancien mot de passe
|
|
const validPassword = await bcrypt.compare(currentPassword, admin.password);
|
|
if (!validPassword) {
|
|
return res.status(401).json({ error: 'Mot de passe actuel incorrect' });
|
|
}
|
|
|
|
// Hasher le nouveau mot de passe
|
|
const hashedPassword = await bcrypt.hash(newPassword, 10);
|
|
|
|
// Mettre à jour le mot de passe
|
|
await prisma.admin.update({
|
|
where: { id: admin.id },
|
|
data: {
|
|
password: hashedPassword,
|
|
passwordChanged: true
|
|
}
|
|
});
|
|
|
|
res.json({ message: 'Mot de passe changé avec succès' });
|
|
} catch (error) {
|
|
console.error('Erreur lors du changement de mot de passe:', error);
|
|
res.status(500).json({ error: 'Erreur serveur' });
|
|
}
|
|
});
|
|
|
|
export default router;
|