Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 48 additions & 13 deletions server/src/controllers/authController.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { User } from '../models/User.js';
const registerSchema = Joi.object({
name: Joi.string().min(2).max(60).required(),
email: Joi.string().email().required(),
password: Joi.string().min(6).required()
password: Joi.string().min(6).required(),
});

export async function register(req, res, next) {
Expand All @@ -18,32 +18,67 @@ export async function register(req, res, next) {
if (existing) return res.status(409).json({ message: 'Email already used' });

const passwordHash = await bcrypt.hash(value.password, 10);
const user = await User.create({ name: value.name, email: value.email, passwordHash });
const user = await User.create({
name: value.name,
email: value.email,
passwordHash,
});

const token = signToken(user);
res.status(201).json({ token, user: publicUser(user) });
} catch (err) { next(err); }
return res.status(201).json({ token, user: publicUser(user) });
} catch (err) {
return next(err);
}
}

const loginSchema = Joi.object({
email: Joi.string().email().required(),
password: Joi.string().required()
password: Joi.string().required(),
});

// TODO: implement login function
export async function login(req, res, next) {

try {
const { value, error } = loginSchema.validate(req.body);
if (error) return res.status(400).json({ message: error.message });

const user = await User.findOne({ email: value.email });
if (!user) return res.status(401).json({ message: 'Invalid email or password' });

const ok = await bcrypt.compare(value.password, user.passwordHash || '');
if (!ok) return res.status(401).json({ message: 'Invalid email or password' });

const token = signToken(user);
return res.status(200).json({ token, user: publicUser(user) });
} catch (err) {
return next(err);
}
}

export async function me(req, res) {
const user = await User.findById(req.user.id).lean();
res.json({ user: user && publicUser(user) });
export async function me(req, res, next) {
try {
const user = await User.findById(req.user.id).lean();
return res.json({ user: user && publicUser(user) });
} catch (err) {
return next(err);
}
}

function signToken(user) {
const payload = { id: user._id.toString(), name: user.name, role: user.role };
return jwt.sign(payload, process.env.JWT_SECRET, { expiresIn: process.env.JWT_EXPIRES_IN || '7d' });
const payload = {
id: user._id.toString(),
name: user.name,
role: user.role,
};
return jwt.sign(payload, process.env.JWT_SECRET, {
expiresIn: process.env.JWT_EXPIRES_IN || '7d',
});
}

function publicUser(u) {
return { id: u._id?.toString() || u.id, name: u.name, email: u.email, role: u.role };
return {
id: u._id?.toString() || u.id,
name: u.name,
email: u.email,
role: u.role,
};
}