Skip to content

Commit

Permalink
fix(core): Fix workflow tagging failure due to unique constraint check (
Browse files Browse the repository at this point in the history
  • Loading branch information
ivov authored and netroy committed Feb 2, 2024
1 parent f256c6d commit d4597ca
Show file tree
Hide file tree
Showing 3 changed files with 101 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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);
});
}
}
5 changes: 1 addition & 4 deletions packages/cli/src/workflows/workflow.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
@@ -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);
});
});
});

0 comments on commit d4597ca

Please sign in to comment.