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

Fix workflow statuses #7555

Merged
merged 2 commits into from
Oct 10, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
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 @@ -191,6 +191,9 @@ export const TIMELINE_ACTIVITY_STANDARD_FIELD_IDS = {
opportunity: '20202020-7664-4a35-a3df-580d389fd527',
task: '20202020-b2f5-415c-9135-a31dfe49501b',
note: '20202020-ec55-4135-8da5-3a20badc0156',
workflow: '20202020-616c-4ad3-a2e9-c477c341e295',
workflowVersion: '20202020-74f1-4711-a129-e14ca0ecd744',
workflowRun: '20202020-96f0-401b-9186-a3a0759225ac',
custom: '20202020-4a71-41b0-9f83-9cdcca3f8b14',
linkedRecordCachedName: '20202020-cfdb-4bef-bbce-a29f41230934',
linkedRecordId: '20202020-2e0e-48c0-b445-ee6c1e61687d',
Expand Down Expand Up @@ -411,6 +414,7 @@ export const WORKFLOW_STANDARD_FIELD_IDS = {
runs: '20202020-759b-4340-b58b-e73595c4df4f',
eventListeners: '20202020-0229-4c66-832e-035c67579a38',
favorites: '20202020-c554-4c41-be7a-cf9cd4b0d512',
timelineActivities: '20202020-906e-486a-a798-131a5f081faf',
};

export const WORKFLOW_RUN_STANDARD_FIELD_IDS = {
Expand All @@ -423,6 +427,7 @@ export const WORKFLOW_RUN_STANDARD_FIELD_IDS = {
position: '20202020-7802-4c40-ae89-1f506fe3365c',
createdBy: '20202020-6007-401a-8aa5-e6f38581a6f3',
output: '20202020-7be4-4db2-8ac6-3ff0d740843d',
timelineActivities: '20202020-af4d-4eb0-babc-eb960a45b356',
};

export const WORKFLOW_VERSION_STANDARD_FIELD_IDS = {
Expand All @@ -433,6 +438,7 @@ export const WORKFLOW_VERSION_STANDARD_FIELD_IDS = {
position: '20202020-791d-4950-ab28-0e704767ae1c',
runs: '20202020-1d08-46df-901a-85045f18099a',
steps: '20202020-5988-4a64-b94a-1f9b7b989039',
timelineActivities: '20202020-fcb0-4695-b17e-3b43a421c633',
};

export const WORKSPACE_MEMBER_STANDARD_FIELD_IDS = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@ import { NoteWorkspaceEntity } from 'src/modules/note/standard-objects/note.work
import { OpportunityWorkspaceEntity } from 'src/modules/opportunity/standard-objects/opportunity.workspace-entity';
import { PersonWorkspaceEntity } from 'src/modules/person/standard-objects/person.workspace-entity';
import { TaskWorkspaceEntity } from 'src/modules/task/standard-objects/task.workspace-entity';
import { WorkflowRunWorkspaceEntity } from 'src/modules/workflow/common/standard-objects/workflow-run.workspace-entity';
import { WorkflowVersionWorkspaceEntity } from 'src/modules/workflow/common/standard-objects/workflow-version.workspace-entity';
import { WorkflowWorkspaceEntity } from 'src/modules/workflow/common/standard-objects/workflow.workspace-entity';
import { WorkspaceMemberWorkspaceEntity } from 'src/modules/workspace-member/standard-objects/workspace-member.workspace-entity';

@WorkspaceEntity({
Expand Down Expand Up @@ -182,6 +185,51 @@ export class TimelineActivityWorkspaceEntity extends BaseWorkspaceEntity {
@WorkspaceJoinColumn('task')
taskId: string | null;

@WorkspaceRelation({
standardId: TIMELINE_ACTIVITY_STANDARD_FIELD_IDS.workflow,
type: RelationMetadataType.MANY_TO_ONE,
label: 'Workflow',
description: 'Event workflow',
icon: 'IconTargetArrow',
inverseSideTarget: () => WorkflowWorkspaceEntity,
inverseSideFieldKey: 'timelineActivities',
})
@WorkspaceIsNullable()
workflow: Relation<WorkflowWorkspaceEntity> | null;

@WorkspaceJoinColumn('workflow')
workflowId: string | null;

@WorkspaceRelation({
standardId: TIMELINE_ACTIVITY_STANDARD_FIELD_IDS.workflowVersion,
type: RelationMetadataType.MANY_TO_ONE,
label: 'WorkflowVersion',
description: 'Event workflow version',
icon: 'IconTargetArrow',
inverseSideTarget: () => WorkflowVersionWorkspaceEntity,
inverseSideFieldKey: 'timelineActivities',
})
@WorkspaceIsNullable()
workflowVersion: Relation<WorkflowVersionWorkspaceEntity> | null;

@WorkspaceJoinColumn('workflowVersion')
workflowVersionId: string | null;

@WorkspaceRelation({
standardId: TIMELINE_ACTIVITY_STANDARD_FIELD_IDS.workflowRun,
type: RelationMetadataType.MANY_TO_ONE,
label: 'Workflow Run',
description: 'Event workflow run',
icon: 'IconTargetArrow',
inverseSideTarget: () => WorkflowRunWorkspaceEntity,
inverseSideFieldKey: 'timelineActivities',
})
@WorkspaceIsNullable()
workflowRun: Relation<WorkflowRunWorkspaceEntity> | null;

@WorkspaceJoinColumn('workflowRun')
workflowRunId: string | null;

@WorkspaceDynamicRelation({
type: RelationMetadataType.MANY_TO_ONE,
argsFactory: (oppositeObjectMetadata) => ({
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,16 @@
import { InjectRepository } from '@nestjs/typeorm';

import { Repository } from 'typeorm';

import { WorkspaceQueryPostHookInstance } from 'src/engine/api/graphql/workspace-query-runner/workspace-query-hook/interfaces/workspace-query-hook.interface';

import { WorkspaceQueryHook } from 'src/engine/api/graphql/workspace-query-runner/workspace-query-hook/decorators/workspace-query-hook.decorator';
import { WorkspaceQueryHookType } from 'src/engine/api/graphql/workspace-query-runner/workspace-query-hook/types/workspace-query-hook.type';
import { AuthContext } from 'src/engine/core-modules/auth/types/auth-context.type';
import { ObjectRecordCreateEvent } from 'src/engine/core-modules/event-emitter/types/object-record-create.event';
import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity';
import { TwentyORMManager } from 'src/engine/twenty-orm/twenty-orm.manager';
import { WorkspaceEventEmitter } from 'src/engine/workspace-event-emitter/workspace-event-emitter';
import {
WorkflowVersionStatus,
WorkflowVersionWorkspaceEntity,
Expand All @@ -17,10 +24,15 @@ import { WorkflowWorkspaceEntity } from 'src/modules/workflow/common/standard-ob
export class WorkflowCreateManyPostQueryHook
implements WorkspaceQueryPostHookInstance
{
constructor(private readonly twentyORMManager: TwentyORMManager) {}
constructor(
private readonly twentyORMManager: TwentyORMManager,
private readonly workspaceEventEmitter: WorkspaceEventEmitter,
@InjectRepository(ObjectMetadataEntity, 'metadata')
private readonly objectMetadataRepository: Repository<ObjectMetadataEntity>,
) {}

async execute(
_authContext: AuthContext,
authContext: AuthContext,
_objectName: string,
payload: WorkflowWorkspaceEntity[],
): Promise<void> {
Expand All @@ -29,14 +41,39 @@ export class WorkflowCreateManyPostQueryHook
'workflowVersion',
);

const workflowVersionsToCreate = payload.map((workflow) => {
return workflowVersionRepository.create({
workflowId: workflow.id,
status: WorkflowVersionStatus.DRAFT,
name: 'v1',
});
});

await Promise.all(
payload.map((workflow) => {
return workflowVersionRepository.insert({
workflowId: workflow.id,
status: WorkflowVersionStatus.DRAFT,
name: 'v1',
});
workflowVersionsToCreate.map((workflowVersion) => {
return workflowVersionRepository.save(workflowVersion);
}),
);

const objectMetadata = await this.objectMetadataRepository.findOneOrFail({
where: {
nameSingular: 'workflowVersion',
},
});

this.workspaceEventEmitter.emit(
`workflowVersion.created`,
workflowVersionsToCreate.map((workflowVersionToCreate) => {
return {
userId: authContext.user?.id,
recordId: workflowVersionToCreate.id,
objectMetadata,
properties: {
after: workflowVersionToCreate,
},
} satisfies ObjectRecordCreateEvent<any>;
}),
authContext.workspace.id,
);
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,16 @@
import { InjectRepository } from '@nestjs/typeorm';

import { Repository } from 'typeorm';

import { WorkspaceQueryPostHookInstance } from 'src/engine/api/graphql/workspace-query-runner/workspace-query-hook/interfaces/workspace-query-hook.interface';

import { WorkspaceQueryHook } from 'src/engine/api/graphql/workspace-query-runner/workspace-query-hook/decorators/workspace-query-hook.decorator';
import { WorkspaceQueryHookType } from 'src/engine/api/graphql/workspace-query-runner/workspace-query-hook/types/workspace-query-hook.type';
import { AuthContext } from 'src/engine/core-modules/auth/types/auth-context.type';
import { ObjectRecordCreateEvent } from 'src/engine/core-modules/event-emitter/types/object-record-create.event';
import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity';
import { TwentyORMManager } from 'src/engine/twenty-orm/twenty-orm.manager';
import { WorkspaceEventEmitter } from 'src/engine/workspace-event-emitter/workspace-event-emitter';
import {
WorkflowVersionStatus,
WorkflowVersionWorkspaceEntity,
Expand All @@ -17,10 +24,15 @@ import { WorkflowWorkspaceEntity } from 'src/modules/workflow/common/standard-ob
export class WorkflowCreateOnePostQueryHook
implements WorkspaceQueryPostHookInstance
{
constructor(private readonly twentyORMManager: TwentyORMManager) {}
constructor(
private readonly twentyORMManager: TwentyORMManager,
private readonly workspaceEventEmitter: WorkspaceEventEmitter,
@InjectRepository(ObjectMetadataEntity, 'metadata')
private readonly objectMetadataRepository: Repository<ObjectMetadataEntity>,
) {}

async execute(
_authContext: AuthContext,
authContext: AuthContext,
_objectName: string,
payload: WorkflowWorkspaceEntity[],
): Promise<void> {
Expand All @@ -31,10 +43,33 @@ export class WorkflowCreateOnePostQueryHook
'workflowVersion',
);

await workflowVersionRepository.insert({
const workflowVersionToCreate = await workflowVersionRepository.create({
workflowId: workflow.id,
status: WorkflowVersionStatus.DRAFT,
name: 'v1',
});

await workflowVersionRepository.save(workflowVersionToCreate);

const objectMetadata = await this.objectMetadataRepository.findOneOrFail({
where: {
nameSingular: 'workflowVersion',
},
});

this.workspaceEventEmitter.emit(
`workflowVersion.created`,
[
{
userId: authContext.user?.id,
recordId: workflowVersionToCreate.id,
objectMetadata,
properties: {
after: workflowVersionToCreate,
},
} satisfies ObjectRecordCreateEvent<any>,
],
authContext.workspace.id,
);
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
import { Module } from '@nestjs/common';

import { NestjsQueryTypeOrmModule } from '@ptc-org/nestjs-query-typeorm';

import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity';
import { WorkflowCreateManyPostQueryHook } from 'src/modules/workflow/common/query-hooks/workflow-create-many.post-query.hook';
import { WorkflowCreateManyPreQueryHook } from 'src/modules/workflow/common/query-hooks/workflow-create-many.pre-query.hook';
import { WorkflowCreateOnePostQueryHook } from 'src/modules/workflow/common/query-hooks/workflow-create-one.post-query.hook';
import { WorkflowCreateOnePreQueryHook } from 'src/modules/workflow/common/query-hooks/workflow-create-one.pre-query.hook';
import { WorkflowRunCreateManyPreQueryHook } from 'src/modules/workflow/common/query-hooks/workflow-run-create-many.pre-query.hook';
import { WorkflowRunCreateOnePreQueryHook } from 'src/modules/workflow/common/query-hooks/workflow-run-create-one.pre-query.hook';
Expand All @@ -17,6 +21,9 @@ import { WorkflowCommonWorkspaceService } from 'src/modules/workflow/common/work
import { WorkflowVersionValidationWorkspaceService } from 'src/modules/workflow/common/workspace-services/workflow-version-validation.workspace-service';

@Module({
imports: [
NestjsQueryTypeOrmModule.forFeature([ObjectMetadataEntity], 'metadata'),
],
providers: [
WorkflowCreateOnePreQueryHook,
WorkflowCreateManyPreQueryHook,
Expand All @@ -30,6 +37,7 @@ import { WorkflowVersionValidationWorkspaceService } from 'src/modules/workflow/
WorkflowVersionUpdateManyPreQueryHook,
WorkflowVersionDeleteOnePreQueryHook,
WorkflowVersionDeleteManyPreQueryHook,
WorkflowCreateOnePostQueryHook,
WorkflowCreateManyPostQueryHook,
WorkflowVersionValidationWorkspaceService,
WorkflowCommonWorkspaceService,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@ export class WorkflowEventListenerWorkspaceEntity extends BaseWorkspaceEntity {
type: FieldMetadataType.TEXT,
label: 'Name',
description: 'The workflow event listener name',
icon: 'IconPhoneCheck',
})
eventName: string;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,10 @@ import {
FieldActorSource,
} from 'src/engine/metadata-modules/field-metadata/composite-types/actor.composite-type';
import { FieldMetadataType } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
import { RelationMetadataType } from 'src/engine/metadata-modules/relation-metadata/relation-metadata.entity';
import {
RelationMetadataType,
RelationOnDeleteAction,
} from 'src/engine/metadata-modules/relation-metadata/relation-metadata.entity';
import { BaseWorkspaceEntity } from 'src/engine/twenty-orm/base.workspace-entity';
import { WorkspaceEntity } from 'src/engine/twenty-orm/decorators/workspace-entity.decorator';
import { WorkspaceField } from 'src/engine/twenty-orm/decorators/workspace-field.decorator';
Expand All @@ -17,6 +20,7 @@ import { WorkspaceJoinColumn } from 'src/engine/twenty-orm/decorators/workspace-
import { WorkspaceRelation } from 'src/engine/twenty-orm/decorators/workspace-relation.decorator';
import { WORKFLOW_RUN_STANDARD_FIELD_IDS } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-field-ids';
import { STANDARD_OBJECT_IDS } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-object-ids';
import { TimelineActivityWorkspaceEntity } from 'src/modules/timeline/standard-objects/timeline-activity.workspace-entity';
import { WorkflowVersionWorkspaceEntity } from 'src/modules/workflow/common/standard-objects/workflow-version.workspace-entity';
import { WorkflowWorkspaceEntity } from 'src/modules/workflow/common/standard-objects/workflow.workspace-entity';

Expand Down Expand Up @@ -45,7 +49,7 @@ export type WorkflowRunOutput = {
labelPlural: 'Workflow Runs',
description: 'A workflow run',
labelIdentifierStandardId: WORKFLOW_RUN_STANDARD_FIELD_IDS.name,
icon: 'IconHistory',
icon: 'IconSettingsAutomation',
})
@WorkspaceGate({
featureFlag: FeatureFlagKey.IsWorkflowEnabled,
Expand All @@ -56,7 +60,7 @@ export class WorkflowRunWorkspaceEntity extends BaseWorkspaceEntity {
type: FieldMetadataType.TEXT,
label: 'Name',
description: 'Name of the workflow run',
icon: 'IconText',
icon: 'IconSettingsAutomation',
})
name: string;

Expand Down Expand Up @@ -134,6 +138,7 @@ export class WorkflowRunWorkspaceEntity extends BaseWorkspaceEntity {
type: FieldMetadataType.RAW_JSON,
label: 'Output',
description: 'Json object to provide output of the workflow run',
icon: 'IconText',
})
@WorkspaceIsNullable()
output: WorkflowRunOutput | null;
Expand Down Expand Up @@ -177,4 +182,15 @@ export class WorkflowRunWorkspaceEntity extends BaseWorkspaceEntity {

@WorkspaceJoinColumn('workflow')
workflowId: string;

@WorkspaceRelation({
standardId: WORKFLOW_RUN_STANDARD_FIELD_IDS.timelineActivities,
type: RelationMetadataType.ONE_TO_MANY,
label: 'Timeline Activities',
description: 'Timeline activities linked to the run',
inverseSideTarget: () => TimelineActivityWorkspaceEntity,
onDelete: RelationOnDeleteAction.CASCADE,
})
@WorkspaceIsSystem()
timelineActivities: Relation<TimelineActivityWorkspaceEntity[]>;
}
Loading
Loading