mirror of
https://github.com/n8n-io/n8n.git
synced 2024-12-24 20:24:05 -08:00
fix(core): Fix workflow tagging failure due to unique constraint check (#8505)
This commit is contained in:
parent
cccdfc73d6
commit
92f939f827
|
@ -7,4 +7,14 @@ export class WorkflowTagMappingRepository extends Repository<WorkflowTagMapping>
|
|||
constructor(dataSource: DataSource) {
|
||||
super(WorkflowTagMapping, dataSource.manager);
|
||||
}
|
||||
|
||||
async overwriteTaggings(workflowId: string, tagIds: string[]) {
|
||||
return await this.manager.transaction(async () => {
|
||||
await this.delete({ workflowId });
|
||||
|
||||
const taggings = tagIds.map((tagId) => this.create({ workflowId, tagId }));
|
||||
|
||||
return await this.insert(taggings);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
@ -166,10 +166,7 @@ export class WorkflowService {
|
|||
);
|
||||
|
||||
if (tagIds && !config.getEnv('workflowTagsDisabled')) {
|
||||
await this.workflowTagMappingRepository.delete({ workflowId });
|
||||
await this.workflowTagMappingRepository.insert(
|
||||
tagIds.map((tagId) => ({ tagId, workflowId })),
|
||||
);
|
||||
await this.workflowTagMappingRepository.overwriteTaggings(workflowId, tagIds);
|
||||
}
|
||||
|
||||
if (workflow.versionId !== shared.workflow.versionId) {
|
||||
|
|
|
@ -0,0 +1,90 @@
|
|||
import Container from 'typedi';
|
||||
|
||||
import * as testDb from './shared/testDb';
|
||||
import { WorkflowTagMappingRepository } from '@/databases/repositories/workflowTagMapping.repository';
|
||||
import { createWorkflow } from './shared/db/workflows';
|
||||
import { TagRepository } from '@/databases/repositories/tag.repository';
|
||||
|
||||
describe('WorkflowTagMappingRepository', () => {
|
||||
let taggingRepository: WorkflowTagMappingRepository;
|
||||
let tagRepository: TagRepository;
|
||||
|
||||
beforeAll(async () => {
|
||||
await testDb.init();
|
||||
|
||||
taggingRepository = Container.get(WorkflowTagMappingRepository);
|
||||
tagRepository = Container.get(TagRepository);
|
||||
});
|
||||
|
||||
afterEach(async () => {
|
||||
await testDb.truncate(['WorkflowTagMapping', 'Workflow', 'Tag']);
|
||||
});
|
||||
|
||||
afterAll(async () => {
|
||||
await testDb.terminate();
|
||||
});
|
||||
|
||||
describe('overwriteTaggings', () => {
|
||||
test('should overwrite taggings in a workflow', async () => {
|
||||
const workflow = await createWorkflow();
|
||||
|
||||
const oldTags = await tagRepository.save(
|
||||
['tag1', 'tag2'].map((name) => tagRepository.create({ name })),
|
||||
);
|
||||
|
||||
const oldTaggings = oldTags.map((tag) =>
|
||||
taggingRepository.create({
|
||||
tagId: tag.id,
|
||||
workflowId: workflow.id,
|
||||
}),
|
||||
);
|
||||
|
||||
await taggingRepository.save(oldTaggings);
|
||||
|
||||
const newTags = await tagRepository.save(
|
||||
['tag3', 'tag4'].map((name) => tagRepository.create({ name })),
|
||||
);
|
||||
|
||||
await taggingRepository.overwriteTaggings(
|
||||
workflow.id,
|
||||
newTags.map((t) => t.id),
|
||||
);
|
||||
|
||||
const taggings = await taggingRepository.findBy({ workflowId: workflow.id });
|
||||
|
||||
expect(taggings).toHaveLength(2);
|
||||
|
||||
const [firstNewTag, secondNewTag] = newTags;
|
||||
|
||||
expect(taggings).toEqual(
|
||||
expect.arrayContaining([
|
||||
expect.objectContaining({ tagId: firstNewTag.id, workflowId: workflow.id }),
|
||||
expect.objectContaining({ tagId: secondNewTag.id, workflowId: workflow.id }),
|
||||
]),
|
||||
);
|
||||
});
|
||||
|
||||
test('should delete taggings if no tags are provided', async () => {
|
||||
const workflow = await createWorkflow();
|
||||
|
||||
const oldTags = await tagRepository.save(
|
||||
['tag1', 'tag2'].map((name) => tagRepository.create({ name })),
|
||||
);
|
||||
|
||||
const oldTaggings = oldTags.map((tag) =>
|
||||
taggingRepository.create({
|
||||
tagId: tag.id,
|
||||
workflowId: workflow.id,
|
||||
}),
|
||||
);
|
||||
|
||||
await taggingRepository.save(oldTaggings);
|
||||
|
||||
await taggingRepository.overwriteTaggings(workflow.id, []);
|
||||
|
||||
const taggings = await taggingRepository.findBy({ workflowId: workflow.id });
|
||||
|
||||
expect(taggings).toHaveLength(0);
|
||||
});
|
||||
});
|
||||
});
|
Loading…
Reference in a new issue