Spaces:
Paused
Paused
File size: 4,348 Bytes
3d52d95 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 | const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken');
const prisma = require('../lib/prisma');
const register = async (req, res) => {
const { name, email, password } = req.body;
if (!name || !email || !password) {
return res.status(400).json({ error: 'Name, email and password are required' });
}
try {
const existing = await prisma.user.findUnique({ where: { email } });
if (existing) return res.status(409).json({ error: 'Email already registered' });
const hashedPassword = await bcrypt.hash(password, 12);
const user = await prisma.user.create({
data: { name, email, hashedPassword },
});
const token = jwt.sign(
{ userId: user.id, email: user.email, name: user.name, role: user.role },
process.env.JWT_SECRET,
{ expiresIn: '7d' }
);
res.status(201).json({
token,
user: { id: user.id, name: user.name, email: user.email, role: user.role },
});
} catch (err) {
console.error(err);
res.status(500).json({ error: 'Server error' });
}
};
const login = async (req, res) => {
const { email, password } = req.body;
if (!email || !password) {
return res.status(400).json({ error: 'Email and password are required' });
}
try {
const user = await prisma.user.findUnique({ where: { email } });
if (!user) return res.status(401).json({ error: 'Invalid credentials' });
if (!user.hashedPassword) {
return res.status(401).json({
error: 'This account was registered using Google. Please sign in with Google.'
});
}
const valid = await bcrypt.compare(password, user.hashedPassword);
if (!valid) return res.status(401).json({ error: 'Invalid credentials' });
const token = jwt.sign(
{ userId: user.id, email: user.email, name: user.name, role: user.role },
process.env.JWT_SECRET,
{ expiresIn: '7d' }
);
res.json({
token,
user: { id: user.id, name: user.name, email: user.email, role: user.role },
});
} catch (err) {
console.error(err);
res.status(500).json({ error: 'Server error' });
}
};
const google = async (req, res) => {
const { credential } = req.body;
if (!credential) {
return res.status(400).json({ error: 'Google credential is required' });
}
try {
// Verify token with Google's tokeninfo endpoint
const response = await fetch(`https://oauth2.googleapis.com/tokeninfo?id_token=${credential}`);
if (!response.ok) {
return res.status(400).json({ error: 'Invalid Google credential' });
}
const payload = await response.json();
// Verify email is verified
if (payload.email_verified !== 'true' && payload.email_verified !== true) {
return res.status(400).json({ error: 'Google email is not verified' });
}
const { email, name } = payload;
// Check if user already exists
let user = await prisma.user.findUnique({ where: { email } });
if (!user) {
// Create a user without a password
user = await prisma.user.create({
data: {
name: name || email.split('@')[0],
email,
hashedPassword: null,
},
});
}
// Generate JWT token
const token = jwt.sign(
{ userId: user.id, email: user.email, name: user.name, role: user.role },
process.env.JWT_SECRET,
{ expiresIn: '7d' }
);
res.json({
token,
user: { id: user.id, name: user.name, email: user.email, role: user.role },
});
} catch (err) {
console.error('Google Auth Error:', err);
res.status(500).json({ error: 'Server error during Google authentication' });
}
};
const getMe = async (req, res) => {
try {
const user = await prisma.user.findUnique({
where: { id: req.user.userId },
select: { id: true, name: true, email: true, role: true, createdAt: true },
});
if (!user) return res.status(404).json({ error: 'User not found' });
// Check if onboarding is done
const workspace = await prisma.teamMember.findFirst({
where: { userId: user.id },
include: { workspace: true },
});
res.json({ user, workspace: workspace?.workspace || null });
} catch (err) {
console.error(err);
res.status(500).json({ error: 'Server error' });
}
};
module.exports = {
register,
login,
google,
getMe,
};
|