diff --git a/packages/backend/src/controllers/api/v1/folders/delete-folder.js b/packages/backend/src/controllers/api/v1/folders/delete-folder.js index 973a8ef2..11225234 100644 --- a/packages/backend/src/controllers/api/v1/folders/delete-folder.js +++ b/packages/backend/src/controllers/api/v1/folders/delete-folder.js @@ -4,7 +4,7 @@ export default async (request, response) => { .findById(request.params.folderId) .throwIfNotFound(); - await folder.$query().delete(); + await folder.delete(); response.status(204).end(); }; diff --git a/packages/backend/src/models/folder.js b/packages/backend/src/models/folder.js index 96eec5ef..a59c0525 100644 --- a/packages/backend/src/models/folder.js +++ b/packages/backend/src/models/folder.js @@ -1,5 +1,6 @@ import Base from './base.js'; import User from './user.js'; +import Flow from './flow.js'; class Folder extends Base { static tableName = 'folders'; @@ -24,7 +25,20 @@ class Folder extends Base { to: 'users.id', }, }, + flows: { + relation: Base.HasManyRelation, + modelClass: Flow, + join: { + from: 'folders.id', + to: 'flows.folder_id', + }, + }, }); + + async delete() { + await this.$relatedQuery('flows').patch({ folderId: null }); + await this.$query().delete(); + } } export default Folder; diff --git a/packages/backend/src/models/folder.test.js b/packages/backend/src/models/folder.test.js index 3fada770..ca983f78 100644 --- a/packages/backend/src/models/folder.test.js +++ b/packages/backend/src/models/folder.test.js @@ -1,7 +1,11 @@ import { describe, it, expect } from 'vitest'; import Folder from './folder'; import User from './user'; +import Flow from './flow'; import Base from './base'; +import { createFolder } from '../../test/factories/folder'; +import { createFlow } from '../../test/factories/flow'; +import { createUser } from '../../test/factories/user'; describe('Folder model', () => { it('tableName should return correct name', () => { @@ -24,8 +28,40 @@ describe('Folder model', () => { to: 'users.id', }, }, + flows: { + relation: Base.HasManyRelation, + modelClass: Flow, + join: { + from: 'folders.id', + to: 'flows.folder_id', + }, + }, }; expect(relationMappings).toStrictEqual(expectedRelations); }); + + describe('delete', () => { + it('should set folderId to null for all related flows before deleting the folder', async () => { + const user = await createUser(); + + const folder = await createFolder({ userId: user.id }); + const flow = await createFlow({ folderId: folder.id, userId: user.id }); + + await folder.delete(); + + const refetchedFlow = await flow.$query(); + expect(refetchedFlow.folderId).toBe(null); + }); + + it('should delete the folder', async () => { + const user = await createUser(); + const folder = await createFolder({ userId: user.id }); + + await folder.delete(); + + const deletedFolder = await Folder.query().findById(folder.id); + expect(deletedFolder).toBeUndefined(); + }); + }); });