Fix missing encoding in workspace-logo, members, person (#6510)

This commit is contained in:
Weiko
2024-08-02 15:18:48 +02:00
committed by GitHub
parent 0c036efcc4
commit 5870979bfa
13 changed files with 176 additions and 70 deletions

View File

@ -1,15 +1,15 @@
import { Module } from '@nestjs/common';
import { forwardRef, Module } from '@nestjs/common';
import { EnvironmentService } from 'src/engine/integrations/environment/environment.service';
import { FilePathGuard } from 'src/engine/core-modules/file/guards/file-path-guard';
import { AuthModule } from 'src/engine/core-modules/auth/auth.module';
import { FileUploadModule } from 'src/engine/core-modules/file/file-upload/file-upload.module';
import { FilePathGuard } from 'src/engine/core-modules/file/guards/file-path-guard';
import { EnvironmentService } from 'src/engine/integrations/environment/environment.service';
import { FileService } from './services/file.service';
import { FileController } from './controllers/file.controller';
import { FileService } from './services/file.service';
@Module({
imports: [FileUploadModule, AuthModule],
imports: [FileUploadModule, forwardRef(() => AuthModule)],
providers: [FileService, EnvironmentService, FilePathGuard],
exports: [FileService],
controllers: [FileController],

View File

@ -1,5 +1,6 @@
import { Test, TestingModule } from '@nestjs/testing';
import { TokenService } from 'src/engine/core-modules/auth/services/token.service';
import { EnvironmentService } from 'src/engine/integrations/environment/environment.service';
import { FileStorageService } from 'src/engine/integrations/file-storage/file-storage.service';
@ -20,6 +21,10 @@ describe('FileService', () => {
provide: EnvironmentService,
useValue: {},
},
{
provide: TokenService,
useValue: {},
},
],
}).compile();

View File

@ -2,16 +2,25 @@ import { Injectable } from '@nestjs/common';
import { Stream } from 'stream';
import { addMilliseconds } from 'date-fns';
import ms from 'ms';
import {
FileStorageException,
FileStorageExceptionCode,
} from 'src/engine/integrations/file-storage/interfaces/file-storage-exception';
import { TokenService } from 'src/engine/core-modules/auth/services/token.service';
import { EnvironmentService } from 'src/engine/integrations/environment/environment.service';
import { FileStorageService } from 'src/engine/integrations/file-storage/file-storage.service';
@Injectable()
export class FileService {
constructor(private readonly fileStorageService: FileStorageService) {}
constructor(
private readonly fileStorageService: FileStorageService,
private readonly environmentService: EnvironmentService,
private readonly tokenService: TokenService,
) {}
async getFileStream(
folderPath: string,
@ -39,4 +48,25 @@ export class FileService {
throw error;
}
}
async encodeFileToken(payloadToEncode: Record<string, any>) {
const fileTokenExpiresIn = this.environmentService.get(
'FILE_TOKEN_EXPIRES_IN',
);
const secret = this.environmentService.get('FILE_TOKEN_SECRET');
const expirationDate = addMilliseconds(new Date(), ms(fileTokenExpiresIn));
const signedPayload = await this.tokenService.encodePayload(
{
expiration_date: expirationDate,
...payloadToEncode,
},
{
secret,
},
);
return signedPayload;
}
}

View File

@ -8,6 +8,7 @@ import { NestjsQueryTypeOrmModule } from '@ptc-org/nestjs-query-typeorm';
import { TypeORMModule } from 'src/database/typeorm/typeorm.module';
import { TypeORMService } from 'src/database/typeorm/typeorm.service';
import { FileUploadModule } from 'src/engine/core-modules/file/file-upload/file-upload.module';
import { FileModule } from 'src/engine/core-modules/file/file.module';
import { KeyValuePair } from 'src/engine/core-modules/key-value-pair/key-value-pair.entity';
import { OnboardingModule } from 'src/engine/core-modules/onboarding/onboarding.module';
import { UserVarsModule } from 'src/engine/core-modules/user/user-vars/user-vars.module';
@ -26,6 +27,7 @@ import { UserService } from './services/user.service';
imports: [
NestjsQueryTypeOrmModule.forFeature([User], 'core'),
TypeORMModule,
FileModule,
],
resolvers: userAutoResolverOpts,
}),

View File

@ -20,6 +20,7 @@ import { FileFolder } from 'src/engine/core-modules/file/interfaces/file-folder.
import { SupportDriver } from 'src/engine/integrations/environment/interfaces/support.interface';
import { FileUploadService } from 'src/engine/core-modules/file/file-upload/services/file-upload.service';
import { FileService } from 'src/engine/core-modules/file/services/file.service';
import { OnboardingStatus } from 'src/engine/core-modules/onboarding/enums/onboarding-status.enum';
import { OnboardingService } from 'src/engine/core-modules/onboarding/onboarding.service';
import { WorkspaceMember } from 'src/engine/core-modules/user/dtos/workspace-member.dto';
@ -55,6 +56,7 @@ export class UserResolver {
private readonly onboardingService: OnboardingService,
private readonly loadServiceWithWorkspaceContext: LoadServiceWithWorkspaceContext,
private readonly userVarService: UserVarsService,
private readonly fileService: FileService,
) {}
@Query(() => User)
@ -68,6 +70,20 @@ export class UserResolver {
assert(user, 'User not found');
user.workspaces = await Promise.all(
user.workspaces.map(async (userWorkspace) => {
if (userWorkspace.workspace.logo) {
const workspaceLogoToken = await this.fileService.encodeFileToken({
workspace_id: userWorkspace.workspace.id,
});
userWorkspace.workspace.logo = `${userWorkspace.workspace.logo}?token=${workspaceLogoToken}`;
}
return userWorkspace;
}),
);
return user;
}
@ -99,7 +115,18 @@ export class UserResolver {
async workspaceMember(
@Parent() user: User,
): Promise<WorkspaceMember | undefined> {
return this.userService.loadWorkspaceMember(user);
const workspaceMember = await this.userService.loadWorkspaceMember(user);
if (workspaceMember && workspaceMember.avatarUrl) {
const avatarUrlToken = await this.fileService.encodeFileToken({
workspace_member_id: workspaceMember.id,
workspace_id: user.defaultWorkspace.id,
});
workspaceMember.avatarUrl = `${workspaceMember.avatarUrl}?token=${avatarUrlToken}`;
}
return workspaceMember;
}
@ResolveField(() => String, {