Files
twenty/server/src/core/attachment/resolvers/attachment.resolver.ts
2023-07-19 14:01:32 +02:00

69 lines
2.3 KiB
TypeScript

import { Resolver, Args, Mutation } from '@nestjs/graphql';
import { UseGuards } from '@nestjs/common';
import { User, Workspace } from '@prisma/client';
import { GraphQLUpload, FileUpload } from 'graphql-upload';
import { v4 as uuidV4 } from 'uuid';
import { FileFolder } from 'src/core/file/interfaces/file-folder.interface';
import { AuthUser } from 'src/decorators/auth-user.decorator';
import { AuthWorkspace } from 'src/decorators/auth-workspace.decorator';
import { streamToBuffer } from 'src/utils/stream-to-buffer';
import { AttachmentService } from 'src/core/attachment/services/attachment.service';
import { FileUploadService } from 'src/core/file/services/file-upload.service';
import { JwtAuthGuard } from 'src/guards/jwt.auth.guard';
import { Attachment } from 'src/core/@generated/attachment/attachment.model';
import { AbilityGuard } from 'src/guards/ability.guard';
import { CreateAttachmentAbilityHandler } from 'src/ability/handlers/attachment.ability-handler';
import { CheckAbilities } from 'src/decorators/check-abilities.decorator';
@UseGuards(JwtAuthGuard)
@Resolver(() => Attachment)
@Resolver()
export class AttachmentResolver {
constructor(
private readonly fileUploadService: FileUploadService,
private readonly attachmentService: AttachmentService,
) {}
@UseGuards(AbilityGuard)
@CheckAbilities(CreateAttachmentAbilityHandler)
@Mutation(() => String)
async uploadAttachment(
@AuthUser() user: User,
@AuthWorkspace() workspace: Workspace,
@Args('activityId') activityId: string,
@Args({ name: 'file', type: () => GraphQLUpload })
{ createReadStream, filename, mimetype }: FileUpload,
): Promise<string> {
const stream = createReadStream();
const buffer = await streamToBuffer(stream);
const { path } = await this.fileUploadService.uploadFile({
file: buffer,
filename,
mimeType: mimetype,
fileFolder: FileFolder.Attachment,
});
await this.attachmentService.create({
data: {
id: uuidV4(),
fullPath: path,
type: this.attachmentService.getFileTypeFromFileName(filename),
name: filename,
activityId: activityId,
authorId: user.id,
workspaceId: workspace.id,
},
select: {
id: true,
fullPath: true,
},
});
return path;
}
}