Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(core): Transfer folder structure when deleting user (no-changelog) #13845

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
108 commits
Select commit Hold shift + click to select a range
410d0c8
firs commit create folders
RicardoE105 Feb 22, 2025
7edb3d2
Add endpoint to create folders
RicardoE105 Feb 23, 2025
e632cc5
fix typing issues
RicardoE105 Feb 23, 2025
db67264
fix import order
RicardoE105 Feb 23, 2025
bbc02f2
load folder.controller when bootstrapping the server
RicardoE105 Feb 23, 2025
3a3303d
fix test
RicardoE105 Feb 23, 2025
b1b4818
add folder creation logic to service
RicardoE105 Feb 23, 2025
72fa3f6
fix typing issues
RicardoE105 Feb 23, 2025
fa68941
add extra test to increase coverage
RicardoE105 Feb 23, 2025
92ea62c
update test
RicardoE105 Feb 23, 2025
da1a8cc
fix typing
RicardoE105 Feb 24, 2025
a2a12c4
asasas
RicardoE105 Feb 23, 2025
b8778c5
asas
RicardoE105 Feb 23, 2025
d55bba1
asas
RicardoE105 Feb 23, 2025
bfc8b4c
Add endpoint to return folder tree
RicardoE105 Feb 23, 2025
79158f7
sync master
RicardoE105 Feb 24, 2025
34abfa6
Update POST `workflows` to link folder
RicardoE105 Feb 23, 2025
7e1c077
fix imports
RicardoE105 Feb 23, 2025
6433592
Add endpoint to update folder
RicardoE105 Feb 24, 2025
019b850
remove unused import
RicardoE105 Feb 24, 2025
2790284
remove .only in tests
RicardoE105 Feb 24, 2025
6b98a7d
Update PATCH `/projects/:projectId/folders/:folderId` to support tags
RicardoE105 Feb 24, 2025
f711099
fix import order
RicardoE105 Feb 24, 2025
a187042
fix issue with test in postgres
RicardoE105 Feb 24, 2025
2869f93
sync master
RicardoE105 Feb 24, 2025
46c640a
Merge branch 'ado-3259-be-link-folder-to-workflow-when-workflow-is-sa…
RicardoE105 Feb 24, 2025
8c06cf9
Merge branch 'ado-3168-be-add-endpoint-to-rename-folder' into ado-317…
RicardoE105 Feb 24, 2025
5a086e4
fix test
RicardoE105 Feb 24, 2025
bdbd9d6
Add endpoint to update folder
RicardoE105 Feb 24, 2025
465fd37
remove unused import
RicardoE105 Feb 24, 2025
494f78a
remove .only in tests
RicardoE105 Feb 24, 2025
1b81c21
Update PATCH `/projects/:projectId/folders/:folderId` to support tags
RicardoE105 Feb 24, 2025
0a0da8d
fix import order
RicardoE105 Feb 24, 2025
9548350
delete children tables first
RicardoE105 Feb 25, 2025
327fb4a
update truncation order
RicardoE105 Feb 25, 2025
0f3bb42
update order
RicardoE105 Feb 25, 2025
d13ebd1
delete also users
RicardoE105 Feb 25, 2025
ac64e1f
small change
RicardoE105 Feb 25, 2025
8265455
asasas
RicardoE105 Feb 25, 2025
ba59ec6
add more debugging
RicardoE105 Feb 25, 2025
f8a4744
asas
RicardoE105 Feb 25, 2025
0a173c1
log data
RicardoE105 Feb 25, 2025
f167582
update message
RicardoE105 Feb 25, 2025
7a62467
more debug data
RicardoE105 Feb 25, 2025
dffa2d0
remove debugging code
RicardoE105 Feb 25, 2025
0f619b8
remove more debugging code
RicardoE105 Feb 25, 2025
c99b631
fix typing issue
RicardoE105 Feb 25, 2025
648565d
sync upstream
RicardoE105 Feb 25, 2025
8a1251c
async upstream
RicardoE105 Feb 25, 2025
2f8d17d
Merge branch 'ado-3168-be-add-endpoint-to-rename-folder' into ado-317…
RicardoE105 Feb 25, 2025
3c41f86
sync master
RicardoE105 Feb 25, 2025
781508f
Merge branch 'ado-3168-be-add-endpoint-to-rename-folder' into ado-317…
RicardoE105 Feb 25, 2025
84be195
Add endpoint to delete folders and optionally transfer content
RicardoE105 Feb 26, 2025
a0c7d7d
sync with upstream branch
RicardoE105 Feb 26, 2025
66f9910
fix linting issue
RicardoE105 Feb 26, 2025
f37e63c
sync upstream
RicardoE105 Feb 26, 2025
4b0f26d
Merge branch 'ado-3170-be-add-endpoint-to-update-folder-tags' into ad…
RicardoE105 Feb 26, 2025
50e5a6f
sync upstream branch
RicardoE105 Feb 26, 2025
c0ee7c5
fix issues during merge
RicardoE105 Feb 26, 2025
ee3015d
Merge branch 'master' into ado-3167-be-add-endpoint-to-delete-folder
RicardoE105 Feb 26, 2025
a8293e0
extract away folder id in the DTOs
RicardoE105 Feb 27, 2025
bd1c7fc
rename `moveToFolder` to `moveAllToFolder`
RicardoE105 Feb 27, 2025
c7f3834
create individual migrations for each database
RicardoE105 Feb 27, 2025
01963f3
fix schema path
RicardoE105 Feb 27, 2025
65bfeb0
Add endpoint to list folders
RicardoE105 Feb 26, 2025
de0b61b
remove unused fields
RicardoE105 Feb 26, 2025
7dbab46
fix linting issue
RicardoE105 Feb 26, 2025
3151604
Improvements
RicardoE105 Feb 26, 2025
405377d
remove unnecessary comments
RicardoE105 Feb 26, 2025
b080dea
add test to account for fix
RicardoE105 Feb 26, 2025
851d05f
add more tests
RicardoE105 Feb 27, 2025
03fb361
fix typing issues
RicardoE105 Feb 27, 2025
b33e28d
fix issues
RicardoE105 Feb 27, 2025
472d89b
update lock file
RicardoE105 Feb 27, 2025
754a8d2
fix linting issues
RicardoE105 Feb 27, 2025
d91fea2
Add `subFolderCount` to GET `/workflows` and `/folders`
RicardoE105 Feb 27, 2025
4420ab1
Merge branch 'master' into ado-3167-be-add-endpoint-to-delete-folder
RicardoE105 Feb 27, 2025
78118aa
sync upstream branch
RicardoE105 Feb 27, 2025
cc441a9
Merge branch 'ado-3270-be-add-endpoint-to-list-folders' into ado-3281…
RicardoE105 Feb 27, 2025
c054859
add back mistakenly removed line
RicardoE105 Feb 27, 2025
76f4ebb
Do not loose the original exception
RicardoE105 Feb 27, 2025
22e8ec4
remove extra //
RicardoE105 Feb 27, 2025
5ca38f0
Merge branch 'ado-3167-be-add-endpoint-to-delete-folder' into ado-327…
RicardoE105 Feb 27, 2025
32b766f
Merge branch 'ado-3270-be-add-endpoint-to-list-folders' into ado-3281…
RicardoE105 Feb 27, 2025
b267b7b
Merge branch 'master' into ado-3270-be-add-endpoint-to-list-folders
RicardoE105 Feb 27, 2025
a791de6
Merge branch 'ado-3270-be-add-endpoint-to-list-folders' into ado-3281…
RicardoE105 Feb 27, 2025
8f0cf3d
Update PATCH `/projects/:projectId/folders/:folderId` endpoint
RicardoE105 Feb 28, 2025
0044349
update tests
RicardoE105 Feb 28, 2025
647e528
improve zod validator
RicardoE105 Mar 10, 2025
4d3d368
simplify filter validator
RicardoE105 Mar 10, 2025
cb70591
remove unnecessary checks
RicardoE105 Mar 11, 2025
4d11af4
simplify select validator
RicardoE105 Mar 11, 2025
3b2e9fb
add tests for the transformations
RicardoE105 Mar 11, 2025
825c3fa
Merge branch 'master' into ado-3270-be-add-endpoint-to-list-folders
RicardoE105 Mar 11, 2025
8e64cde
Merge branch 'ado-3270-be-add-endpoint-to-list-folders' into ado-3281…
RicardoE105 Mar 11, 2025
5c922b5
Merge branch 'ado-3281-be-update-endpoint-that-return-workflows-and-f…
RicardoE105 Mar 11, 2025
d786216
Transfer folder structure when deleting a project
RicardoE105 Mar 11, 2025
a717edc
feat(core): Transfer folder structure when deleting user
RicardoE105 Mar 11, 2025
20cf06a
fix linting issue
RicardoE105 Mar 11, 2025
54cd082
fix import path
RicardoE105 Mar 11, 2025
0dfa154
Merge branch 'ado-3166-be-add-endpoint-to-move-folders' into ado-3277…
RicardoE105 Mar 11, 2025
f6509a7
Merge branch 'ado-3277-be-deleting-projects-and-transfering-should-ac…
RicardoE105 Mar 11, 2025
7eab311
fix linting issue
RicardoE105 Mar 11, 2025
15295ac
Merge branch 'ado-3277-be-deleting-projects-and-transfering-should-ac…
RicardoE105 Mar 11, 2025
21d6e3b
fix linting issue
RicardoE105 Mar 11, 2025
c8cc007
Merge branch 'ado-3166-be-add-endpoint-to-move-folders' into ado-3277…
RicardoE105 Mar 11, 2025
fffb253
Merge branch 'ado-3277-be-deleting-projects-and-transfering-should-ac…
RicardoE105 Mar 11, 2025
c4c7441
sync master
RicardoE105 Mar 12, 2025
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
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ describe('UsersController', () => {
mock(),
projectService,
eventService,
mock(),
);

beforeEach(() => {
Expand Down
8 changes: 8 additions & 0 deletions packages/cli/src/controllers/users.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import { ExternalHooks } from '@/external-hooks';
import type { PublicUser } from '@/interfaces';
import { listQueryMiddleware } from '@/middlewares';
import { AuthenticatedRequest, ListQuery, UserRequest } from '@/requests';
import { FolderService } from '@/services/folder.service';
import { ProjectService } from '@/services/project.service.ee';
import { UserService } from '@/services/user.service';
import { WorkflowService } from '@/workflows/workflow.service';
Expand All @@ -48,6 +49,7 @@ export class UsersController {
private readonly credentialsService: CredentialsService,
private readonly projectService: ProjectService,
private readonly eventService: EventService,
private readonly folderService: FolderService,
) {}

static ERROR_MESSAGES = {
Expand Down Expand Up @@ -215,6 +217,12 @@ export class UsersController {
transfereePersonalProject.id,
trx,
);

await this.folderService.transferAllFoldersToProject(
personalProjectToDelete.id,
transfereePersonalProject.id,
trx,
);
});

await this.projectService.clearCredentialCanUseExternalSecretsCache(
Expand Down
17 changes: 17 additions & 0 deletions packages/cli/src/databases/repositories/folder.repository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -276,4 +276,21 @@ export class FolderRepository extends Repository<FolderWithWorkflowAndSubFolderC
},
);
}

