Merge pull request #428 from getmaxun/log-lang

fix: show better error message on user login
This commit is contained in:
Karishma Shukla
2025-02-03 22:55:15 +05:30
committed by GitHub
8 changed files with 184 additions and 31 deletions

View File

@@ -8,7 +8,16 @@
"register_prompt": "Noch keinen Account?",
"register_link": "Registrieren",
"welcome_notification": "Willkommen bei Maxun!",
"error_notification": "Anmeldung fehlgeschlagen. Bitte versuchen Sie es erneut."
"validation": {
"required_fields": "E-Mail und Passwort sind erforderlich",
"password_length": "Das Passwort muss mindestens 6 Zeichen lang sein"
},
"error": {
"user_not_found": "Benutzer existiert nicht",
"invalid_credentials": "Ungültige E-Mail oder Passwort",
"server_error": "Anmeldung fehlgeschlagen. Bitte versuchen Sie es später erneut",
"generic": "Ein Fehler ist aufgetreten. Bitte versuchen Sie es erneut"
}
},
"register": {
"title": "Konto registrieren",
@@ -19,7 +28,16 @@
"register_prompt": "Bereits ein Konto?",
"login_link": "Einloggen",
"welcome_notification": "Willkommen bei Maxun!",
"error_notification": "Registrierung fehlgeschlagen. Bitte versuchen Sie es erneut."
"validation": {
"email_required": "E-Mail-Adresse ist erforderlich",
"password_requirements": "Das Passwort muss mindestens 6 Zeichen lang sein"
},
"error": {
"user_exists": "Ein Benutzer mit dieser E-Mail existiert bereits",
"creation_failed": "Konto konnte nicht erstellt werden",
"server_error": "Serverfehler aufgetreten",
"generic": "Registrierung fehlgeschlagen. Bitte versuchen Sie es erneut"
}
},
"recordingtable": {
"run": "Ausführen",

View File

@@ -8,7 +8,16 @@
"register_prompt": "Don't have an account?",
"register_link": "Register",
"welcome_notification": "Welcome to Maxun!",
"error_notification": "Login Failed. Please try again."
"validation": {
"required_fields": "Email and password are required",
"password_length": "Password must be at least 6 characters"
},
"error": {
"user_not_found": "User does not exist",
"invalid_credentials": "Invalid username or password",
"server_error": "Login failed. Please try again later",
"generic": "An error occurred. Please try again"
}
},
"register": {
"title": "Register Account",
@@ -19,7 +28,16 @@
"register_prompt": "Already have an account?",
"login_link": "Login",
"welcome_notification": "Welcome to Maxun!",
"error_notification": "Registeration Failed. Please try again."
"validation": {
"email_required": "Email is required",
"password_requirements": "Password must be at least 6 characters"
},
"error": {
"user_exists": "User with this email already exists",
"creation_failed": "Could not create account",
"server_error": "Server error occurred",
"generic": "Registration failed. Please try again"
}
},
"recordingtable":{
"run": "Run",

View File

@@ -8,7 +8,16 @@
"register_prompt": "¿No tienes una cuenta?",
"register_link": "Registrarse",
"welcome_notification": "¡Bienvenido a Maxun!",
"error_notification": "Error al iniciar sesión. Por favor, inténtalo de nuevo."
"validation": {
"required_fields": "El correo electrónico y la contraseña son obligatorios",
"password_length": "La contraseña debe tener al menos 6 caracteres"
},
"error": {
"user_not_found": "El usuario no existe",
"invalid_credentials": "Correo electrónico o contraseña inválidos",
"server_error": "Error al iniciar sesión. Por favor, inténtelo de nuevo más tarde",
"generic": "Se produjo un error. Por favor, inténtelo de nuevo"
}
},
"register": {
"title": "Crear cuenta",
@@ -19,7 +28,16 @@
"register_prompt": "¿Ya tienes una cuenta?",
"login_link": "Iniciar sesión",
"welcome_notification": "¡Bienvenido a Maxun!",
"error_notification": "Error en el registro. Por favor, inténtalo de nuevo."
"validation": {
"email_required": "El correo electrónico es obligatorio",
"password_requirements": "La contraseña debe tener al menos 6 caracteres"
},
"error": {
"user_exists": "Ya existe un usuario con este correo electrónico",
"creation_failed": "No se pudo crear la cuenta",
"server_error": "Ocurrió un error en el servidor",
"generic": "Error en el registro. Por favor, inténtelo de nuevo"
}
},
"recordingtable": {
"run": "Ejecutar",

View File

@@ -8,7 +8,16 @@
"register_prompt": "アカウントをお持ちでないですか?",
"register_link": "登録する",
"welcome_notification": "Maxunへようこそ",
"error_notification": "ログインに失敗しました。もう一度お試しください。"
"validation": {
"required_fields": "メールアドレスとパスワードは必須です",
"password_length": "パスワードは6文字以上である必要があります"
},
"error": {
"user_not_found": "ユーザーが存在しません",
"invalid_credentials": "メールアドレスまたはパスワードが無効です",
"server_error": "ログインに失敗しました。後でもう一度お試しください",
"generic": "エラーが発生しました。もう一度お試しください"
}
},
"register": {
"title": "アカウントを登録する",
@@ -19,7 +28,16 @@
"register_prompt": "既にアカウントをお持ちですか?",
"login_link": "ログイン",
"welcome_notification": "Maxunへようこそ",
"error_notification": "登録に失敗しました。もう一度お試しください。"
"validation": {
"email_required": "メールアドレスは必須です",
"password_requirements": "パスワードは6文字以上である必要があります"
},
"error": {
"user_exists": "このメールアドレスは既に登録されています",
"creation_failed": "アカウントを作成できませんでした",
"server_error": "サーバーエラーが発生しました",
"generic": "登録に失敗しました。もう一度お試しください"
}
},
"recordingtable": {
"run": "実行",

View File

@@ -8,7 +8,16 @@
"register_prompt": "还没有账号?",
"register_link": "注册",
"welcome_notification": "欢迎使用 Maxun",
"error_notification": "登录失败。请重试。"
"validation": {
"required_fields": "邮箱和密码为必填项",
"password_length": "密码必须至少6个字符"
},
"error": {
"user_not_found": "用户不存在",
"invalid_credentials": "邮箱或密码无效",
"server_error": "登录失败,请稍后重试",
"generic": "发生错误,请重试"
}
},
"register": {
"title": "注册账号",
@@ -19,7 +28,16 @@
"register_prompt": "已有账号?",
"login_link": "登录",
"welcome_notification": "欢迎使用 Maxun",
"error_notification": "注册失败。请重试。"
"validation": {
"email_required": "邮箱是必填项",
"password_requirements": "密码必须至少6个字符"
},
"error": {
"user_exists": "该邮箱已被注册",
"creation_failed": "无法创建账户",
"server_error": "服务器错误",
"generic": "注册失败,请重试"
}
},
"recordingtable": {
"run": "运行",

View File

@@ -17,62 +17,110 @@ router.post("/register", async (req, res) => {
try {
const { email, password } = req.body;
if (!email) return res.status(400).send("Email is required");
if (!password || password.length < 6)
return res
.status(400)
.send("Password is required and must be at least 6 characters");
// Validation checks with translation codes
if (!email) {
return res.status(400).json({
error: "VALIDATION_ERROR",
code: "register.validation.email_required"
});
}
if (!password || password.length < 6) {
return res.status(400).json({
error: "VALIDATION_ERROR",
code: "register.validation.password_requirements"
});
}
// Check if user exists
let userExist = await User.findOne({ raw: true, where: { email } });
if (userExist) return res.status(400).send("User already exists");
if (userExist) {
return res.status(400).json({
error: "USER_EXISTS",
code: "register.error.user_exists"
});
}
const hashedPassword = await hashPassword(password);
// Create user
let user: any;
try {
user = await User.create({ email, password: hashedPassword });
} catch (error: any) {
console.log(`Could not create user - ${error}`);
return res.status(500).send(`Could not create user - ${error.message}`);
return res.status(500).json({
error: "DATABASE_ERROR",
code: "register.error.creation_failed"
});
}
// Check JWT secret
if (!process.env.JWT_SECRET) {
console.log("JWT_SECRET is not defined in the environment");
return res.status(500).send("Internal Server Error");
return res.status(500).json({
error: "SERVER_ERROR",
code: "register.error.server_error"
});
}
// Success path
const token = jwt.sign({ id: user.id }, process.env.JWT_SECRET as string);
user.password = undefined as unknown as string;
res.cookie("token", token, {
httpOnly: true,
});
capture("maxun-oss-user-registered", {
email: user.email,
userId: user.id,
registeredAt: new Date().toISOString(),
});
console.log(`User registered`);
res.json(user);
} catch (error: any) {
console.log(`Could not register user - ${error}`);
res.status(500).send(`Could not register user - ${error.message}`);
return res.status(500).json({
error: "SERVER_ERROR",
code: "register.error.generic"
});
}
});
router.post("/login", async (req, res) => {
try {
const { email, password } = req.body;
if (!email || !password)
return res.status(400).send("Email and password are required");
if (password.length < 6)
return res.status(400).send("Password must be at least 6 characters");
if (!email || !password) {
return res.status(400).json({
error: "VALIDATION_ERROR",
code: "login.validation.required_fields"
});
}
if (password.length < 6) {
return res.status(400).json({
error: "VALIDATION_ERROR",
code: "login.validation.password_length"
});
}
let user = await User.findOne({ raw: true, where: { email } });
if (!user) return res.status(400).send("User does not exist");
if (!user) {
return res.status(404).json({
error: "USER_NOT_FOUND",
code: "login.error.user_not_found"
});
}
const match = await comparePassword(password, user.password);
if (!match) return res.status(400).send("Invalid email or password");
if (!match) {
return res.status(401).json({
error: "INVALID_CREDENTIALS",
code: "login.error.invalid_credentials"
});
}
const token = jwt.sign({ id: user?.id }, process.env.JWT_SECRET as string);
@@ -90,8 +138,11 @@ router.post("/login", async (req, res) => {
});
res.json(user);
} catch (error: any) {
res.status(400).send(`Could not login user - ${error.message}`);
console.log(`Could not login user - ${error}`);
console.error(`Login error: ${error.message}`);
res.status(500).json({
error: "SERVER_ERROR",
code: "login.error.server_error"
});
}
});

View File

@@ -53,8 +53,14 @@ const Login = () => {
notify("success", t('login.welcome_notification'));
window.localStorage.setItem("user", JSON.stringify(data));
navigate("/");
} catch (err) {
notify("error", t('login.error_notification'));
} catch (err: any) {
const errorResponse = err.response?.data;
const errorMessage = errorResponse?.code
? t(errorResponse.code)
: t('login.error.generic');
notify("error", errorMessage);
setLoading(false);
}
};

View File

@@ -48,7 +48,13 @@ const Register = () => {
window.localStorage.setItem("user", JSON.stringify(data));
navigate("/");
} catch (error:any) {
notify("error", error.response.data || t('register.error_notification'));
const errorResponse = error.response?.data;
const errorMessage = errorResponse?.code
? t(errorResponse.code)
: t('register.error.generic');
notify("error", errorMessage);
setLoading(false);
}
};