fix(core): Fix workflow tagging failure due to unique constraint check (#8505)

This commit is contained in:
Iván Ovejero 2024-02-02 12:36:55 +01:00 committed by GitHub
parent cccdfc73d6
commit 92f939f827
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 101 additions and 4 deletions

View file

@ -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);
});
}
}

View file

@ -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) {

View file

@ -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);
});
});
});