From 91c07e15b3ec890d136e4f4050c403a6210b90f6 Mon Sep 17 00:00:00 2001 From: Balu Babu Date: Tue, 31 Oct 2023 20:04:26 +0530 Subject: [PATCH] feat: added ability to update and listen to updates of shared-requests --- packages/hoppscotch-backend/src/errors.ts | 11 +++- .../src/pubsub/topicsDefs.ts | 4 +- .../shared-request/shared-request.resolver.ts | 38 ++++++++++++++ .../shared-request/shared-request.service.ts | 51 ++++++++++++++++--- 4 files changed, 93 insertions(+), 11 deletions(-) diff --git a/packages/hoppscotch-backend/src/errors.ts b/packages/hoppscotch-backend/src/errors.ts index 9d3c0ad8a..dcfa32ba3 100644 --- a/packages/hoppscotch-backend/src/errors.ts +++ b/packages/hoppscotch-backend/src/errors.ts @@ -629,15 +629,22 @@ export const MAILER_FROM_ADDRESS_UNDEFINED = export const SHARED_REQUEST_NOT_FOUND = 'shared_request/not_found' as const; /** - * SharedRequest invalid request JSON formal + * SharedRequest invalid request JSON format * (SharedRequestService) */ export const SHARED_REQUEST_INVALID_REQUEST_JSON = 'shared_request/request_invalid_format' as const; /** - * SharedRequest invalid properties JSON formal + * SharedRequest invalid properties JSON format * (SharedRequestService) */ export const SHARED_REQUEST_INVALID_PROPERTIES_JSON = 'shared_request/properties_invalid_format' as const; + +/** + * SharedRequest invalid properties not found + * (SharedRequestService) + */ +export const SHARED_REQUEST_PROPERTIES_NOT_FOUND = + 'shared_request/properties_not_found' as const; diff --git a/packages/hoppscotch-backend/src/pubsub/topicsDefs.ts b/packages/hoppscotch-backend/src/pubsub/topicsDefs.ts index cc9fff042..c0ccf764c 100644 --- a/packages/hoppscotch-backend/src/pubsub/topicsDefs.ts +++ b/packages/hoppscotch-backend/src/pubsub/topicsDefs.ts @@ -71,5 +71,7 @@ export type TopicDef = { [topic: `team/${string}/invite_added`]: TeamInvitation; [topic: `team/${string}/invite_removed`]: string; [topic: `shortcode/${string}/${'created' | 'revoked'}`]: Shortcode; - [topic: `shared_request/${string}/${'created' | 'revoked'}`]: SharedRequest; + [ + topic: `shared_request/${string}/${'created' | 'revoked' | 'updated'}` + ]: SharedRequest; }; diff --git a/packages/hoppscotch-backend/src/shared-request/shared-request.resolver.ts b/packages/hoppscotch-backend/src/shared-request/shared-request.resolver.ts index 55c604307..b1a7ead8b 100644 --- a/packages/hoppscotch-backend/src/shared-request/shared-request.resolver.ts +++ b/packages/hoppscotch-backend/src/shared-request/shared-request.resolver.ts @@ -85,6 +85,34 @@ export class SharedRequestResolver { return result.right; } + @Mutation(() => SharedRequest, { + description: 'Update a user generated shared-request', + }) + @UseGuards(GqlAuthGuard) + async updateSharedRequest( + @GqlUser() user: AuthUser, + @Args({ + name: 'code', + type: () => ID, + description: 'The shared-request to update', + }) + code: string, + @Args({ + name: 'properties', + description: 'JSON string of the properties of the embed', + }) + properties: string, + ) { + const result = await this.sharedRequestService.updateSharedRequest( + code, + user.uid, + properties, + ); + + if (E.isLeft(result)) throwErr(result.left); + return result.right; + } + @Mutation(() => Boolean, { description: 'Revoke a user generated shared-request', }) @@ -118,6 +146,16 @@ export class SharedRequestResolver { return this.pubsub.asyncIterator(`shared_request/${user.uid}/created`); } + @Subscription(() => SharedRequest, { + description: 'Listen for shared-request updates', + resolve: (value) => value, + }) + @SkipThrottle() + @UseGuards(GqlAuthGuard) + mySharedRequestUpdated(@GqlUser() user: AuthUser) { + return this.pubsub.asyncIterator(`shared_request/${user.uid}/updated`); + } + @Subscription(() => SharedRequest, { description: 'Listen for shared-request deletion', resolve: (value) => value, diff --git a/packages/hoppscotch-backend/src/shared-request/shared-request.service.ts b/packages/hoppscotch-backend/src/shared-request/shared-request.service.ts index 25c5441af..b2d9c4719 100644 --- a/packages/hoppscotch-backend/src/shared-request/shared-request.service.ts +++ b/packages/hoppscotch-backend/src/shared-request/shared-request.service.ts @@ -10,6 +10,7 @@ import { SHARED_REQUEST_INVALID_PROPERTIES_JSON, SHARED_REQUEST_INVALID_REQUEST_JSON, SHARED_REQUEST_NOT_FOUND, + SHARED_REQUEST_PROPERTIES_NOT_FOUND, } from 'src/errors'; import { stringToJson } from 'src/utils'; import { AuthUser } from 'src/types/AuthUser'; @@ -135,13 +136,6 @@ export class SharedRequestService implements UserDataHandler, OnModuleInit { if (E.isLeft(requestData)) return E.left(SHARED_REQUEST_INVALID_REQUEST_JSON); - // let propertiesData; - // if (!properties) propertiesData = undefined; - // const parsedProperties = stringToJson(properties); - // if (E.isLeft(parsedProperties)) - // return E.left(SHARED_REQUEST_INVALID_PROPERTIES_JSON); - // propertiesData = parsedProperties.right; - const parsedProperties = stringToJson(properties); if (E.isLeft(parsedProperties)) return E.left(SHARED_REQUEST_INVALID_PROPERTIES_JSON); @@ -196,7 +190,7 @@ export class SharedRequestService implements UserDataHandler, OnModuleInit { /** * Delete a SharedRequest * - * @param sharedRequestID SharedRequest + * @param sharedRequestID SharedRequest ID * @param uid User Uid * @returns Boolean on successful deletion */ @@ -221,4 +215,45 @@ export class SharedRequestService implements UserDataHandler, OnModuleInit { return E.left(SHARED_REQUEST_NOT_FOUND); } } + + /** + * Update a created SharedRequest + * @param sharedRequestID SharedRequest ID + * @param uid User Uid + * @returns Updated SharedRequest + */ + async updateSharedRequest( + sharedRequestID: string, + uid: string, + updatedProps: string, + ) { + if (!updatedProps) return E.left(SHARED_REQUEST_PROPERTIES_NOT_FOUND); + + const parsedProperties = stringToJson(updatedProps); + if (E.isLeft(parsedProperties)) + return E.left(SHARED_REQUEST_INVALID_PROPERTIES_JSON); + + try { + const updatedSharedRequest = await this.prisma.shortcode.update({ + where: { + creator_uid_shortcode_unique: { + creatorUid: uid, + id: sharedRequestID, + }, + }, + data: { + properties: updatedProps, + }, + }); + + this.pubsub.publish( + `shared_request/${updatedSharedRequest.creatorUid}/updated`, + this.cast(updatedSharedRequest), + ); + + return E.right(this.cast(updatedSharedRequest)); + } catch (error) { + return E.left(SHARED_REQUEST_NOT_FOUND); + } + } }