From 479536265a781cd9a5f0e58a607f276dce74a1c4 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Tue, 24 Jun 2025 17:50:42 +0200 Subject: [PATCH] log errors in user resolver --- backend/src/graphql/resolvers/users.spec.ts | 6 +++ backend/src/graphql/resolvers/users.ts | 47 +++++++++++++++------ 2 files changed, 39 insertions(+), 14 deletions(-) diff --git a/backend/src/graphql/resolvers/users.spec.ts b/backend/src/graphql/resolvers/users.spec.ts index 2576c1f15..effa97e1d 100644 --- a/backend/src/graphql/resolvers/users.spec.ts +++ b/backend/src/graphql/resolvers/users.spec.ts @@ -24,6 +24,12 @@ let query let mutate let variables +const loggerErrorMock: (e) => void = jest.fn() + +jest.mock('@src/logger', () => ({ + error: (e) => loggerErrorMock(e), +})) + const pubsub = pubsubContext() const deleteUserMutation = gql` diff --git a/backend/src/graphql/resolvers/users.ts b/backend/src/graphql/resolvers/users.ts index 9418ef3e6..93189cf73 100644 --- a/backend/src/graphql/resolvers/users.ts +++ b/backend/src/graphql/resolvers/users.ts @@ -52,10 +52,11 @@ export const getBlockedUsers = async (context) => { export default { Query: { - mutedUsers: async (_object, _args, context, _resolveInfo) => { + mutedUsers: async (_object, _args, context: Context, _resolveInfo) => { try { return getMutedUsers(context) } catch (e) { + context.logger.error('mutedUsers query', e.message) throw new UserInputError(e.message) } }, @@ -63,6 +64,7 @@ export default { try { return getBlockedUsers(context) } catch (e) { + context.logger.error('blockedUsers query', e.message) throw new UserInputError(e.message) } }, @@ -142,6 +144,7 @@ export default { try { return await writeTxResultPromise } catch (error) { + context.logger.error('blockUser mutation', error.message) throw new UserInputError(error.message) } finally { session.close() @@ -166,6 +169,7 @@ export default { try { return await writeTxResultPromise } catch (error) { + context.logger.error('unblockUser mutation', error.message) throw new UserInputError(error.message) } finally { session.close() @@ -179,6 +183,7 @@ export default { if (termsAndConditionsAgreedVersion) { const regEx = /^[0-9]+\.[0-9]+\.[0-9]+$/g if (!regEx.test(termsAndConditionsAgreedVersion)) { + context.logger.error('UpdateUser query: Invalid version format!') throw new ForbiddenError('Invalid version format!') } params.termsAndConditionsAgreedAt = new Date().toISOString() @@ -220,6 +225,7 @@ export default { await createOrUpdateLocations('User', params.id, params.locationName, session) return user } catch (error) { + context.logger.error('UpdateUser mutation', error.message) throw new UserInputError(error.message) } finally { session.close() @@ -294,7 +300,10 @@ export default { switchUserRole: async (_object, args, context, _resolveInfo) => { const { role, id } = args - if (context.user.id === id) throw new Error('you-cannot-change-your-own-role') + if (context.user.id === id) { + context.logger.error('switchUserRole mutation: you-cannot-change-your-own-role') + throw new Error('you-cannot-change-your-own-role') + } const session = context.driver.session() const writeTxResultPromise = session.writeTransaction(async (transaction) => { const switchUserRoleResponse = await transaction.run( @@ -390,13 +399,16 @@ export default { return true }, - setTrophyBadgeSelected: async (_object, args, context, _resolveInfo) => { + setTrophyBadgeSelected: async (_object, args, context: Context, _resolveInfo) => { const { slot, badgeId } = args const { user: { id: userId }, } = context if (slot >= TROPHY_BADGES_SELECTED_MAX || slot < 0) { + context.logger.error( + `Invalid slot! There is only ${TROPHY_BADGES_SELECTED_MAX} badge-slots to fill`, + ) throw new Error( `Invalid slot! There is only ${TROPHY_BADGES_SELECTED_MAX} badge-slots to fill`, ) @@ -431,16 +443,18 @@ export default { try { const user = await query if (!user) { + context.logger.error('You cannot set badges not rewarded to you.') throw new Error('You cannot set badges not rewarded to you.') } return user } catch (error) { + context.logger.error('setTrophyBadgeSelected mutation', error) throw new Error(error) } finally { - session.close() + await session.close() } }, - resetTrophyBadgesSelected: async (_object, _args, context, _resolveInfo) => { + resetTrophyBadgesSelected: async (_object, _args, context: Context, _resolveInfo) => { const { user: { id: userId }, } = context @@ -462,9 +476,10 @@ export default { try { return await query } catch (error) { + context.logger.error('resetTrophyBadgeSelected mutation', error) throw new Error(error) } finally { - session.close() + await session.close() } }, }, @@ -537,7 +552,7 @@ export default { }, ] }, - badgeTrophiesSelected: async (parent, _params, context, _resolveInfo) => { + badgeTrophiesSelected: async (parent, _params, context: Context, _resolveInfo) => { const session = context.driver.session() const query = session.readTransaction(async (transaction) => { @@ -561,12 +576,13 @@ export default { }) return result } catch (error) { + context.logger.error('user query badgeTrophiesSelected', error) throw new Error(error) } finally { - session.close() + await session.close() } }, - badgeTrophiesUnused: async (parent, _params, context, _resolveInfo) => { + badgeTrophiesUnused: async (parent, _params, context: Context, _resolveInfo) => { const session = context.driver.session() const query = session.readTransaction(async (transaction) => { @@ -583,12 +599,13 @@ export default { try { return await query } catch (error) { + context.logger.error('user query badgeTrophiesUnused', error) throw new Error(error) } finally { - session.close() + await session.close() } }, - badgeTrophiesUnusedCount: async (parent, _params, context, _resolveInfo) => { + badgeTrophiesUnusedCount: async (parent, _params, context: Context, _resolveInfo) => { const session = context.driver.session() const query = session.readTransaction(async (transaction) => { @@ -605,12 +622,13 @@ export default { try { return await query } catch (error) { + context.logger.error('user query badgeTrophiesUnusedCount', error) throw new Error(error) } finally { - session.close() + await session.close() } }, - badgeVerification: async (parent, _params, context, _resolveInfo) => { + badgeVerification: async (parent, _params, context: Context, _resolveInfo) => { const session = context.driver.session() const query = session.writeTransaction(async (transaction) => { @@ -627,9 +645,10 @@ export default { const result = await query return result ?? defaultVerificationBadge } catch (error) { + context.logger.error('user query badgeVerification', error) throw new Error(error) } finally { - session.close() + await session.close() } }, ...Resolver('User', {