* Added comments and authors on drawer with proper resolving * Fixed generated front graphql from rebase * Fixed comment chip * wip * wip 2 * - Added string typing for DateTime scalar - Refactored user in a recoil state and workspace using it - Added comment creation * Put theme and user state in generic providers * Fix from rebase * Fixed app theme provider removed from storybook * Wip * Fix graphql front * Fixed backend bug * - Added comment fetching in creation mode - Fixed drawer overflows and heights * - Fixed autosize validation button CSS bug * Fixed CSS bug with drawer changing height if overflow * Fixed text input too many event catched and useless error message * Removed console.log * Fixed comment cell chip * Create comment thread on each comment action bar click * Fixed lint * Fixed TopBar height
106 lines
2.8 KiB
TypeScript
106 lines
2.8 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 CreateOneCommentThreadGuard implements CanActivate {
|
|
constructor(private prismaService: PrismaService) {}
|
|
|
|
async canActivate(context: ExecutionContext): Promise<boolean> {
|
|
const gqlContext = GqlExecutionContext.create(context);
|
|
// TODO: type request
|
|
const request = gqlContext.getContext().req;
|
|
const args = gqlContext.getArgs();
|
|
|
|
const targets = args.data?.commentThreadTargets?.createMany?.data;
|
|
const comments = args.data?.comments?.createMany?.data;
|
|
const workspace = await request.workspace;
|
|
|
|
if (!targets || targets.length === 0) {
|
|
throw new HttpException(
|
|
{ reason: 'Missing commentThreadTargets' },
|
|
HttpStatus.BAD_REQUEST,
|
|
);
|
|
}
|
|
|
|
await targets.map(async (target) => {
|
|
if (!target.commentableId || !target.commentableType) {
|
|
throw new HttpException(
|
|
{
|
|
reason:
|
|
'Missing commentThreadTarget.commentableId or commentThreadTarget.commentableType',
|
|
},
|
|
HttpStatus.BAD_REQUEST,
|
|
);
|
|
}
|
|
|
|
if (!['Person', 'Company'].includes(target.commentableType)) {
|
|
throw new HttpException(
|
|
{ reason: 'Invalid commentThreadTarget.commentableType' },
|
|
HttpStatus.BAD_REQUEST,
|
|
);
|
|
}
|
|
|
|
const targetEntity = await this.prismaService[
|
|
target.commentableType
|
|
].findUnique({
|
|
where: { id: target.commentableId },
|
|
});
|
|
|
|
if (!targetEntity || targetEntity.workspaceId !== workspace.id) {
|
|
throw new HttpException(
|
|
{ reason: 'CommentThreadTarget not found' },
|
|
HttpStatus.NOT_FOUND,
|
|
);
|
|
}
|
|
});
|
|
|
|
if (!comments) {
|
|
return true;
|
|
}
|
|
|
|
await comments.map(async (comment) => {
|
|
if (!comment.authorId) {
|
|
throw new HttpException(
|
|
{ reason: 'Missing comment.authorId' },
|
|
HttpStatus.BAD_REQUEST,
|
|
);
|
|
}
|
|
|
|
const author = await this.prismaService.user.findUnique({
|
|
where: { id: comment.authorId },
|
|
});
|
|
|
|
if (!author) {
|
|
throw new HttpException(
|
|
{ reason: 'Comment.authorId not found' },
|
|
HttpStatus.NOT_FOUND,
|
|
);
|
|
}
|
|
|
|
const userWorkspaceMember =
|
|
await this.prismaService.workspaceMember.findFirst({
|
|
where: { userId: author.id },
|
|
});
|
|
|
|
if (
|
|
!userWorkspaceMember ||
|
|
userWorkspaceMember.workspaceId !== workspace.id
|
|
) {
|
|
throw new HttpException(
|
|
{ reason: 'userWorkspaceMember.workspaceId not found' },
|
|
HttpStatus.NOT_FOUND,
|
|
);
|
|
}
|
|
});
|
|
|
|
return true;
|
|
}
|
|
}
|