106 lines
2.6 KiB
JavaScript
106 lines
2.6 KiB
JavaScript
// services/authService.js
|
|
const jwt = require('jsonwebtoken');
|
|
const bcrypt = require('bcryptjs');
|
|
const { v4: uuidv4 } = require('uuid');
|
|
const { User } = require('../models'); // Assuming we have a User model
|
|
|
|
const JWT_SECRET = process.env.JWT_SECRET || 'fallback_secret';
|
|
|
|
// Mock database - in real implementation, this would be a real database
|
|
const users = [];
|
|
|
|
const login = async (email, password) => {
|
|
try {
|
|
// Find user by email
|
|
const user = users.find(u => u.email === email);
|
|
|
|
if (!user) {
|
|
return { error: 'Invalid email or password' };
|
|
}
|
|
|
|
// Check password
|
|
const isPasswordValid = await bcrypt.compare(password, user.passwordHash);
|
|
|
|
if (!isPasswordValid) {
|
|
return { error: 'Invalid email or password' };
|
|
}
|
|
|
|
// Generate JWT token
|
|
const token = jwt.sign(
|
|
{ userId: user.id, email: user.email, tenantId: user.tenantId },
|
|
JWT_SECRET,
|
|
{ expiresIn: '24h' }
|
|
);
|
|
|
|
// Return user info and token (excluding password)
|
|
return {
|
|
user: {
|
|
id: user.id,
|
|
email: user.email,
|
|
firstName: user.firstName,
|
|
lastName: user.lastName,
|
|
userType: user.userType,
|
|
tenantId: user.tenantId
|
|
},
|
|
token
|
|
};
|
|
} catch (error) {
|
|
console.error('Login service error:', error);
|
|
return { error: 'Internal server error' };
|
|
}
|
|
};
|
|
|
|
const register = async (email, password, firstName, lastName, userType, tenantId) => {
|
|
try {
|
|
// Check if user already exists
|
|
const existingUser = users.find(u => u.email === email);
|
|
|
|
if (existingUser) {
|
|
return { error: 'User with this email already exists' };
|
|
}
|
|
|
|
// Validate user type
|
|
if (!['job-seeker', 'job-provider'].includes(userType)) {
|
|
return { error: 'User type must be either job-seeker or job-provider' };
|
|
}
|
|
|
|
// Hash password
|
|
const saltRounds = 12;
|
|
const passwordHash = await bcrypt.hash(password, saltRounds);
|
|
|
|
// Create new user
|
|
const newUser = {
|
|
id: uuidv4(),
|
|
email,
|
|
passwordHash,
|
|
firstName,
|
|
lastName,
|
|
userType,
|
|
tenantId,
|
|
createdAt: new Date(),
|
|
updatedAt: new Date()
|
|
};
|
|
|
|
users.push(newUser);
|
|
|
|
// Return user info (excluding password)
|
|
return {
|
|
user: {
|
|
id: newUser.id,
|
|
email: newUser.email,
|
|
firstName: newUser.firstName,
|
|
lastName: newUser.lastName,
|
|
userType: newUser.userType,
|
|
tenantId: newUser.tenantId
|
|
}
|
|
};
|
|
} catch (error) {
|
|
console.error('Registration service error:', error);
|
|
return { error: 'Internal server error' };
|
|
}
|
|
};
|
|
|
|
module.exports = {
|
|
login,
|
|
register
|
|
}; |