Compare commits

...

2 Commits

Author SHA1 Message Date
Gitea Actions
3ae7b9e0d4 ci: Bump version to 0.0.17 [skip ci] 2025-12-24 04:51:21 +05:00
921c48fc57 more unit test fixes now the UseProfileAddress OOM has been identified
All checks were successful
Deploy to Test Environment / deploy-to-test (push) Successful in 10m14s
2025-12-23 15:50:01 -08:00
8 changed files with 29 additions and 57 deletions

4
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{
"name": "flyer-crawler",
"version": "0.0.16",
"version": "0.0.17",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "flyer-crawler",
"version": "0.0.16",
"version": "0.0.17",
"dependencies": {
"@bull-board/api": "^6.14.2",
"@bull-board/express": "^6.14.2",

View File

@@ -1,7 +1,7 @@
{
"name": "flyer-crawler",
"private": true,
"version": "0.0.16",
"version": "0.0.17",
"type": "module",
"scripts": {
"dev": "concurrently \"npm:start:dev\" \"vite\"",

View File

@@ -142,7 +142,7 @@ export const PriceHistoryChart: React.FC = () => {
const renderContent = () => {
if (isLoading || isLoadingUserData) {
return (
<div role="status" className="flex justify-center items-center h-full min-h-[200px]">
<div role="status" className="flex justify-center items-center h-full min-h-50]">
<LoadingSpinner /> <span className="ml-2">Loading Price History...</span>
</div>
);

View File

@@ -2,7 +2,7 @@
import { Router, Request, Response, NextFunction } from 'express';
import multer from 'multer';
import path from 'path';
import fs from 'fs';
import fs from 'node:fs';
import { z } from 'zod';
import passport from './passport.routes';
import { optionalAuth } from './passport.routes';

View File

@@ -297,7 +297,6 @@ describe('Auth Routes (/api/auth)', () => {
// The API now returns a nested UserProfile object
expect(response.body.userprofile).toEqual(
expect.objectContaining({
user_id: 'user-123',
user: expect.objectContaining({
user_id: 'user-123',
email: loginCredentials.email,

View File

@@ -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.');

View File

@@ -45,7 +45,7 @@ export class GoogleGeocodingService {
return null;
} catch (error) {
logger.error(
{ err: error instanceof Error ? error.message : error, address },
{ err: error, address },
'[GoogleGeocodingService] An error occurred while calling the Google Maps API.',
);
throw error; // Re-throw to allow the calling service to handle the failure (e.g., by falling back).