import bcrypt from 'bcrypt'; import { v4 as uuidv4 } from 'uuid'; import User from '../models/community/user.js'; import UserParam from '../models/community/user_param.js'; import UserParamType from '../models/type/user_param.js'; import { sendAccountActivationEmail, sendPasswordResetEmail } from './emailService.js'; const saltRounds = 10; export const registerUser = async ({ email, username, password, language }) => { const hashedPassword = await bcrypt.hash(password, saltRounds); const resetToken = uuidv4(); const user = await User.create({ email, username, password: hashedPassword, resetToken: resetToken, active: false, registration_date: new Date() }); const languageType = await UserParamType.findOne({ where: { description: 'language' } }); if (!languageType) { throw new Error('Language type not found'); } await UserParam.create({ userId: user.id, paramTypeId: languageType.id, value: language }); const activationLink = `${process.env.FRONTEND_URL}/activate?token=${resetToken}`; await sendAccountActivationEmail(email, activationLink, username, resetToken, language); return { id: user.hashedId, username: user.username, active: user.active }; }; export const loginUser = async ({ username, password }) => { console.log('check login'); const user = await User.findOne({ where: { username } }); if (!user) { throw new Error('credentialsinvalid'); } const match = await bcrypt.compare(password, user.password); if (!match) { throw new Error('credentialsinvalid'); } return { id: user.hashedId, username: user.username, active: user.active }; }; export const handleForgotPassword = async ({ email }) => { const user = await User.findOne({ where: { email } }); if (!user) { throw new Error('Email not found'); } const resetToken = uuidv4(); const resetLink = `${process.env.FRONTEND_URL}/reset-password?token=${resetToken}`; await user.update({ reset_token: resetToken }); const languageParam = await UserParam.findOne({ where: { user_id: user.id, param_type_id: languageType.id } }); const userLanguage = languageParam ? languageParam.value : 'en'; await sendPasswordResetEmail(email, resetLink, userLanguage); return { message: 'Password reset email sent' }; }; export const activateUserAccount = async ({ token }) => { const user = await User.findOne({ where: { reset_token: token } }); if (!user) { throw new Error('Invalid token'); } await user.update({ active: true, reset_token: null }); return { message: 'Account activated' }; };