* 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
267 lines
6.8 KiB
TypeScript
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`);
|
|
}
|
|
}
|