Skip to content

Commit 162492b

Browse files
committed
feat(docs): Fixes #110 - Route auth register & login
1 parent 67f751f commit 162492b

5 files changed

Lines changed: 110 additions & 2 deletions

File tree

app/backend/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
"cors": "^2.8.5",
2323
"dotenv": "^17.2.3",
2424
"express": "^5.2.1",
25+
"jsonwebtoken": "^9.0.3",
2526
"mongoose": "^9.1.5",
2627
"puppeteer": "^24.37.1"
2728
},

app/backend/src/app.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import partnersRoutes from './routes/partners.js';
2929
import championshipsRoutes from './routes/championships.js';
3030
import standingsRoutes from './routes/standings.js';
3131
import matchesRoutes from './routes/matches.js';
32+
import authRoutes from './routes/auth.js';
3233

3334
// Utiliser les routes existantes
3435
app.use('/api/users', usersRoutes);
@@ -43,6 +44,7 @@ app.use('/api/partners', partnersRoutes);
4344
app.use('/api/championships', championshipsRoutes);
4445
app.use('/api/standings', standingsRoutes);
4546
app.use('/api/matches', matchesRoutes);
47+
app.use('/auth', authRoutes);
4648

4749
// 🔹 Nouveaux endpoints pour récupérer les matchs
4850
import Match from './models/Match.js';

app/backend/src/models/User.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@ const UserSchema = new mongoose.Schema(
1111
trim: true,
1212
},
1313
passwordHash: { type: String, required: true },
14-
role: { type: String, enum: ['admin', 'editor'], default: 'editor' },
14+
role: { type: String, enum: ['admin', 'editor', 'user', 'other'], default: 'user' },
1515
firstName: { type: String, required: true },
1616
lastName: { type: String, required: true },
17-
isActive: { type: Boolean, default: true },
17+
isActive: { type: Boolean, default: false },
1818
lastLoginAt: { type: Date, default: null },
1919
passwordUpdatedAt: { type: Date, default: null },
2020
},

app/backend/src/routes/auth.js

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
import express from 'express';
2+
import jwt from 'jsonwebtoken';
3+
import User from '../models/User.js';
4+
5+
const router = express.Router();
6+
7+
/**
8+
* POST /auth/register
9+
* Inscription utilisateur (compte en attente de validation admin)
10+
*/
11+
router.post('/register', async (req, res) => {
12+
try {
13+
const { email, password, firstName, lastName } = req.body;
14+
15+
// Vérification basique
16+
if (!email || !password || !firstName || !lastName) {
17+
return res.status(400).json({ message: 'Champs manquants' });
18+
}
19+
20+
// Email déjà utilisé ?
21+
const existingUser = await User.findOne({ email });
22+
if (existingUser) {
23+
return res.status(400).json({ message: 'Email déjà utilisé' });
24+
}
25+
26+
// Création user (isActive = false par défaut)
27+
const user = new User({
28+
email,
29+
firstName,
30+
lastName,
31+
role: 'user',
32+
});
33+
34+
await user.setPassword(password);
35+
await user.save();
36+
37+
return res.status(201).json({
38+
message: 'Compte créé. En attente de validation par un administrateur.',
39+
});
40+
} catch (err) {
41+
console.error('REGISTER ERROR:', err);
42+
res.status(500).json({ message: 'Erreur serveur' });
43+
}
44+
});
45+
46+
/**
47+
* POST /auth/login
48+
* Connexion utilisateur
49+
*/
50+
router.post('/login', async (req, res) => {
51+
try {
52+
const { email, password } = req.body;
53+
54+
if (!email || !password) {
55+
return res.status(400).json({ message: 'Email ou mot de passe manquant' });
56+
}
57+
58+
const user = await User.findOne({ email });
59+
if (!user) {
60+
return res.status(401).json({ message: 'Identifiants invalides' });
61+
}
62+
63+
// Compte non validé par l’admin
64+
if (!user.isActive) {
65+
return res.status(403).json({
66+
message: 'Compte non activé. Contactez un administrateur.',
67+
});
68+
}
69+
70+
const isPasswordValid = await user.comparePassword(password);
71+
if (!isPasswordValid) {
72+
return res.status(401).json({ message: 'Identifiants invalides' });
73+
}
74+
75+
// Mise à jour last login
76+
user.lastLoginAt = new Date();
77+
await user.save();
78+
79+
// Génération JWT
80+
const token = jwt.sign(
81+
{
82+
id: user._id,
83+
role: user.role,
84+
},
85+
process.env.JWT_SECRET,
86+
{ expiresIn: '1d' },
87+
);
88+
89+
res.json({
90+
token,
91+
user: {
92+
id: user._id,
93+
email: user.email,
94+
role: user.role,
95+
firstName: user.firstName,
96+
lastName: user.lastName,
97+
},
98+
});
99+
} catch (err) {
100+
console.error('LOGIN ERROR:', err);
101+
res.status(500).json({ message: 'Erreur serveur' });
102+
}
103+
});
104+
105+
export default router;

app/backend/src/scripts/seedAdmin.js

Whitespace-only changes.

0 commit comments

Comments
 (0)