73 lines
1.9 KiB
TypeScript
73 lines
1.9 KiB
TypeScript
import {
|
|
CanActivate,
|
|
ExecutionContext,
|
|
HttpException,
|
|
HttpStatus,
|
|
Injectable,
|
|
} from '@nestjs/common';
|
|
import { GqlExecutionContext } from '@nestjs/graphql';
|
|
|
|
import { PrismaService } from 'src/database/prisma.service';
|
|
|
|
@Injectable()
|
|
export class CreateOneCommentGuard implements CanActivate {
|
|
constructor(private prismaService: PrismaService) {}
|
|
|
|
async canActivate(context: ExecutionContext): Promise<boolean> {
|
|
const gqlContext = GqlExecutionContext.create(context);
|
|
const request = gqlContext.getContext().req;
|
|
const args = gqlContext.getArgs();
|
|
|
|
const authorId = args.data?.author?.connect?.id;
|
|
const commentThreadId = args.data?.commentThread?.connect?.id;
|
|
|
|
if (!authorId || !commentThreadId) {
|
|
throw new HttpException(
|
|
{ reason: 'Missing author or commentThread' },
|
|
HttpStatus.BAD_REQUEST,
|
|
);
|
|
}
|
|
|
|
const author = await this.prismaService.user.findUnique({
|
|
where: { id: authorId },
|
|
});
|
|
|
|
const commentThread = await this.prismaService.commentThread.findUnique({
|
|
where: { id: commentThreadId },
|
|
});
|
|
|
|
if (!author || !commentThread) {
|
|
throw new HttpException(
|
|
{ reason: 'Author or commentThread not found' },
|
|
HttpStatus.NOT_FOUND,
|
|
);
|
|
}
|
|
|
|
const userWorkspaceMember =
|
|
await this.prismaService.workspaceMember.findFirst({
|
|
where: { userId: author.id },
|
|
});
|
|
|
|
if (!userWorkspaceMember) {
|
|
throw new HttpException(
|
|
{ reason: 'Author or commentThread not found' },
|
|
HttpStatus.NOT_FOUND,
|
|
);
|
|
}
|
|
|
|
const workspace = request.user.workspace;
|
|
|
|
if (
|
|
userWorkspaceMember.workspaceId !== workspace.id ||
|
|
commentThread.workspaceId !== workspace.id
|
|
) {
|
|
throw new HttpException(
|
|
{ reason: 'Author or commentThread not found' },
|
|
HttpStatus.NOT_FOUND,
|
|
);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
}
|