Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions src/modules/folder/folder.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,14 @@ import { FileModule } from '../file/file.module';
import { CryptoModule } from '../../externals/crypto/crypto.module';
import { CryptoService } from '../../externals/crypto/crypto.service';
import { FolderController } from './folder.controller';
import { UserModel } from '../user/user.model';
import { UserModule } from '../user/user.module';
import { SharingModule } from '../sharing/sharing.module';
import { WorkspacesModule } from '../workspaces/workspaces.module';
import { NotificationModule } from '../../externals/notifications/notifications.module';

@Module({
imports: [
SequelizeModule.forFeature([FolderModel, UserModel]),
SequelizeModule.forFeature([FolderModel]),
forwardRef(() => FileModule),
forwardRef(() => UserModule),
CryptoModule,
Expand Down
6 changes: 0 additions & 6 deletions src/modules/user/user.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,10 @@ import { ShareModule } from '../share/share.module';
import { KeyServerModel } from '../keyserver/key-server.model';
import { AvatarService } from '../../externals/avatar/avatar.service';
import { AppSumoModule } from '../app-sumo/app-sumo.module';
import { AppSumoUseCase } from '../app-sumo/app-sumo.usecase';
import { PlanModule } from '../plan/plan.module';
import { SequelizePreCreatedUsersRepository } from './pre-created-users.repository';
import { PreCreatedUserModel } from './pre-created-users.model';
import { SharingModule } from '../sharing/sharing.module';
import { SharingService } from '../sharing/sharing.service';
import { SequelizeAttemptChangeEmailRepository } from './attempt-change-email.repository';
import { AttemptChangeEmailModel } from './attempt-change-email.model';
import { MailerService } from '../../externals/mailer/mailer.service';
Expand Down Expand Up @@ -98,10 +96,6 @@ import { AsymmetricEncryptionModule } from '../../externals/asymmetric-encryptio
PaymentsService,
NewsletterService,
AvatarService,
BridgeService,
PaymentsService,
AppSumoUseCase,
SharingService,
MailerService,
],
exports: [
Expand Down
22 changes: 22 additions & 0 deletions src/modules/user/user.usecase.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ import { SequelizeSharingRepository } from '../sharing/sharing.repository';
import { SequelizePreCreatedUsersRepository } from './pre-created-users.repository';
import { SharingInvite } from '../sharing/sharing.domain';
import { aes } from '@internxt/lib';
import { WorkspacesUsecases } from '../workspaces/workspaces.usecase';

jest.mock('../../middlewares/passport', () => {
const originalModule = jest.requireActual('../../middlewares/passport');
Expand Down Expand Up @@ -113,6 +114,7 @@ describe('User use cases', () => {
let sharingRepository: SequelizeSharingRepository;
let preCreatedUsersRepository: SequelizePreCreatedUsersRepository;
let asymmetricEncryptionService: AsymmetricEncryptionService;
let workspaceUseCases: WorkspacesUsecases;

const user = User.build({
id: 1,
Expand Down Expand Up @@ -207,6 +209,7 @@ describe('User use cases', () => {
asymmetricEncryptionService = moduleRef.get<AsymmetricEncryptionService>(
AsymmetricEncryptionService,
);
workspaceUseCases = moduleRef.get<WorkspacesUsecases>(WorkspacesUsecases);
});

describe('Resetting a user', () => {
Expand All @@ -219,6 +222,7 @@ describe('User use cases', () => {
deleteFiles: false,
deleteFolders: false,
deleteShares: false,
deleteWorkspaces: false,
});

expect(deleteSharesSpy).not.toBeCalled();
Expand All @@ -236,13 +240,27 @@ describe('User use cases', () => {
deleteFiles: false,
deleteFolders: false,
deleteShares: true,
deleteWorkspaces: false,
});

expect(deleteSharesSpy).toBeCalledWith(user);
expect(deleteFoldersSpy).not.toBeCalled();
expect(deleteFilesSpy).not.toBeCalled();
});

it('When delete workspaces is true, then user owned workspaces are reset and user is removed from invited workspaces', async () => {
await userUseCases.resetUser(user, {
deleteFiles: false,
deleteFolders: false,
deleteShares: false,
deleteWorkspaces: true,
});

expect(
workspaceUseCases.removeUserFromNonOwnedWorkspaces,
).toHaveBeenCalled();
});

describe('When resources do not exist', () => {
it('When delete folders is true, then the folders are deleted', async () => {
const deleteSharesSpy = jest.spyOn(shareUseCases, 'deleteByUser');
Expand All @@ -256,6 +274,7 @@ describe('User use cases', () => {
deleteFiles: false,
deleteFolders: true,
deleteShares: false,
deleteWorkspaces: false,
});

expect(getFoldersSpy).toBeCalledWith(
Expand Down Expand Up @@ -283,6 +302,7 @@ describe('User use cases', () => {
deleteFiles: true,
deleteFolders: false,
deleteShares: false,
deleteWorkspaces: false,
});

expect(getFilesSpy).toBeCalledWith(
Expand Down Expand Up @@ -312,6 +332,7 @@ describe('User use cases', () => {
deleteFiles: false,
deleteFolders: true,
deleteShares: false,
deleteWorkspaces: false,
});

expect(getFoldersSpy).toBeCalledWith(
Expand Down Expand Up @@ -339,6 +360,7 @@ describe('User use cases', () => {
deleteFiles: true,
deleteFolders: false,
deleteShares: false,
deleteWorkspaces: false,
});

expect(getFilesSpy).toBeCalledWith(
Expand Down
12 changes: 12 additions & 0 deletions src/modules/user/user.usecase.ts
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ import { CacheManagerService } from '../cache-manager/cache-manager.service';
import { RefreshTokenResponseDto } from './dto/responses/refresh-token.dto';
import { SharingInvite } from '../sharing/sharing.domain';
import { AsymmetricEncryptionService } from '../../externals/asymmetric-encryption/asymmetric-encryption.service';
import { WorkspacesUsecases } from '../workspaces/workspaces.usecase';

export class ReferralsNotAvailableError extends Error {
constructor() {
Expand Down Expand Up @@ -163,6 +164,8 @@ export class UserUseCases {
private readonly backupUseCases: BackupUseCase,
private readonly cacheManager: CacheManagerService,
private readonly asymmetricEncryptionService: AsymmetricEncryptionService,
@Inject(forwardRef(() => WorkspacesUsecases))
private readonly workspaceUseCases: WorkspacesUsecases,
) {}

findByEmail(email: User['email']): Promise<User | null> {
Expand Down Expand Up @@ -968,6 +971,7 @@ export class UserUseCases {
deleteFiles: true,
deleteFolders: true,
deleteShares: true,
deleteWorkspaces: true,
});
}

Expand All @@ -982,10 +986,14 @@ export class UserUseCases {
deleteFiles: boolean;
deleteFolders: boolean;
deleteShares: boolean;
deleteWorkspaces: boolean;
},
): Promise<void> {
if (options.deleteShares) {
await this.shareUseCases.deleteByUser(user);
await this.sharingRepository.deleteSharingsBy({ sharedWith: user.uuid });
await this.sharingRepository.deleteSharingsBy({ ownerId: user.uuid });
await this.sharingRepository.deleteInvitesBy({ sharedWith: user.uuid });
}

if (options.deleteFolders) {
Expand Down Expand Up @@ -1031,6 +1039,10 @@ export class UserUseCases {
done = files.length < limit || files.length === 0;
} while (!done);
}

if (options.deleteWorkspaces) {
await this.workspaceUseCases.removeUserFromNonOwnedWorkspaces(user);
}
}

async updatePassword(
Expand Down
6 changes: 6 additions & 0 deletions src/modules/workspaces/workspaces.usecase.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ import {
BadRequestException,
ConflictException,
ForbiddenException,
forwardRef,
Inject,
Injectable,
InternalServerErrorException,
Logger,
Expand Down Expand Up @@ -81,14 +83,18 @@ export class WorkspacesUsecases {
constructor(
private readonly teamRepository: SequelizeWorkspaceTeamRepository,
private readonly workspaceRepository: SequelizeWorkspaceRepository,
@Inject(forwardRef(() => SharingService))
private readonly sharingUseCases: SharingService,
private readonly paymentService: PaymentsService,
private readonly networkService: BridgeService,
private readonly userRepository: SequelizeUserRepository,
@Inject(forwardRef(() => UserUseCases))
private readonly userUsecases: UserUseCases,
private readonly configService: ConfigService,
private readonly mailerService: MailerService,
@Inject(forwardRef(() => FileUseCases))
private readonly fileUseCases: FileUseCases,
@Inject(forwardRef(() => FolderUseCases))
private readonly folderUseCases: FolderUseCases,
private readonly avatarService: AvatarService,
private readonly fuzzySearchUseCases: FuzzySearchUseCases,
Expand Down
Loading