Fix contact creation and rename email aliases to handle aliases (#6176)
Fix contact creation (linked to #6162) and rename email aliases to handle aliases
This commit is contained in:
@ -58,7 +58,7 @@ export const TwoConnectedAccounts: Story = {
|
|||||||
provider: 'google',
|
provider: 'google',
|
||||||
accountOwnerId: '20202020-03f2-4d83-b0d5-2ec2bcee72d4',
|
accountOwnerId: '20202020-03f2-4d83-b0d5-2ec2bcee72d4',
|
||||||
lastSyncHistoryId: '',
|
lastSyncHistoryId: '',
|
||||||
emailAliases: '',
|
handleAliases: '',
|
||||||
handle: 'test.test@gmail.com',
|
handle: 'test.test@gmail.com',
|
||||||
authFailedAt: null,
|
authFailedAt: null,
|
||||||
},
|
},
|
||||||
|
|||||||
@ -59,7 +59,7 @@ export const TwoConnectedAccounts: Story = {
|
|||||||
provider: 'google',
|
provider: 'google',
|
||||||
accountOwnerId: '20202020-03f2-4d83-b0d5-2ec2bcee72d4',
|
accountOwnerId: '20202020-03f2-4d83-b0d5-2ec2bcee72d4',
|
||||||
lastSyncHistoryId: '',
|
lastSyncHistoryId: '',
|
||||||
emailAliases: '',
|
handleAliases: '',
|
||||||
handle: 'test.test@gmail.com',
|
handle: 'test.test@gmail.com',
|
||||||
authFailedAt: null,
|
authFailedAt: null,
|
||||||
},
|
},
|
||||||
|
|||||||
@ -140,7 +140,7 @@ export const CONNECTED_ACCOUNT_STANDARD_FIELD_IDS = {
|
|||||||
authFailedAt: '20202020-d268-4c6b-baff-400d402b430a',
|
authFailedAt: '20202020-d268-4c6b-baff-400d402b430a',
|
||||||
messageChannels: '20202020-24f7-4362-8468-042204d1e445',
|
messageChannels: '20202020-24f7-4362-8468-042204d1e445',
|
||||||
calendarChannels: '20202020-af4a-47bb-99ec-51911c1d3977',
|
calendarChannels: '20202020-af4a-47bb-99ec-51911c1d3977',
|
||||||
emailAliases: '20202020-8a3d-46be-814f-6228af16c47b',
|
handleAliases: '20202020-8a3d-46be-814f-6228af16c47b',
|
||||||
};
|
};
|
||||||
|
|
||||||
export const EVENT_STANDARD_FIELD_IDS = {
|
export const EVENT_STANDARD_FIELD_IDS = {
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
import { getDomainNameFromHandle } from 'src/modules/connected-account/auto-companies-and-contacts-creation/utils/get-domain-name-from-handle.util';
|
|
||||||
import { WorkspaceMemberWorkspaceEntity } from 'src/modules/workspace-member/standard-objects/workspace-member.workspace-entity';
|
|
||||||
import { ConnectedAccountWorkspaceEntity } from 'src/modules/connected-account/standard-objects/connected-account.workspace-entity';
|
|
||||||
import { Contact } from 'src/modules/connected-account/auto-companies-and-contacts-creation/types/contact.type';
|
import { Contact } from 'src/modules/connected-account/auto-companies-and-contacts-creation/types/contact.type';
|
||||||
|
import { getDomainNameFromHandle } from 'src/modules/connected-account/auto-companies-and-contacts-creation/utils/get-domain-name-from-handle.util';
|
||||||
|
import { ConnectedAccountWorkspaceEntity } from 'src/modules/connected-account/standard-objects/connected-account.workspace-entity';
|
||||||
|
import { WorkspaceMemberWorkspaceEntity } from 'src/modules/workspace-member/standard-objects/workspace-member.workspace-entity';
|
||||||
|
|
||||||
export function filterOutSelfAndContactsFromCompanyOrWorkspace(
|
export function filterOutSelfAndContactsFromCompanyOrWorkspace(
|
||||||
contacts: Contact[],
|
contacts: Contact[],
|
||||||
@ -10,7 +10,7 @@ export function filterOutSelfAndContactsFromCompanyOrWorkspace(
|
|||||||
): Contact[] {
|
): Contact[] {
|
||||||
const selfDomainName = getDomainNameFromHandle(connectedAccount.handle);
|
const selfDomainName = getDomainNameFromHandle(connectedAccount.handle);
|
||||||
|
|
||||||
const emailAliases = connectedAccount.emailAliases?.split(',') || [];
|
const handleAliases = connectedAccount.handleAliases?.split(',') || [];
|
||||||
|
|
||||||
const workspaceMembersMap = workspaceMembers.reduce(
|
const workspaceMembersMap = workspaceMembers.reduce(
|
||||||
(map, workspaceMember) => {
|
(map, workspaceMember) => {
|
||||||
@ -25,6 +25,6 @@ export function filterOutSelfAndContactsFromCompanyOrWorkspace(
|
|||||||
(contact) =>
|
(contact) =>
|
||||||
getDomainNameFromHandle(contact.handle) !== selfDomainName &&
|
getDomainNameFromHandle(contact.handle) !== selfDomainName &&
|
||||||
!workspaceMembersMap[contact.handle] &&
|
!workspaceMembersMap[contact.handle] &&
|
||||||
!emailAliases.includes(contact.handle),
|
!handleAliases.includes(contact.handle),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -11,7 +11,7 @@ export class GoogleEmailAliasManagerService {
|
|||||||
private readonly oAuth2ClientManagerService: OAuth2ClientManagerService,
|
private readonly oAuth2ClientManagerService: OAuth2ClientManagerService,
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
public async getEmailAliases(
|
public async getHandleAliases(
|
||||||
connectedAccount: ConnectedAccountWorkspaceEntity,
|
connectedAccount: ConnectedAccountWorkspaceEntity,
|
||||||
) {
|
) {
|
||||||
const oAuth2Client =
|
const oAuth2Client =
|
||||||
@ -29,7 +29,7 @@ export class GoogleEmailAliasManagerService {
|
|||||||
|
|
||||||
const emailAddresses = emailsResponse.data.emailAddresses;
|
const emailAddresses = emailsResponse.data.emailAddresses;
|
||||||
|
|
||||||
const emailAliases =
|
const handleAliases =
|
||||||
emailAddresses
|
emailAddresses
|
||||||
?.filter((emailAddress) => {
|
?.filter((emailAddress) => {
|
||||||
return emailAddress.metadata?.primary !== true;
|
return emailAddress.metadata?.primary !== true;
|
||||||
@ -38,6 +38,6 @@ export class GoogleEmailAliasManagerService {
|
|||||||
return emailAddress.value || '';
|
return emailAddress.value || '';
|
||||||
}) || [];
|
}) || [];
|
||||||
|
|
||||||
return emailAliases;
|
return handleAliases;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -13,16 +13,16 @@ export class EmailAliasManagerService {
|
|||||||
private readonly googleEmailAliasManagerService: GoogleEmailAliasManagerService,
|
private readonly googleEmailAliasManagerService: GoogleEmailAliasManagerService,
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
public async refreshEmailAliases(
|
public async refreshHandleAliases(
|
||||||
connectedAccount: ConnectedAccountWorkspaceEntity,
|
connectedAccount: ConnectedAccountWorkspaceEntity,
|
||||||
workspaceId: string,
|
workspaceId: string,
|
||||||
) {
|
) {
|
||||||
let emailAliases: string[];
|
let handleAliases: string[];
|
||||||
|
|
||||||
switch (connectedAccount.provider) {
|
switch (connectedAccount.provider) {
|
||||||
case 'google':
|
case 'google':
|
||||||
emailAliases =
|
handleAliases =
|
||||||
await this.googleEmailAliasManagerService.getEmailAliases(
|
await this.googleEmailAliasManagerService.getHandleAliases(
|
||||||
connectedAccount,
|
connectedAccount,
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
@ -32,8 +32,8 @@ export class EmailAliasManagerService {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
await this.connectedAccountRepository.updateEmailAliases(
|
await this.connectedAccountRepository.updateHandleAliases(
|
||||||
emailAliases,
|
handleAliases,
|
||||||
connectedAccount.id,
|
connectedAccount.id,
|
||||||
workspaceId,
|
workspaceId,
|
||||||
);
|
);
|
||||||
|
|||||||
@ -307,8 +307,8 @@ export class ConnectedAccountRepository {
|
|||||||
return connectedAccount;
|
return connectedAccount;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async updateEmailAliases(
|
public async updateHandleAliases(
|
||||||
emailAliases: string[],
|
handleAliases: string[],
|
||||||
connectedAccountId: string,
|
connectedAccountId: string,
|
||||||
workspaceId: string,
|
workspaceId: string,
|
||||||
transactionManager?: EntityManager,
|
transactionManager?: EntityManager,
|
||||||
@ -317,9 +317,9 @@ export class ConnectedAccountRepository {
|
|||||||
this.workspaceDataSourceService.getSchemaName(workspaceId);
|
this.workspaceDataSourceService.getSchemaName(workspaceId);
|
||||||
|
|
||||||
await this.workspaceDataSourceService.executeRawQuery(
|
await this.workspaceDataSourceService.executeRawQuery(
|
||||||
`UPDATE ${dataSourceSchema}."connectedAccount" SET "emailAliases" = $1 WHERE "id" = $2`,
|
`UPDATE ${dataSourceSchema}."connectedAccount" SET "handleAliases" = $1 WHERE "id" = $2`,
|
||||||
// TODO: modify emailAliases to be of fieldmetadatatype array
|
// TODO: modify handleAliases to be of fieldmetadatatype array
|
||||||
[emailAliases.join(','), connectedAccountId],
|
[handleAliases.join(','), connectedAccountId],
|
||||||
workspaceId,
|
workspaceId,
|
||||||
transactionManager,
|
transactionManager,
|
||||||
);
|
);
|
||||||
|
|||||||
@ -1,25 +1,25 @@
|
|||||||
import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/relation.interface';
|
import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/relation.interface';
|
||||||
|
|
||||||
|
import { FeatureFlagKeys } from 'src/engine/core-modules/feature-flag/feature-flag.entity';
|
||||||
import { FieldMetadataType } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
|
import { FieldMetadataType } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
|
||||||
import {
|
import {
|
||||||
RelationMetadataType,
|
RelationMetadataType,
|
||||||
RelationOnDeleteAction,
|
RelationOnDeleteAction,
|
||||||
} from 'src/engine/metadata-modules/relation-metadata/relation-metadata.entity';
|
} from 'src/engine/metadata-modules/relation-metadata/relation-metadata.entity';
|
||||||
import { CONNECTED_ACCOUNT_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 { WorkspaceMemberWorkspaceEntity } from 'src/modules/workspace-member/standard-objects/workspace-member.workspace-entity';
|
|
||||||
import { BaseWorkspaceEntity } from 'src/engine/twenty-orm/base.workspace-entity';
|
import { BaseWorkspaceEntity } from 'src/engine/twenty-orm/base.workspace-entity';
|
||||||
import { WorkspaceEntity } from 'src/engine/twenty-orm/decorators/workspace-entity.decorator';
|
import { WorkspaceEntity } from 'src/engine/twenty-orm/decorators/workspace-entity.decorator';
|
||||||
import { WorkspaceIsSystem } from 'src/engine/twenty-orm/decorators/workspace-is-system.decorator';
|
|
||||||
import { WorkspaceIsNotAuditLogged } from 'src/engine/twenty-orm/decorators/workspace-is-not-audit-logged.decorator';
|
|
||||||
import { WorkspaceField } from 'src/engine/twenty-orm/decorators/workspace-field.decorator';
|
import { WorkspaceField } from 'src/engine/twenty-orm/decorators/workspace-field.decorator';
|
||||||
import { WorkspaceRelation } from 'src/engine/twenty-orm/decorators/workspace-relation.decorator';
|
|
||||||
import { WorkspaceIsNullable } from 'src/engine/twenty-orm/decorators/workspace-is-nullable.decorator';
|
|
||||||
import { MessageChannelWorkspaceEntity } from 'src/modules/messaging/common/standard-objects/message-channel.workspace-entity';
|
|
||||||
import { FeatureFlagKeys } from 'src/engine/core-modules/feature-flag/feature-flag.entity';
|
|
||||||
import { WorkspaceGate } from 'src/engine/twenty-orm/decorators/workspace-gate.decorator';
|
import { WorkspaceGate } from 'src/engine/twenty-orm/decorators/workspace-gate.decorator';
|
||||||
|
import { WorkspaceIsNotAuditLogged } from 'src/engine/twenty-orm/decorators/workspace-is-not-audit-logged.decorator';
|
||||||
|
import { WorkspaceIsNullable } from 'src/engine/twenty-orm/decorators/workspace-is-nullable.decorator';
|
||||||
|
import { WorkspaceIsSystem } from 'src/engine/twenty-orm/decorators/workspace-is-system.decorator';
|
||||||
import { WorkspaceJoinColumn } from 'src/engine/twenty-orm/decorators/workspace-join-column.decorator';
|
import { WorkspaceJoinColumn } from 'src/engine/twenty-orm/decorators/workspace-join-column.decorator';
|
||||||
|
import { WorkspaceRelation } from 'src/engine/twenty-orm/decorators/workspace-relation.decorator';
|
||||||
|
import { CONNECTED_ACCOUNT_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 { CalendarChannelWorkspaceEntity } from 'src/modules/calendar/common/standard-objects/calendar-channel.workspace-entity';
|
import { CalendarChannelWorkspaceEntity } from 'src/modules/calendar/common/standard-objects/calendar-channel.workspace-entity';
|
||||||
|
import { MessageChannelWorkspaceEntity } from 'src/modules/messaging/common/standard-objects/message-channel.workspace-entity';
|
||||||
|
import { WorkspaceMemberWorkspaceEntity } from 'src/modules/workspace-member/standard-objects/workspace-member.workspace-entity';
|
||||||
|
|
||||||
export enum ConnectedAccountProvider {
|
export enum ConnectedAccountProvider {
|
||||||
GOOGLE = 'google',
|
GOOGLE = 'google',
|
||||||
@ -92,16 +92,16 @@ export class ConnectedAccountWorkspaceEntity extends BaseWorkspaceEntity {
|
|||||||
authFailedAt: Date | null;
|
authFailedAt: Date | null;
|
||||||
|
|
||||||
@WorkspaceField({
|
@WorkspaceField({
|
||||||
standardId: CONNECTED_ACCOUNT_STANDARD_FIELD_IDS.emailAliases,
|
standardId: CONNECTED_ACCOUNT_STANDARD_FIELD_IDS.handleAliases,
|
||||||
type: FieldMetadataType.TEXT,
|
type: FieldMetadataType.TEXT,
|
||||||
label: 'Email Aliases',
|
label: 'Handle Aliases',
|
||||||
description: 'Email Aliases',
|
description: 'Handle Aliases',
|
||||||
icon: 'IconMail',
|
icon: 'IconMail',
|
||||||
})
|
})
|
||||||
@WorkspaceGate({
|
@WorkspaceGate({
|
||||||
featureFlag: FeatureFlagKeys.IsMessagingAliasFetchingEnabled,
|
featureFlag: FeatureFlagKeys.IsMessagingAliasFetchingEnabled,
|
||||||
})
|
})
|
||||||
emailAliases: string;
|
handleAliases: string;
|
||||||
|
|
||||||
@WorkspaceRelation({
|
@WorkspaceRelation({
|
||||||
standardId: CONNECTED_ACCOUNT_STANDARD_FIELD_IDS.accountOwner,
|
standardId: CONNECTED_ACCOUNT_STANDARD_FIELD_IDS.accountOwner,
|
||||||
|
|||||||
@ -117,7 +117,7 @@ export class MessagingMessageService {
|
|||||||
|
|
||||||
const messageDirection =
|
const messageDirection =
|
||||||
connectedAccount.handle === message.fromHandle ||
|
connectedAccount.handle === message.fromHandle ||
|
||||||
connectedAccount.emailAliases?.includes(message.fromHandle)
|
connectedAccount.handleAliases?.includes(message.fromHandle)
|
||||||
? 'outgoing'
|
? 'outgoing'
|
||||||
: 'incoming';
|
: 'incoming';
|
||||||
|
|
||||||
|
|||||||
@ -115,7 +115,7 @@ export class MessagingGmailMessagesImportService {
|
|||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
try {
|
try {
|
||||||
await this.emailAliasManagerService.refreshEmailAliases(
|
await this.emailAliasManagerService.refreshHandleAliases(
|
||||||
connectedAccount,
|
connectedAccount,
|
||||||
workspaceId,
|
workspaceId,
|
||||||
);
|
);
|
||||||
|
|||||||
@ -53,7 +53,7 @@ export class MessagingSaveMessagesAndEnqueueContactCreationService {
|
|||||||
workspaceId,
|
workspaceId,
|
||||||
);
|
);
|
||||||
|
|
||||||
const emailAliases = connectedAccount.emailAliases?.split(',') || [];
|
const handleAliases = connectedAccount.handleAliases?.split(',') || [];
|
||||||
|
|
||||||
let savedMessageParticipants: MessageParticipantWorkspaceEntity[] = [];
|
let savedMessageParticipants: MessageParticipantWorkspaceEntity[] = [];
|
||||||
|
|
||||||
@ -80,10 +80,11 @@ export class MessagingSaveMessagesAndEnqueueContactCreationService {
|
|||||||
'';
|
'';
|
||||||
|
|
||||||
const isMessageSentByConnectedAccount =
|
const isMessageSentByConnectedAccount =
|
||||||
emailAliases.includes(fromHandle);
|
handleAliases.includes(fromHandle) ||
|
||||||
|
fromHandle === connectedAccount.handle;
|
||||||
|
|
||||||
const isParticipantConnectedAccount =
|
const isParticipantConnectedAccount =
|
||||||
emailAliases.includes(participant.handle) ||
|
handleAliases.includes(participant.handle) ||
|
||||||
participant.handle === connectedAccount.handle;
|
participant.handle === connectedAccount.handle;
|
||||||
|
|
||||||
const isExcludedByNonProfessionalEmails =
|
const isExcludedByNonProfessionalEmails =
|
||||||
|
|||||||
Reference in New Issue
Block a user