feat(auth): add debug logging for authentication processes

- Introduced detailed console logging in the auth controller, deserialize, serialize, and passport strategies to aid in debugging authentication flows.
- Enhanced error handling and response messaging during user registration and login processes, providing clearer feedback for success and failure scenarios.
- Updated the signup and login functions to include more informative logs, improving traceability of user actions and system responses.
This commit is contained in:
chamikaJ
2025-05-29 16:13:36 +05:30
parent b8cc9b5b73
commit a0f36968b3
5 changed files with 88 additions and 10 deletions

View File

@@ -22,17 +22,30 @@ async function clearEmailInvitations(email: string, teamId: string) {
// Check whether the user still exists on the database
export async function deserialize(user: { id: string | null }, done: IDeserializeCallback) {
try {
console.log("=== DESERIALIZE DEBUG ===");
console.log("User object:", user);
if (!user || !user.id) {
console.log("No user or user.id, returning null");
return done(null, null);
}
const {id} = user;
console.log("Deserializing user ID:", id);
const excludedSubscriptionTypes = ["TRIAL", "PADDLE"];
const q = `SELECT deserialize_user($1) AS user;`;
const result = await db.query(q, [id]);
console.log("Database query result rows length:", result.rows.length);
if (result.rows.length) {
const [data] = result.rows;
console.log("Database result data:", data);
if (data?.user) {
console.log("User data found:", data.user);
const realExpiredDate = moment(data.user.valid_till_date).add(7, "days");
data.user.is_expired = false;
@@ -42,11 +55,17 @@ export async function deserialize(user: { id: string | null }, done: IDeserializ
void setLastActive(data.user.id);
void clearEmailInvitations(data.user.email, data.user.team_id);
console.log("Returning successful user:", data.user);
return done(null, data.user as IPassportSession);
}
console.log("No user data in result");
}
console.log("No rows returned from database");
console.log("Returning null user");
return done(null, null);
} catch (error) {
console.log("Deserialize error:", error);
return done(error, null);
}
}

View File

@@ -22,6 +22,7 @@ async function handleLogin(req: Request, email: string, password: string, done:
console.log("User query result count:", result.rowCount);
const [data] = result.rows;
console.log("data", data);
if (!data?.password) {
console.log("No account found");
@@ -33,6 +34,9 @@ async function handleLogin(req: Request, email: string, password: string, done:
if (passwordMatch && email === data.email) {
delete data.password;
console.log("=== LOGIN SUCCESS DEBUG ===");
console.log("About to call done with user:", data);
console.log("User structure:", JSON.stringify(data, null, 2));
return done(null, data, {message: "User successfully logged in"});
}
return done(null, false, { message: "Incorrect email or password" });

View File

@@ -37,8 +37,15 @@ async function registerUser(password: string, team_id: string, name: string, tea
team_member_id,
};
console.log("=== REGISTER USER DEBUG ===");
console.log("Calling register_user with body:", body);
const result = await db.query(q, [JSON.stringify(body)]);
const [data] = result.rows;
console.log("Register user result:", data);
console.log("User object returned:", data.user);
return data.user;
}
@@ -47,41 +54,66 @@ async function handleSignUp(req: Request, email: string, password: string, done:
// team = Invited team_id if req.body.from_invitation is true
const {name, team_name, team_member_id, team_id, timezone} = req.body;
if (!team_name) return done(null, null, req.flash(ERROR_KEY, "Team name is required"));
if (!team_name) {
req.flash(ERROR_KEY, "Team name is required");
return done(null, null, {message: "Team name is required"});
}
const googleAccountFound = await isGoogleAccountFound(email);
if (googleAccountFound)
return done(null, null, req.flash(ERROR_KEY, `${req.body.email} is already linked with a Google account.`));
if (googleAccountFound) {
req.flash(ERROR_KEY, `${req.body.email} is already linked with a Google account.`);
return done(null, null, {message: `${req.body.email} is already linked with a Google account.`});
}
try {
console.log("=== SIGNUP DEBUG ===");
console.log("About to register user with data:", {name, team_name, email, timezone, team_member_id, team_id});
const user = await registerUser(password, team_id, name, team_name, email, timezone, team_member_id);
console.log("User registration successful, user object:", user);
sendWelcomeEmail(email, name);
return done(null, user, req.flash(SUCCESS_KEY, "Registration successful. Please check your email for verification."));
console.log("About to call done with user:", user);
req.flash(SUCCESS_KEY, "Registration successful. Please check your email for verification.");
return done(null, user, {message: "Registration successful. Please check your email for verification."});
} catch (error: any) {
console.log("=== SIGNUP ERROR ===");
console.log("Error during signup:", error);
const message = (error?.message) || "";
if (message === "ERROR_INVALID_JOINING_EMAIL") {
return done(null, null, req.flash(ERROR_KEY, `No invitations found for email ${req.body.email}.`));
req.flash(ERROR_KEY, `No invitations found for email ${req.body.email}.`);
return done(null, null, {message: `No invitations found for email ${req.body.email}.`});
}
// if error.message is "email already exists" then it should have the email address in the error message after ":".
if (message.includes("EMAIL_EXISTS_ERROR") || error.constraint === "users_google_id_uindex") {
const [, value] = error.message.split(":");
return done(null, null, req.flash(ERROR_KEY, `Worklenz account already exists for email ${value}.`));
const errorMsg = `Worklenz account already exists for email ${value}.`;
req.flash(ERROR_KEY, errorMsg);
return done(null, null, {message: errorMsg});
}
if (message.includes("TEAM_NAME_EXISTS_ERROR")) {
const [, value] = error.message.split(":");
return done(null, null, req.flash(ERROR_KEY, `Team name "${value}" already exists. Please choose a different team name.`));
const errorMsg = `Team name "${value}" already exists. Please choose a different team name.`;
req.flash(ERROR_KEY, errorMsg);
return done(null, null, {message: errorMsg});
}
// The Team name is already taken.
if (error.constraint === "teams_url_uindex" || error.constraint === "teams_name_uindex") {
return done(null, null, req.flash(ERROR_KEY, `Team name "${team_name}" is already taken. Please choose a different team name.`));
const errorMsg = `Team name "${team_name}" is already taken. Please choose a different team name.`;
req.flash(ERROR_KEY, errorMsg);
return done(null, null, {message: errorMsg});
}
log_error(error, req.body);
return done(null, null, req.flash(ERROR_KEY, DEFAULT_ERROR_MESSAGE));
req.flash(ERROR_KEY, DEFAULT_ERROR_MESSAGE);
return done(null, null, {message: DEFAULT_ERROR_MESSAGE});
}
}

View File

@@ -3,5 +3,9 @@ import {IPassportSession} from "../interfaces/passport-session";
// Parse the user id to deserialize function
export function serialize($user: IPassportSession, done: ISerializeCallback) {
console.log("=== SERIALIZE DEBUG ===");
console.log("Serializing user:", $user);
console.log("User ID:", $user?.id);
done(null, { id: $user?.id ?? null });
}