Add JSON field type and Event object (#4566)

* Add JSON field type and Event object

* Simplify code

* Adress PR comments and add featureFlag
This commit is contained in:
Félix Malfait
2024-03-19 21:54:08 +01:00
committed by GitHub
parent 4ab426c52a
commit 4bfb90657f
51 changed files with 575 additions and 117 deletions

View File

@ -19,6 +19,8 @@ import { FavoriteObjectMetadata } from 'src/modules/favorite/standard-objects/fa
import { OpportunityObjectMetadata } from 'src/modules/opportunity/standard-objects/opportunity.object-metadata';
import { PersonObjectMetadata } from 'src/modules/person/standard-objects/person.object-metadata';
import { WorkspaceMemberObjectMetadata } from 'src/modules/workspace-member/standard-objects/workspace-member.object-metadata';
import { EventObjectMetadata } from 'src/modules/event/standard-objects/event.object-metadata';
import { Gate } from 'src/engine/workspace-manager/workspace-sync-metadata/decorators/gate.decorator';
@ObjectMetadata({
standardId: standardObjectIds.company,
@ -206,4 +208,23 @@ export class CompanyObjectMetadata extends BaseObjectMetadata {
})
@IsNullable()
attachments: AttachmentObjectMetadata[];
@FieldMetadata({
standardId: companyStandardFieldIds.events,
type: FieldMetadataType.RELATION,
label: 'Events',
description: 'Events linked to the company',
icon: 'IconIconTimelineEvent',
})
@RelationMetadata({
type: RelationMetadataType.ONE_TO_MANY,
inverseSideTarget: () => EventObjectMetadata,
onDelete: RelationOnDeleteAction.CASCADE,
})
@IsNullable()
@Gate({
featureFlag: 'IS_EVENT_OBJECT_ENABLED',
})
@IsSystem()
events: EventObjectMetadata[];
}

View File

@ -0,0 +1,103 @@
import { FieldMetadataType } from 'src/engine-metadata/field-metadata/field-metadata.entity';
import { FeatureFlagKeys } from 'src/engine/modules/feature-flag/feature-flag.entity';
import { eventStandardFieldIds } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-field-ids';
import { standardObjectIds } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-object-ids';
import { CustomObjectMetadata } from 'src/engine/workspace-manager/workspace-sync-metadata/custom-objects/custom.object-metadata';
import { DynamicRelationFieldMetadata } from 'src/engine/workspace-manager/workspace-sync-metadata/decorators/dynamic-field-metadata.interface';
import { FieldMetadata } from 'src/engine/workspace-manager/workspace-sync-metadata/decorators/field-metadata.decorator';
import { Gate } from 'src/engine/workspace-manager/workspace-sync-metadata/decorators/gate.decorator';
import { IsNullable } from 'src/engine/workspace-manager/workspace-sync-metadata/decorators/is-nullable.decorator';
import { IsSystem } from 'src/engine/workspace-manager/workspace-sync-metadata/decorators/is-system.decorator';
import { ObjectMetadata } from 'src/engine/workspace-manager/workspace-sync-metadata/decorators/object-metadata.decorator';
import { BaseObjectMetadata } from 'src/engine/workspace-manager/workspace-sync-metadata/standard-objects/base.object-metadata';
import { CompanyObjectMetadata } from 'src/modules/company/standard-objects/company.object-metadata';
import { OpportunityObjectMetadata } from 'src/modules/opportunity/standard-objects/opportunity.object-metadata';
import { PersonObjectMetadata } from 'src/modules/person/standard-objects/person.object-metadata';
import { WorkspaceMemberObjectMetadata } from 'src/modules/workspace-member/standard-objects/workspace-member.object-metadata';
@ObjectMetadata({
standardId: standardObjectIds.event,
namePlural: 'events',
labelSingular: 'Event',
labelPlural: 'Events',
description: 'An event',
icon: 'IconJson',
})
@IsSystem()
@Gate({
featureFlag: FeatureFlagKeys.IsEventObjectEnabled,
})
export class EventObjectMetadata extends BaseObjectMetadata {
@FieldMetadata({
standardId: eventStandardFieldIds.properties,
type: FieldMetadataType.TEXT,
label: 'Event name',
description: 'Event name/type',
icon: 'IconAbc',
})
name: string;
@FieldMetadata({
standardId: eventStandardFieldIds.properties,
type: FieldMetadataType.JSON,
label: 'Event details',
description: 'Json value for event details',
icon: 'IconListDetails',
})
@IsNullable()
properties: JSON;
@FieldMetadata({
standardId: eventStandardFieldIds.workspaceMember,
type: FieldMetadataType.RELATION,
label: 'Workspace Member',
description: 'Event workspace member',
icon: 'IconCircleUser',
joinColumn: 'workspaceMemberId',
})
@IsNullable()
workspaceMember: WorkspaceMemberObjectMetadata;
@FieldMetadata({
standardId: eventStandardFieldIds.person,
type: FieldMetadataType.RELATION,
label: 'Person',
description: 'Event person',
icon: 'IconUser',
joinColumn: 'personId',
})
@IsNullable()
person: PersonObjectMetadata;
@FieldMetadata({
standardId: eventStandardFieldIds.company,
type: FieldMetadataType.RELATION,
label: 'Company',
description: 'Event company',
icon: 'IconBuildingSkyscraper',
joinColumn: 'companyId',
})
@IsNullable()
company: CompanyObjectMetadata;
@FieldMetadata({
standardId: eventStandardFieldIds.opportunity,
type: FieldMetadataType.RELATION,
label: 'Opportunity',
description: 'Events opportunity',
icon: 'IconTargetArrow',
joinColumn: 'opportunityId',
})
@IsNullable()
opportunity: OpportunityObjectMetadata;
@DynamicRelationFieldMetadata((oppositeObjectMetadata) => ({
standardId: eventStandardFieldIds.custom,
name: oppositeObjectMetadata.nameSingular,
label: oppositeObjectMetadata.labelSingular,
description: `Favorite ${oppositeObjectMetadata.labelSingular}`,
joinColumn: `${oppositeObjectMetadata.nameSingular}Id`,
icon: 'IconBuildingSkyscraper',
}))
custom: CustomObjectMetadata;
}

View File

@ -46,7 +46,7 @@ export class MessagingConnectedAccountListener {
DeleteConnectedAccountAssociatedMessagingDataJob.name,
{
workspaceId: payload.workspaceId,
connectedAccountId: payload.deletedRecord.id,
connectedAccountId: payload.recordId,
},
);
@ -55,7 +55,7 @@ export class MessagingConnectedAccountListener {
DeleteConnectedAccountAssociatedCalendarDataJob.name,
{
workspaceId: payload.workspaceId,
connectedAccountId: payload.deletedRecord.id,
connectedAccountId: payload.recordId,
},
);
}

