diff --git a/packages/hoppscotch-backend/src/errors.ts b/packages/hoppscotch-backend/src/errors.ts index 6fb4a4a13..88b23e2af 100644 --- a/packages/hoppscotch-backend/src/errors.ts +++ b/packages/hoppscotch-backend/src/errors.ts @@ -621,3 +621,9 @@ export const MAILER_SMTP_URL_UNDEFINED = 'mailer/smtp_url_undefined' as const; */ export const MAILER_FROM_ADDRESS_UNDEFINED = 'mailer/from_address_undefined' as const; + +/** + * SharedRequest not found in DB + * (SharedRequestService) + */ +export const SHARED_REQUEST_NOT_FOUND = 'shared_request/not_found' as const; diff --git a/packages/hoppscotch-backend/src/shared-request/shared-request.module.ts b/packages/hoppscotch-backend/src/shared-request/shared-request.module.ts index 4449ecfb7..4adc6f9e9 100644 --- a/packages/hoppscotch-backend/src/shared-request/shared-request.module.ts +++ b/packages/hoppscotch-backend/src/shared-request/shared-request.module.ts @@ -1,8 +1,12 @@ import { Module } from '@nestjs/common'; import { SharedRequestService } from './shared-request.service'; import { SharedRequestResolver } from './shared-request.resolver'; +import { PubSubModule } from 'src/pubsub/pubsub.module'; +import { UserModule } from 'src/user/user.module'; +import { PrismaModule } from 'src/prisma/prisma.module'; @Module({ - providers: [SharedRequestService, SharedRequestResolver] + imports: [PrismaModule, UserModule, PubSubModule], + providers: [SharedRequestService, SharedRequestResolver], }) export class SharedRequestModule {} 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 7c521ba26..08be4216f 100644 --- a/packages/hoppscotch-backend/src/shared-request/shared-request.resolver.ts +++ b/packages/hoppscotch-backend/src/shared-request/shared-request.resolver.ts @@ -1,4 +1,39 @@ -import { Resolver } from '@nestjs/graphql'; +import { Args, ID, Resolver, Query } from '@nestjs/graphql'; +import { SharedRequest } from './shared-requests.model'; +import { GqlThrottlerGuard } from 'src/guards/gql-throttler.guard'; +import { UseGuards } from '@nestjs/common'; +import { SharedRequestService } from './shared-request.service'; +import { UserService } from 'src/user/user.service'; +import { PubSubService } from 'src/pubsub/pubsub.service'; +import * as E from 'fp-ts/Either'; +import { GqlAuthGuard } from 'src/guards/gql-auth.guard'; +import { throwErr } from 'src/utils'; -@Resolver() -export class SharedRequestResolver {} +@UseGuards(GqlThrottlerGuard) +@Resolver(() => SharedRequest) +export class SharedRequestResolver { + constructor( + private readonly sharedRequestService: SharedRequestService, + private readonly userService: UserService, + private readonly pubsub: PubSubService, + ) {} + + /* Queries */ + @Query(() => SharedRequest, { + description: 'Resolves and returns a shared-request data', + }) + @UseGuards(GqlAuthGuard) + async sharedRequest( + @Args({ + name: 'code', + type: () => ID, + description: 'The shared-request to fetch', + }) + code: string, + ) { + const result = await this.sharedRequestService.getSharedRequest(code); + + if (E.isLeft(result)) throwErr(result.left); + return result.right; + } +} 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 7e544f951..40ba68c92 100644 --- a/packages/hoppscotch-backend/src/shared-request/shared-request.service.ts +++ b/packages/hoppscotch-backend/src/shared-request/shared-request.service.ts @@ -1,4 +1,48 @@ import { Injectable } from '@nestjs/common'; - +import { PrismaService } from 'src/prisma/prisma.service'; +import { PubSubService } from 'src/pubsub/pubsub.service'; +import { Shortcode as DBSharedRequest } from '@prisma/client'; +import { UserService } from 'src/user/user.service'; +import * as E from 'fp-ts/Either'; +import { SharedRequest } from './shared-requests.model'; +import { SHARED_REQUEST_NOT_FOUND } from 'src/errors'; @Injectable() -export class SharedRequestService {} +export class SharedRequestService { + constructor( + private readonly prisma: PrismaService, + private readonly pubsub: PubSubService, + private readonly userService: UserService, + ) {} + + /** + * Converts a Prisma SharedRequest type into the SharedRequest model + * + * @param sharedRequestInfo Prisma SharedRequest type + * @returns GQL SharedRequest + */ + private cast(sharedRequestInfo: DBSharedRequest): SharedRequest { + return { + id: sharedRequestInfo.id, + request: JSON.stringify(sharedRequestInfo.request), + properties: JSON.stringify(sharedRequestInfo.properties), + createdOn: sharedRequestInfo.createdOn, + }; + } + + /** + * Fetch details regarding a SharedRequest + * + * @param sharedRequestID SharedRequest + * @returns Either of SharedRequest details or error + */ + async getSharedRequest(sharedRequestID: string) { + try { + const sharedRequest = await this.prisma.shortcode.findFirstOrThrow({ + where: { id: sharedRequestID }, + }); + return E.right(this.cast(sharedRequest)); + } catch (error) { + return E.left(SHARED_REQUEST_NOT_FOUND); + } + } +}