From d5178b1e2df4eda11a7d2a0ac596d652e26ab936 Mon Sep 17 00:00:00 2001 From: Rohit Date: Sat, 1 Feb 2025 11:56:05 +0530 Subject: [PATCH 1/7] feat: add translation for login notif --- public/locales/de.json | 2 +- public/locales/en.json | 2 +- public/locales/es.json | 2 +- public/locales/ja.json | 2 +- public/locales/zh.json | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/public/locales/de.json b/public/locales/de.json index 613ddfef..c3b91314 100644 --- a/public/locales/de.json +++ b/public/locales/de.json @@ -8,7 +8,7 @@ "register_prompt": "Noch keinen Account?", "register_link": "Registrieren", "welcome_notification": "Willkommen bei Maxun!", - "error_notification": "Anmeldung fehlgeschlagen. Bitte versuchen Sie es erneut." + "error_notification": "Benutzer existiert nicht." }, "register": { "title": "Konto registrieren", diff --git a/public/locales/en.json b/public/locales/en.json index 85bd3148..0dd3fa0f 100644 --- a/public/locales/en.json +++ b/public/locales/en.json @@ -8,7 +8,7 @@ "register_prompt": "Don't have an account?", "register_link": "Register", "welcome_notification": "Welcome to Maxun!", - "error_notification": "Login Failed. Please try again." + "error_notification": "User does not exist." }, "register": { "title": "Register Account", diff --git a/public/locales/es.json b/public/locales/es.json index 46bded05..d1d9ba73 100644 --- a/public/locales/es.json +++ b/public/locales/es.json @@ -8,7 +8,7 @@ "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." + "error_notification": "El usuario no existe." }, "register": { "title": "Crear cuenta", diff --git a/public/locales/ja.json b/public/locales/ja.json index ad78c8f5..1a18a78d 100644 --- a/public/locales/ja.json +++ b/public/locales/ja.json @@ -8,7 +8,7 @@ "register_prompt": "アカウントをお持ちでないですか?", "register_link": "登録する", "welcome_notification": "Maxunへようこそ!", - "error_notification": "ログインに失敗しました。もう一度お試しください。" + "error_notification": "ユーザーが存在しません。" }, "register": { "title": "アカウントを登録する", diff --git a/public/locales/zh.json b/public/locales/zh.json index cd1a4f9f..d45f1b5a 100644 --- a/public/locales/zh.json +++ b/public/locales/zh.json @@ -8,7 +8,7 @@ "register_prompt": "还没有账号?", "register_link": "注册", "welcome_notification": "欢迎使用 Maxun!", - "error_notification": "登录失败。请重试。" + "error_notification": "用户不存在。" }, "register": { "title": "注册账号", From 0b7124f9d792d8ed28662f133967790de0f5a883 Mon Sep 17 00:00:00 2001 From: Rohit Date: Sat, 1 Feb 2025 16:25:19 +0530 Subject: [PATCH 2/7] feat: better error messages for notif --- server/src/routes/auth.ts | 38 ++++++++++++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/server/src/routes/auth.ts b/server/src/routes/auth.ts index e7ee62d9..6d1a8cb6 100644 --- a/server/src/routes/auth.ts +++ b/server/src/routes/auth.ts @@ -63,16 +63,35 @@ router.post("/register", async (req, res) => { 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 +109,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" + }); } }); From 59f00695a13f8c14541e1c44c060f4e7996f62a7 Mon Sep 17 00:00:00 2001 From: Rohit Date: Sat, 1 Feb 2025 16:29:15 +0530 Subject: [PATCH 3/7] feat: better error notifs for login --- src/pages/Login.tsx | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/pages/Login.tsx b/src/pages/Login.tsx index 1b34a1db..b76f1fd8 100644 --- a/src/pages/Login.tsx +++ b/src/pages/Login.tsx @@ -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); } }; From 5fbb4ba9b9bfb9e003c41f5383bd216138b55f27 Mon Sep 17 00:00:00 2001 From: Rohit Date: Sat, 1 Feb 2025 16:30:00 +0530 Subject: [PATCH 4/7] feat: add translation for login messages --- public/locales/de.json | 11 ++++++++++- public/locales/en.json | 11 ++++++++++- public/locales/es.json | 11 ++++++++++- public/locales/ja.json | 11 ++++++++++- public/locales/zh.json | 11 ++++++++++- 5 files changed, 50 insertions(+), 5 deletions(-) diff --git a/public/locales/de.json b/public/locales/de.json index c3b91314..c842b122 100644 --- a/public/locales/de.json +++ b/public/locales/de.json @@ -8,7 +8,16 @@ "register_prompt": "Noch keinen Account?", "register_link": "Registrieren", "welcome_notification": "Willkommen bei Maxun!", - "error_notification": "Benutzer existiert nicht." + "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", diff --git a/public/locales/en.json b/public/locales/en.json index 0dd3fa0f..7dda3d88 100644 --- a/public/locales/en.json +++ b/public/locales/en.json @@ -8,7 +8,16 @@ "register_prompt": "Don't have an account?", "register_link": "Register", "welcome_notification": "Welcome to Maxun!", - "error_notification": "User does not exist." + "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", diff --git a/public/locales/es.json b/public/locales/es.json index d1d9ba73..b9dee3c3 100644 --- a/public/locales/es.json +++ b/public/locales/es.json @@ -8,7 +8,16 @@ "register_prompt": "¿No tienes una cuenta?", "register_link": "Registrarse", "welcome_notification": "¡Bienvenido a Maxun!", - "error_notification": "El usuario no existe." + "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", diff --git a/public/locales/ja.json b/public/locales/ja.json index 1a18a78d..ed749f1b 100644 --- a/public/locales/ja.json +++ b/public/locales/ja.json @@ -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": "アカウントを登録する", diff --git a/public/locales/zh.json b/public/locales/zh.json index d45f1b5a..238d1f76 100644 --- a/public/locales/zh.json +++ b/public/locales/zh.json @@ -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": "注册账号", From 735d63686c91ead4b7e4c8906b60c5cfa10140dd Mon Sep 17 00:00:00 2001 From: Rohit Date: Sun, 2 Feb 2025 14:13:01 +0530 Subject: [PATCH 5/7] feat: better error messages for register notif --- server/src/routes/auth.ts | 49 +++++++++++++++++++++++++++++++-------- 1 file changed, 39 insertions(+), 10 deletions(-) diff --git a/server/src/routes/auth.ts b/server/src/routes/auth.ts index 6d1a8cb6..b7d884a4 100644 --- a/server/src/routes/auth.ts +++ b/server/src/routes/auth.ts @@ -17,46 +17,75 @@ 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" + }); } }); From 3b64e7fbc93cffd2fdef0cac1993149305b0d950 Mon Sep 17 00:00:00 2001 From: Rohit Date: Sun, 2 Feb 2025 14:13:51 +0530 Subject: [PATCH 6/7] feat: better error notifs for register page --- src/pages/Register.tsx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/pages/Register.tsx b/src/pages/Register.tsx index d9c698a2..909382d0 100644 --- a/src/pages/Register.tsx +++ b/src/pages/Register.tsx @@ -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); } }; From 7ff30877389e6b290c3f539a8f45d1b53e62caad Mon Sep 17 00:00:00 2001 From: Rohit Date: Sun, 2 Feb 2025 14:14:26 +0530 Subject: [PATCH 7/7] feat: add translation for register messages --- public/locales/de.json | 11 ++++++++++- public/locales/en.json | 11 ++++++++++- public/locales/es.json | 11 ++++++++++- public/locales/ja.json | 11 ++++++++++- public/locales/zh.json | 11 ++++++++++- 5 files changed, 50 insertions(+), 5 deletions(-) diff --git a/public/locales/de.json b/public/locales/de.json index c842b122..a4c02b1d 100644 --- a/public/locales/de.json +++ b/public/locales/de.json @@ -28,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", diff --git a/public/locales/en.json b/public/locales/en.json index 7dda3d88..468be12f 100644 --- a/public/locales/en.json +++ b/public/locales/en.json @@ -28,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", diff --git a/public/locales/es.json b/public/locales/es.json index b9dee3c3..09f6d703 100644 --- a/public/locales/es.json +++ b/public/locales/es.json @@ -28,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", diff --git a/public/locales/ja.json b/public/locales/ja.json index ed749f1b..d2fe42ea 100644 --- a/public/locales/ja.json +++ b/public/locales/ja.json @@ -28,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": "実行", diff --git a/public/locales/zh.json b/public/locales/zh.json index 238d1f76..e7c58660 100644 --- a/public/locales/zh.json +++ b/public/locales/zh.json @@ -28,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": "运行",