View File

@ -24,16 +24,16 @@ export class MessagingMessageChannelListener {
) {
if (
objectRecordChangedProperties(
payload.previousRecord,
payload.updatedRecord,
payload.details.before,
payload.details.after,
).includes('isContactAutoCreationEnabled') &&
payload.updatedRecord.isContactAutoCreationEnabled
payload.details.after.isContactAutoCreationEnabled
) {
this.messageQueueService.add<CreateCompaniesAndContactsAfterSyncJobData>(
CreateCompaniesAndContactsAfterSyncJob.name,
{
workspaceId: payload.workspaceId,
messageChannelId: payload.updatedRecord.id,
messageChannelId: payload.recordId,
},
);
}

View File

@ -23,7 +23,7 @@ export class MessagingPersonListener {
async handleCreatedEvent(
payload: ObjectRecordCreateEvent<PersonObjectMetadata>,
) {
if (payload.createdRecord.email === null) {
if (payload.details.after.email === null) {
return;
}
@ -31,8 +31,8 @@ export class MessagingPersonListener {
MatchMessageParticipantJob.name,
{
workspaceId: payload.workspaceId,
email: payload.createdRecord.email,
personId: payload.createdRecord.id,
email: payload.details.after.email,
personId: payload.recordId,
},
);
}
@ -43,16 +43,16 @@ export class MessagingPersonListener {
) {
if (
objectRecordUpdateEventChangedProperties(
payload.previousRecord,
payload.updatedRecord,
payload.details.before,
payload.details.after,
).includes('email')
) {
this.messageQueueService.add<MatchMessageParticipantsJobData>(
MatchMessageParticipantJob.name,
{
workspaceId: payload.workspaceId,
email: payload.updatedRecord.email,
personId: payload.updatedRecord.id,
email: payload.details.after.email,
personId: payload.recordId,
},
);
}

View File

@ -23,7 +23,7 @@ export class MessagingWorkspaceMemberListener {
async handleCreatedEvent(
payload: ObjectRecordCreateEvent<WorkspaceMemberObjectMetadata>,
) {
if (payload.createdRecord.userEmail === null) {
if (payload.details.after.userEmail === null) {
return;
}
@ -31,8 +31,8 @@ export class MessagingWorkspaceMemberListener {
MatchMessageParticipantJob.name,
{
workspaceId: payload.workspaceId,
email: payload.createdRecord.userEmail,
workspaceMemberId: payload.createdRecord.id,
email: payload.details.after.userEmail,
workspaceMemberId: payload.details.after.id,
},
);
}
@ -43,16 +43,16 @@ export class MessagingWorkspaceMemberListener {
) {
if (
objectRecordUpdateEventChangedProperties(
payload.previousRecord,
payload.updatedRecord,
payload.details.before,
payload.details.after,
).includes('userEmail')
) {
await this.messageQueueService.add<MatchMessageParticipantsJobData>(
MatchMessageParticipantJob.name,
{
workspaceId: payload.workspaceId,
email: payload.updatedRecord.userEmail,
workspaceMemberId: payload.updatedRecord.id,
email: payload.details.after.userEmail,
workspaceMemberId: payload.recordId,
},
);
}

View File

@ -18,6 +18,8 @@ import { CompanyObjectMetadata } from 'src/modules/company/standard-objects/comp
import { FavoriteObjectMetadata } from 'src/modules/favorite/standard-objects/favorite.object-metadata';
import { PersonObjectMetadata } from 'src/modules/person/standard-objects/person.object-metadata';
import { PipelineStepObjectMetadata } from 'src/modules/pipeline-step/standard-objects/pipeline-step.object-metadata';
import { EventObjectMetadata } from 'src/modules/event/standard-objects/event.object-metadata';
import { Gate } from 'src/engine/workspace-manager/workspace-sync-metadata/decorators/gate.decorator';
@ObjectMetadata({
standardId: standardObjectIds.opportunity,
@ -178,4 +180,21 @@ export class OpportunityObjectMetadata extends BaseObjectMetadata {
})
@IsNullable()
attachments: AttachmentObjectMetadata[];
@FieldMetadata({
standardId: opportunityStandardFieldIds.events,
type: FieldMetadataType.RELATION,
label: 'Events',
description: 'Events linked to the opportunity.',
icon: 'IconTimelineEvent',
})
@RelationMetadata({
type: RelationMetadataType.ONE_TO_MANY,
inverseSideTarget: () => EventObjectMetadata,
})
@Gate({
featureFlag: 'IS_EVENT_OBJECT_ENABLED',
})
@IsNullable()
events: EventObjectMetadata[];
}

View File

@ -21,6 +21,7 @@ import { CompanyObjectMetadata } from 'src/modules/company/standard-objects/comp
import { FavoriteObjectMetadata } from 'src/modules/favorite/standard-objects/favorite.object-metadata';
import { MessageParticipantObjectMetadata } from 'src/modules/messaging/standard-objects/message-participant.object-metadata';
import { OpportunityObjectMetadata } from 'src/modules/opportunity/standard-objects/opportunity.object-metadata';
import { EventObjectMetadata } from 'src/modules/event/standard-objects/event.object-metadata';
@ObjectMetadata({
standardId: standardObjectIds.person,
@ -218,4 +219,23 @@ export class PersonObjectMetadata extends BaseObjectMetadata {
})
@IsSystem()
calendarEventAttendees: CalendarEventAttendeeObjectMetadata[];
@FieldMetadata({
standardId: personStandardFieldIds.events,
type: FieldMetadataType.RELATION,
label: 'Events',
description: 'Events linked to the company',
icon: 'IconTimelineEvent',
})
@RelationMetadata({
type: RelationMetadataType.ONE_TO_MANY,
inverseSideTarget: () => EventObjectMetadata,
onDelete: RelationOnDeleteAction.CASCADE,
})
@IsNullable()
@Gate({
featureFlag: 'IS_EVENT_OBJECT_ENABLED',
})
@IsSystem()
events: EventObjectMetadata[];
}

View File

@ -21,6 +21,8 @@ import { CompanyObjectMetadata } from 'src/modules/company/standard-objects/comp
import { ConnectedAccountObjectMetadata } from 'src/modules/connected-account/standard-objects/connected-account.object-metadata';
import { FavoriteObjectMetadata } from 'src/modules/favorite/standard-objects/favorite.object-metadata';
import { MessageParticipantObjectMetadata } from 'src/modules/messaging/standard-objects/message-participant.object-metadata';
import { IsNullable } from 'src/engine/workspace-manager/workspace-sync-metadata/decorators/is-nullable.decorator';
import { EventObjectMetadata } from 'src/modules/event/standard-objects/event.object-metadata';
@ObjectMetadata({
standardId: standardObjectIds.workspaceMember,
@ -231,4 +233,23 @@ export class WorkspaceMemberObjectMetadata extends BaseObjectMetadata {
featureFlag: 'IS_CALENDAR_ENABLED',
})
calendarEventAttendees: CalendarEventAttendeeObjectMetadata[];
@FieldMetadata({
standardId: workspaceMemberStandardFieldIds.events,
type: FieldMetadataType.RELATION,
label: 'Events',
description: 'Events linked to the workspace member',
icon: 'IconTimelineEvent',
})
@RelationMetadata({
type: RelationMetadataType.ONE_TO_MANY,
inverseSideTarget: () => EventObjectMetadata,
onDelete: RelationOnDeleteAction.CASCADE,
})
@IsNullable()
@Gate({
featureFlag: 'IS_EVENT_OBJECT_ENABLED',
})
@IsSystem()
events: EventObjectMetadata[];
}