Upload Workspace logo during onboarding (#542)

* Upload image

* Upload image

* Fix tests

* Remove pictures from seeds

* Fix storybook

* Fix storybook

* Fix storybook
This commit is contained in:
Charles Bochet
2023-07-08 16:46:04 -07:00
committed by GitHub
parent e03d5ed8a7
commit be7731b71a
22 changed files with 226 additions and 41 deletions

View File

@ -4,7 +4,6 @@ import { KebabCase } from 'type-fest';
import { BadRequestException } from '@nestjs/common';
import { basename } from 'path';
import { settings } from 'src/constants/settings';
import { camelCase } from 'src/utils/camel-case';
type AllowedFolders = KebabCase<keyof typeof FileFolder>;
@ -20,10 +19,7 @@ export function checkFilePath(filePath: string): string {
throw new BadRequestException(`Folder ${folder} is not allowed`);
}
if (
size &&
!settings.storage.imageCropSizes[camelCase(folder)]?.includes(size)
) {
if (size && !settings.storage.imageCropSizes[folder]?.includes(size)) {
throw new BadRequestException(`Size ${size} is not allowed`);
}

View File

@ -1,7 +1,8 @@
import { registerEnumType } from '@nestjs/graphql';
export enum FileFolder {
ProfilePicture = 'profilePicture',
ProfilePicture = 'profile-picture',
WorkspaceLogo = 'workspace-logo',
}
registerEnumType(FileFolder, {

View File

@ -91,7 +91,7 @@ export class FileUploadService {
images.map(async (image, index) => {
const buffer = await image.toBuffer();
paths.push(`profile-picture/${cropSizes[index]}/${name}`);
paths.push(`${fileFolder}/${cropSizes[index]}/${name}`);
return this.uploadFile({
file: buffer,

View File

@ -1,8 +1,10 @@
import { Test, TestingModule } from '@nestjs/testing';
import { WorkspaceResolver } from './workspace.resolver';
import { WorkspaceService } from '../services/workspace.service';
import { FileUploadService } from 'src/core/file/services/file-upload.service';
import { AbilityFactory } from 'src/ability/ability.factory';
describe('WorkspaceMemberResolver', () => {
describe('WorkspaceResolver', () => {
let resolver: WorkspaceResolver;
beforeEach(async () => {
@ -10,6 +12,8 @@ describe('WorkspaceMemberResolver', () => {
providers: [
WorkspaceResolver,
{ provide: WorkspaceService, useValue: {} },
{ provide: AbilityFactory, useValue: {} },
{ provide: FileUploadService, useValue: {} },
],
}).compile();

View File

@ -11,13 +11,25 @@ import { WorkspaceUpdateInput } from 'src/core/@generated/workspace/workspace-up
import { JwtAuthGuard } from 'src/guards/jwt.auth.guard';
import { Prisma } from '@prisma/client';
import { assert } from 'src/utils/assert';
import { FileUploadService } from 'src/core/file/services/file-upload.service';
import { FileUpload, GraphQLUpload } from 'graphql-upload';
import { streamToBuffer } from 'src/utils/stream-to-buffer';
import { FileFolder } from 'src/core/file/interfaces/file-folder.interface';
import { AbilityGuard } from 'src/guards/ability.guard';
import { CheckAbilities } from 'src/decorators/check-abilities.decorator';
import { UpdateWorkspaceAbilityHandler } from 'src/ability/handlers/workspace.ability-handler';
@UseGuards(JwtAuthGuard)
@Resolver(() => Workspace)
export class WorkspaceResolver {
constructor(private readonly workspaceService: WorkspaceService) {}
constructor(
private readonly workspaceService: WorkspaceService,
private readonly fileUploadService: FileUploadService,
) {}
@Mutation(() => Workspace)
@UseGuards(AbilityGuard)
@CheckAbilities(UpdateWorkspaceAbilityHandler)
async updateWorkspace(
@Args('data') data: WorkspaceUpdateInput,
@AuthWorkspace() workspace: Workspace,
@ -51,4 +63,33 @@ export class WorkspaceResolver {
return selectedWorkspace;
}
@UseGuards(AbilityGuard)
@CheckAbilities(UpdateWorkspaceAbilityHandler)
@Mutation(() => String)
async uploadWorkspaceLogo(
@AuthWorkspace() workspace: Workspace,
@Args({ name: 'file', type: () => GraphQLUpload })
{ createReadStream, filename, mimetype }: FileUpload,
): Promise<string> {
const stream = createReadStream();
const buffer = await streamToBuffer(stream);
const fileFolder = FileFolder.WorkspaceLogo;
const { paths } = await this.fileUploadService.uploadImage({
file: buffer,
filename,
mimeType: mimetype,
fileFolder,
});
await this.workspaceService.update({
where: { id: workspace.id },
data: {
logo: paths[0],
},
});
return paths[0];
}
}

View File

@ -3,10 +3,12 @@ import { WorkspaceService } from './services/workspace.service';
import { WorkspaceMemberService } from './services/workspace-member.service';
import { WorkspaceMemberResolver } from './resolvers/workspace-member.resolver';
import { WorkspaceResolver } from './resolvers/workspace.resolver';
import { FileUploadService } from '../file/services/file-upload.service';
@Module({
providers: [
WorkspaceService,
FileUploadService,
WorkspaceMemberService,
WorkspaceMemberResolver,
WorkspaceResolver,