async transferAllFoldersToProject(
fromProjectId: string,
toProjectId: string,
tx?: EntityManager,
) {
const manager = tx ?? this.manager;
return await manager.update(
Folder,
{
homeProject: { id: fromProjectId },
},
{
homeProject: { id: toProjectId },
},
);
}
}
15 changes: 6 additions & 9 deletions packages/cli/src/services/folder.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -148,15 +148,12 @@ export class FolderService {
});
}

async transferFoldersToProject(fromProjectId: string, toProjectId: string) {
return await this.folderRepository.update(
{
homeProject: { id: fromProjectId },
},
{
homeProject: { id: toProjectId },
},
);
async transferAllFoldersToProject(
fromProjectId: string,
toProjectId: string,
tx?: EntityManager,
) {
return await this.folderRepository.transferAllFoldersToProject(fromProjectId, toProjectId, tx);
}

private transformFolderPathToTree(flatPath: FolderPathRow[]): SimpleFolderNode[] {
Expand Down
2 changes: 1 addition & 1 deletion packages/cli/src/services/project.service.ee.ts
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ export class ProjectService {
// 3. Move folders over to the target project, before deleting the project else cascading will delete workflows
if (targetProject) {
const folderService = await this.folderService;
await folderService.transferFoldersToProject(project.id, targetProject.id);
await folderService.transferAllFoldersToProject(project.id, targetProject.id);
}

// 4. delete shared credentials into this project
Expand Down
27 changes: 27 additions & 0 deletions packages/cli/test/integration/users.api.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { v4 as uuid } from 'uuid';
import { RESPONSE_ERROR_MESSAGES } from '@/constants';
import { UsersController } from '@/controllers/users.controller';
import type { User } from '@/databases/entities/user';
import { FolderRepository } from '@/databases/repositories/folder.repository';
import { ProjectRelationRepository } from '@/databases/repositories/project-relation.repository';
import { ProjectRepository } from '@/databases/repositories/project.repository';
import { SharedCredentialsRepository } from '@/databases/repositories/shared-credentials.repository';
Expand All @@ -12,6 +13,7 @@ import { UserRepository } from '@/databases/repositories/user.repository';
import { ExecutionService } from '@/executions/execution.service';
import { CacheService } from '@/services/cache/cache.service';
import { Telemetry } from '@/telemetry';
import { createFolder } from '@test-integration/db/folders';

import { SUCCESS_RESPONSE_BODY } from './shared/constants';
import {
Expand Down Expand Up @@ -458,6 +460,13 @@ describe('DELETE /users/:id', () => {
getPersonalProject(transferee),
]);

await Promise.all([
createFolder(memberPersonalProject, { name: 'folder1' }),
createFolder(memberPersonalProject, { name: 'folder2' }),
createFolder(transfereePersonalProject, { name: 'folder3' }),
createFolder(transfereePersonalProject, { name: 'folder1' }),
]);

const deleteSpy = jest.spyOn(Container.get(CacheService), 'deleteMany');

//
Expand Down Expand Up @@ -485,6 +494,7 @@ describe('DELETE /users/:id', () => {
const projectRelationRepository = Container.get(ProjectRelationRepository);
const sharedWorkflowRepository = Container.get(SharedWorkflowRepository);
const sharedCredentialsRepository = Container.get(SharedCredentialsRepository);
const folderRepository = Container.get(FolderRepository);

await Promise.all([
// user, their personal project and their relationship to the team project is gone
Expand Down Expand Up @@ -574,6 +584,23 @@ describe('DELETE /users/:id', () => {
}),
).resolves.not.toBeNull(),
]);

// Assert that the folders have been transferred

const transfereeFolders = await folderRepository.findBy({
homeProject: { id: transfereePersonalProject.id },
});

const deletedUserFolders = await folderRepository.findBy({
homeProject: { id: memberPersonalProject.id },
});

expect(transfereeFolders).toHaveLength(4);
expect(transfereeFolders.map((folder) => folder.name)).toEqual(
expect.arrayContaining(['folder1', 'folder2', 'folder3', 'folder1']),
);

expect(deletedUserFolders).toHaveLength(0);
});

test('should fail to delete self', async () => {
Expand Down
Loading