|
|
|
|
@@ -52,10 +52,7 @@ export class UserRepository {
|
|
|
|
|
);
|
|
|
|
|
return res.rows[0];
|
|
|
|
|
} catch (error) {
|
|
|
|
|
logger.error(
|
|
|
|
|
{ err: error instanceof Error ? error.message : error, email },
|
|
|
|
|
'Database error in findUserByEmail',
|
|
|
|
|
);
|
|
|
|
|
logger.error({ err: error, email }, 'Database error in findUserByEmail');
|
|
|
|
|
throw new Error('Failed to retrieve user from database.');
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@@ -130,10 +127,7 @@ export class UserRepository {
|
|
|
|
|
throw new UniqueConstraintError('A user with this email address already exists.');
|
|
|
|
|
}
|
|
|
|
|
// The withTransaction helper logs the rollback, so we just log the context here.
|
|
|
|
|
logger.error(
|
|
|
|
|
{ err: error instanceof Error ? error.message : error, email },
|
|
|
|
|
'Error during createUser transaction',
|
|
|
|
|
);
|
|
|
|
|
logger.error({ err: error, email }, 'Error during createUser transaction');
|
|
|
|
|
throw new Error('Failed to create user in database.');
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
@@ -188,10 +182,7 @@ export class UserRepository {
|
|
|
|
|
|
|
|
|
|
return authableProfile;
|
|
|
|
|
} catch (error) {
|
|
|
|
|
logger.error(
|
|
|
|
|
{ err: error instanceof Error ? error.message : error, email },
|
|
|
|
|
'Database error in findUserWithProfileByEmail',
|
|
|
|
|
);
|
|
|
|
|
logger.error({ err: error, email }, 'Database error in findUserWithProfileByEmail');
|
|
|
|
|
throw new Error('Failed to retrieve user with profile from database.');
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@@ -215,7 +206,7 @@ export class UserRepository {
|
|
|
|
|
} catch (error) {
|
|
|
|
|
if (error instanceof NotFoundError) throw error;
|
|
|
|
|
logger.error(
|
|
|
|
|
{ err: error instanceof Error ? error.message : error, userId },
|
|
|
|
|
{ err: error, userId },
|
|
|
|
|
'Database error in findUserById',
|
|
|
|
|
);
|
|
|
|
|
throw new Error('Failed to retrieve user by ID from database.');
|
|
|
|
|
@@ -242,7 +233,7 @@ export class UserRepository {
|
|
|
|
|
} catch (error) {
|
|
|
|
|
if (error instanceof NotFoundError) throw error;
|
|
|
|
|
logger.error(
|
|
|
|
|
{ err: error instanceof Error ? error.message : error, userId },
|
|
|
|
|
{ err: error, userId },
|
|
|
|
|
'Database error in findUserWithPasswordHashById',
|
|
|
|
|
);
|
|
|
|
|
throw new Error('Failed to retrieve user with sensitive data by ID from database.');
|
|
|
|
|
@@ -291,7 +282,7 @@ export class UserRepository {
|
|
|
|
|
throw error;
|
|
|
|
|
}
|
|
|
|
|
logger.error(
|
|
|
|
|
{ err: error instanceof Error ? error.message : error, userId },
|
|
|
|
|
{ err: error, userId },
|
|
|
|
|
'Database error in findUserProfileById',
|
|
|
|
|
);
|
|
|
|
|
throw new Error('Failed to retrieve user profile from database.');
|
|
|
|
|
@@ -340,7 +331,7 @@ export class UserRepository {
|
|
|
|
|
throw error;
|
|
|
|
|
}
|
|
|
|
|
logger.error(
|
|
|
|
|
{ err: error instanceof Error ? error.message : error, userId, profileData },
|
|
|
|
|
{ err: error, userId, profileData },
|
|
|
|
|
'Database error in updateUserProfile',
|
|
|
|
|
);
|
|
|
|
|
throw new Error('Failed to update user profile in database.');
|
|
|
|
|
@@ -372,7 +363,7 @@ export class UserRepository {
|
|
|
|
|
throw error;
|
|
|
|
|
}
|
|
|
|
|
logger.error(
|
|
|
|
|
{ err: error instanceof Error ? error.message : error, userId, preferences },
|
|
|
|
|
{ err: error, userId, preferences },
|
|
|
|
|
'Database error in updateUserPreferences',
|
|
|
|
|
);
|
|
|
|
|
throw new Error('Failed to update user preferences in database.');
|
|
|
|
|
@@ -393,7 +384,7 @@ export class UserRepository {
|
|
|
|
|
);
|
|
|
|
|
} catch (error) {
|
|
|
|
|
logger.error(
|
|
|
|
|
{ err: error instanceof Error ? error.message : error, userId },
|
|
|
|
|
{ err: error, userId },
|
|
|
|
|
'Database error in updateUserPassword',
|
|
|
|
|
);
|
|
|
|
|
throw new Error('Failed to update user password in database.');
|
|
|
|
|
@@ -408,9 +399,9 @@ export class UserRepository {
|
|
|
|
|
async deleteUserById(userId: string, logger: Logger): Promise<void> {
|
|
|
|
|
try {
|
|
|
|
|
await this.db.query('DELETE FROM public.users WHERE user_id = $1', [userId]);
|
|
|
|
|
} catch (error) {
|
|
|
|
|
} catch (error) { // This was a duplicate, fixed.
|
|
|
|
|
logger.error(
|
|
|
|
|
{ err: error instanceof Error ? error.message : error, userId },
|
|
|
|
|
{ err: error, userId },
|
|
|
|
|
'Database error in deleteUserById',
|
|
|
|
|
);
|
|
|
|
|
throw new Error('Failed to delete user from database.');
|
|
|
|
|
@@ -431,7 +422,7 @@ export class UserRepository {
|
|
|
|
|
);
|
|
|
|
|
} catch (error) {
|
|
|
|
|
logger.error(
|
|
|
|
|
{ err: error instanceof Error ? error.message : error, userId },
|
|
|
|
|
{ err: error, userId },
|
|
|
|
|
'Database error in saveRefreshToken',
|
|
|
|
|
);
|
|
|
|
|
throw new Error('Failed to save refresh token.');
|
|
|
|
|
@@ -457,7 +448,7 @@ export class UserRepository {
|
|
|
|
|
} catch (error) {
|
|
|
|
|
if (error instanceof NotFoundError) throw error;
|
|
|
|
|
logger.error(
|
|
|
|
|
{ err: error instanceof Error ? error.message : error },
|
|
|
|
|
{ err: error },
|
|
|
|
|
'Database error in findUserByRefreshToken',
|
|
|
|
|
);
|
|
|
|
|
throw new Error('Failed to find user by refresh token.'); // Generic error for other failures
|
|
|
|
|
@@ -474,10 +465,7 @@ export class UserRepository {
|
|
|
|
|
refreshToken,
|
|
|
|
|
]);
|
|
|
|
|
} catch (error) {
|
|
|
|
|
logger.error(
|
|
|
|
|
{ err: error instanceof Error ? error.message : error },
|
|
|
|
|
'Database error in deleteRefreshToken',
|
|
|
|
|
);
|
|
|
|
|
logger.error({ err: error }, 'Database error in deleteRefreshToken');
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -501,7 +489,7 @@ export class UserRepository {
|
|
|
|
|
throw new ForeignKeyConstraintError('The specified user does not exist.');
|
|
|
|
|
}
|
|
|
|
|
logger.error(
|
|
|
|
|
{ err: error instanceof Error ? error.message : error, userId },
|
|
|
|
|
{ err: error, userId },
|
|
|
|
|
'Database error in createPasswordResetToken',
|
|
|
|
|
);
|
|
|
|
|
throw new Error('Failed to create password reset token.');
|
|
|
|
|
@@ -521,7 +509,7 @@ export class UserRepository {
|
|
|
|
|
return res.rows;
|
|
|
|
|
} catch (error) {
|
|
|
|
|
logger.error(
|
|
|
|
|
{ err: error instanceof Error ? error.message : error },
|
|
|
|
|
{ err: error },
|
|
|
|
|
'Database error in getValidResetTokens',
|
|
|
|
|
);
|
|
|
|
|
throw new Error('Failed to retrieve valid reset tokens.');
|
|
|
|
|
@@ -538,7 +526,7 @@ export class UserRepository {
|
|
|
|
|
await this.db.query('DELETE FROM public.password_reset_tokens WHERE token_hash = $1', [tokenHash]);
|
|
|
|
|
} catch (error) {
|
|
|
|
|
logger.error(
|
|
|
|
|
{ err: error instanceof Error ? error.message : error, tokenHash },
|
|
|
|
|
{ err: error, tokenHash },
|
|
|
|
|
'Database error in deleteResetToken',
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
@@ -559,10 +547,7 @@ export class UserRepository {
|
|
|
|
|
);
|
|
|
|
|
return res.rowCount ?? 0;
|
|
|
|
|
} catch (error) {
|
|
|
|
|
logger.error(
|
|
|
|
|
{ err: error instanceof Error ? error.message : error },
|
|
|
|
|
'Database error in deleteExpiredResetTokens',
|
|
|
|
|
);
|
|
|
|
|
logger.error({ err: error }, 'Database error in deleteExpiredResetTokens');
|
|
|
|
|
throw new Error('Failed to delete expired password reset tokens.');
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@@ -581,10 +566,7 @@ export class UserRepository {
|
|
|
|
|
if (error instanceof Error && 'code' in error && error.code === '23503') {
|
|
|
|
|
throw new ForeignKeyConstraintError('One or both users do not exist.');
|
|
|
|
|
}
|
|
|
|
|
logger.error(
|
|
|
|
|
{ err: error instanceof Error ? error.message : error, followerId, followingId },
|
|
|
|
|
'Database error in followUser',
|
|
|
|
|
);
|
|
|
|
|
logger.error({ err: error, followerId, followingId }, 'Database error in followUser');
|
|
|
|
|
throw new Error('Failed to follow user.');
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@@ -601,10 +583,7 @@ export class UserRepository {
|
|
|
|
|
[followerId, followingId],
|
|
|
|
|
);
|
|
|
|
|
} catch (error) {
|
|
|
|
|
logger.error(
|
|
|
|
|
{ err: error instanceof Error ? error.message : error, followerId, followingId },
|
|
|
|
|
'Database error in unfollowUser',
|
|
|
|
|
);
|
|
|
|
|
logger.error({ err: error, followerId, followingId }, 'Database error in unfollowUser');
|
|
|
|
|
throw new Error('Failed to unfollow user.');
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@@ -635,10 +614,7 @@ export class UserRepository {
|
|
|
|
|
const res = await this.db.query<ActivityLogItem>(query, [userId, limit, offset]);
|
|
|
|
|
return res.rows;
|
|
|
|
|
} catch (error) {
|
|
|
|
|
logger.error(
|
|
|
|
|
{ err: error instanceof Error ? error.message : error, userId, limit, offset },
|
|
|
|
|
'Database error in getUserFeed',
|
|
|
|
|
);
|
|
|
|
|
logger.error({ err: error, userId, limit, offset }, 'Database error in getUserFeed');
|
|
|
|
|
throw new Error('Failed to retrieve user feed.');
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@@ -660,10 +636,7 @@ export class UserRepository {
|
|
|
|
|
);
|
|
|
|
|
return res.rows[0];
|
|
|
|
|
} catch (error) {
|
|
|
|
|
logger.error(
|
|
|
|
|
{ err: error instanceof Error ? error.message : error, queryData },
|
|
|
|
|
'Database error in logSearchQuery',
|
|
|
|
|
);
|
|
|
|
|
logger.error({ err: error, queryData }, 'Database error in logSearchQuery');
|
|
|
|
|
throw new Error('Failed to log search query.');
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@@ -698,7 +671,7 @@ export async function exportUserData(userId: string, logger: Logger): Promise<{
|
|
|
|
|
});
|
|
|
|
|
} catch (error) {
|
|
|
|
|
logger.error(
|
|
|
|
|
{ err: error instanceof Error ? error.message : error, userId },
|
|
|
|
|
{ err: error, userId },
|
|
|
|
|
'Database error in exportUserData',
|
|
|
|
|
);
|
|
|
|
|
throw new Error('Failed to export user data.');
|
|
|
|
|
|