Files
hoppscotch/packages/hoppscotch-backend/src/user-request/resolvers/user-request.resolver.ts
Mir Arif Hasan 223150550f feat: user request module with re-ordering (HBE-78) (#11)
* feat: added user-request schema in prisma

* feat: basic mutation and queries implementation

* fix: enum registration in graphql

* feat: user resolver added for user requests

* chore: refactor codes

* feat: transaction added in request reordering operation

* feat: pubsub added in user request

* refactor: user request service

* chore: feedback added

* chore: code improvement

* fix: bug fix

* feat: request type update in schema and JSDoc added

* test: fetchUserRequests and fetchUserRequest unit test added

* chore: refactor two functions

* test: unit test added for more functions

* chore: code readability improved

* test: added unit test for reorderRequests function

* feat: subscriptions added

* fix: User reference to AuthUser

* fix: User to AuthUser in test file

* chore: update dto file extensions

* feat: relation added in schema level

* chore: add function for db to model type casting

* feat: filter with title and collectionID add in userRequest resolver

* feat: resolvers added for userCollection in request module, and move inputTypes in a single file

* test: test file updated

* docs: description updated

* feat: createdOn, updatedOn added in user request schema

* chore: (delete in future) user collection module add for testing purpose

* feat: separate resolvers for create, update, delete user request based on req type

* feat: used paginationArgs from common types

* fix: shift InputTypes to ArgsTypes

* docs: update docs

* feat: avoid destructuring

* test: fix test cases for create and update

* docs: update JS doc

* feat: separate object variables for moveRequest function

* test: fix test case for moveRequest function

* feat: saperate parameters for fetchUserRequest

* test: fix test cases for fetchUserRequests

* feat: update some query names and made review changes

* test: fix test cases

* feat: remove filtering with title

* test: fix text cases for fetchUserRequests func

* feat: update subscription key

* feat: edge case handled for user request creation

* test: fix test case

* fix: user field resolver

* fix: fetch user req issue

* fix: update with type check

* test: fix test cases

* feat: type checked on move request

* test: add test case for typeValidity check func

* fix: edge condition added in if statement

* fix: error message

* chore: removed user collection from this branch

* fix: typos
2023-03-03 16:51:49 +06:00

267 lines
6.8 KiB
TypeScript

import { UseGuards } from '@nestjs/common';
import {
Args,
Context,
ID,
Mutation,
Query,
ResolveField,
Resolver,
Subscription,
} from '@nestjs/graphql';
import { GqlUser } from 'src/decorators/gql-user.decorator';
import { GqlAuthGuard } from 'src/guards/gql-auth.guard';
import { PubSubService } from 'src/pubsub/pubsub.service';
import * as E from 'fp-ts/Either';
import { throwErr } from 'src/utils';
import { UserRequest } from '../user-request.model';
import { UserRequestService } from '../user-request.service';
import {
GetUserRequestArgs,
CreateUserRequestArgs,
UpdateUserRequestArgs,
MoveUserRequestArgs,
} from '../input-type.args';
import { AuthUser } from 'src/types/AuthUser';
import { User } from 'src/user/user.model';
import { ReqType } from 'src/user-history/user-history.model';
@Resolver(() => UserRequest)
export class UserRequestResolver {
constructor(
private readonly userRequestService: UserRequestService,
private readonly pubSub: PubSubService,
) {}
@ResolveField(() => User, {
description: 'Returns the user of the user request',
})
async user(@GqlUser() user: AuthUser) {
return user;
}
/* Queries */
@Query(() => [UserRequest], {
description: 'Get REST user requests',
})
@UseGuards(GqlAuthGuard)
async userRESTRequests(
@GqlUser() user: AuthUser,
@Args() args: GetUserRequestArgs,
): Promise<UserRequest[]> {
const requests = await this.userRequestService.fetchUserRequests(
args.collectionID,
ReqType.REST,
args.cursor,
args.take,
user,
);
if (E.isLeft(requests)) throwErr(requests.left);
return requests.right;
}
@Query(() => [UserRequest], {
description: 'Get GraphQL user requests',
})
@UseGuards(GqlAuthGuard)
async userGQLRequests(
@GqlUser() user: AuthUser,
@Args() args: GetUserRequestArgs,
): Promise<UserRequest[]> {
const requests = await this.userRequestService.fetchUserRequests(
args.collectionID,
ReqType.GQL,
args.cursor,
args.take,
user,
);
if (E.isLeft(requests)) throwErr(requests.left);
return requests.right;
}
@Query(() => UserRequest, {
description: 'Get a user request by ID',
})
@UseGuards(GqlAuthGuard)
async userRequest(
@GqlUser() user: AuthUser,
@Args({
name: 'id',
type: () => ID,
description: 'ID of the user request',
})
id: string,
): Promise<UserRequest> {
const request = await this.userRequestService.fetchUserRequest(id, user);
if (E.isLeft(request)) throwErr(request.left);
return request.right;
}
/* Mutations */
@Mutation(() => UserRequest, {
description: 'Create a new user REST request',
})
@UseGuards(GqlAuthGuard)
async createRESTUserRequest(
@GqlUser() user: AuthUser,
@Args() args: CreateUserRequestArgs,
) {
const request = await this.userRequestService.createRequest(
args.collectionID,
args.title,
args.request,
ReqType.REST,
user,
);
if (E.isLeft(request)) throwErr(request.left);
return request.right;
}
@Mutation(() => UserRequest, {
description: 'Create a new user GraphQL request',
})
@UseGuards(GqlAuthGuard)
async createGQLUserRequest(
@GqlUser() user: AuthUser,
@Args() args: CreateUserRequestArgs,
) {
const request = await this.userRequestService.createRequest(
args.collectionID,
args.title,
args.request,
ReqType.GQL,
user,
);
if (E.isLeft(request)) throwErr(request.left);
return request.right;
}
@Mutation(() => UserRequest, {
description: 'Update a user REST request',
})
@UseGuards(GqlAuthGuard)
async updateRESTUserRequest(
@GqlUser() user: AuthUser,
@Args({
name: 'id',
description: 'ID of the user REST request',
type: () => ID,
})
id: string,
@Args() args: UpdateUserRequestArgs,
) {
const request = await this.userRequestService.updateRequest(
id,
args.title,
ReqType.REST,
args.request,
user,
);
if (E.isLeft(request)) throwErr(request.left);
return request.right;
}
@Mutation(() => UserRequest, {
description: 'Update a user GraphQL request',
})
@UseGuards(GqlAuthGuard)
async updateGQLUserRequest(
@GqlUser() user: AuthUser,
@Args({
name: 'id',
description: 'ID of the user GraphQL request',
type: () => ID,
})
id: string,
@Args() args: UpdateUserRequestArgs,
) {
const request = await this.userRequestService.updateRequest(
id,
args.title,
ReqType.GQL,
args.request,
user,
);
if (E.isLeft(request)) throwErr(request.left);
return request.right;
}
@Mutation(() => Boolean, {
description: 'Delete a user request',
})
@UseGuards(GqlAuthGuard)
async deleteUserRequest(
@GqlUser() user: AuthUser,
@Args({
name: 'id',
description: 'ID of the user request',
type: () => ID,
})
id: string,
): Promise<boolean> {
const isDeleted = await this.userRequestService.deleteRequest(id, user);
if (E.isLeft(isDeleted)) throwErr(isDeleted.left);
return isDeleted.right;
}
@Mutation(() => UserRequest, {
description:
'Move and re-order of a user request within same or across collection',
})
@UseGuards(GqlAuthGuard)
async moveUserRequest(
@GqlUser() user: AuthUser,
@Args() args: MoveUserRequestArgs,
): Promise<UserRequest> {
const request = await this.userRequestService.moveRequest(
args.sourceCollectionID,
args.destinationCollectionID,
args.requestID,
args.nextRequestID,
user,
);
if (E.isLeft(request)) throwErr(request.left);
return request.right;
}
/* Subscriptions */
@Subscription(() => UserRequest, {
description: 'Listen for User Request Creation',
resolve: (value) => value,
})
@UseGuards(GqlAuthGuard)
userRequestCreated(@GqlUser() user: AuthUser) {
return this.pubSub.asyncIterator(`user_request/${user.uid}/created`);
}
@Subscription(() => UserRequest, {
description: 'Listen for User Request Update',
resolve: (value) => value,
})
@UseGuards(GqlAuthGuard)
userRequestUpdated(@GqlUser() user: AuthUser) {
return this.pubSub.asyncIterator(`user_request/${user.uid}/updated`);
}
@Subscription(() => UserRequest, {
description: 'Listen for User Request Deletion',
resolve: (value) => value,
})
@UseGuards(GqlAuthGuard)
userRequestDeleted(@GqlUser() user: AuthUser) {
return this.pubSub.asyncIterator(`user_request/${user.uid}/deleted`);
}
@Subscription(() => UserRequest, {
description: 'Listen for User Request Moved',
resolve: (value) => value,
})
@UseGuards(GqlAuthGuard)
userRequestMoved(@GqlUser() user: AuthUser) {
return this.pubSub.asyncIterator(`user_request/${user.uid}/moved`);
}
}