From c49573db6510ea822f27e31122da6721fd321a38 Mon Sep 17 00:00:00 2001 From: Akash K <57758277+amk-dev@users.noreply.github.com> Date: Mon, 3 Apr 2023 09:47:40 +0530 Subject: [PATCH] fix: serialize user sessions properly (#62) * fix: cast prisma user object to user object * chore: improved consistency * chore: cast function renamed --------- Co-authored-by: Mir Arif Hasan --- .../src/user/user.resolver.ts | 4 +-- .../src/user/user.service.ts | 32 +++++++++++++------ 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/packages/hoppscotch-backend/src/user/user.resolver.ts b/packages/hoppscotch-backend/src/user/user.resolver.ts index b8cdaa0d8..080592c81 100644 --- a/packages/hoppscotch-backend/src/user/user.resolver.ts +++ b/packages/hoppscotch-backend/src/user/user.resolver.ts @@ -26,8 +26,8 @@ export class UserResolver { "Gives details of the user executing this query (pass Authorization 'Bearer' header)", }) @UseGuards(GqlAuthGuard) - me(@GqlUser() user) { - return user; + me(@GqlUser() user: AuthUser) { + return this.userService.convertDbUserToUser(user); } /* Mutations */ diff --git a/packages/hoppscotch-backend/src/user/user.service.ts b/packages/hoppscotch-backend/src/user/user.service.ts index 93da14e54..196c47182 100644 --- a/packages/hoppscotch-backend/src/user/user.service.ts +++ b/packages/hoppscotch-backend/src/user/user.service.ts @@ -14,6 +14,7 @@ import { USER_UPDATE_FAILED } from 'src/errors'; import { PubSubService } from 'src/pubsub/pubsub.service'; import { stringToJson, taskEitherValidateArraySeq } from 'src/utils'; import { UserDataHandler } from './user.data.handler'; +import { User as DbUser } from '@prisma/client'; @Injectable() export class UserService { @@ -28,6 +29,27 @@ export class UserService { this.userDataHandlers.push(handler); } + /** + * Converts a prisma user object to a user object + * + * @param dbUser Prisma User object + * @returns User object + */ + convertDbUserToUser(dbUser: DbUser): User { + const dbCurrentRESTSession = dbUser.currentRESTSession; + const dbCurrentGQLSession = dbUser.currentGQLSession; + + return { + ...dbUser, + currentRESTSession: dbCurrentRESTSession + ? JSON.stringify(dbCurrentRESTSession) + : null, + currentGQLSession: dbCurrentGQLSession + ? JSON.stringify(dbCurrentGQLSession) + : null, + }; + } + /** * Find User with given email id * @@ -236,15 +258,7 @@ export class UserService { data: sessionObj, }); - const updatedUser: User = { - ...dbUpdatedUser, - currentGQLSession: dbUpdatedUser.currentGQLSession - ? JSON.stringify(dbUpdatedUser.currentGQLSession) - : null, - currentRESTSession: dbUpdatedUser.currentRESTSession - ? JSON.stringify(dbUpdatedUser.currentRESTSession) - : null, - }; + const updatedUser = this.convertDbUserToUser(dbUpdatedUser); // Publish subscription for user updates await this.pubsub.publish(`user/${updatedUser.uid}/updated`, updatedUser);