HandleAlias (#10156)
If a user has microsoft aliases, they will be taken into account, in a similar way as we did for google
This commit is contained in:
@ -0,0 +1,41 @@
|
|||||||
|
import { Injectable } from '@nestjs/common';
|
||||||
|
|
||||||
|
import { ConnectedAccountWorkspaceEntity } from 'src/modules/connected-account/standard-objects/connected-account.workspace-entity';
|
||||||
|
import { MicrosoftClientProvider } from 'src/modules/messaging/message-import-manager/drivers/microsoft/providers/microsoft-client.provider';
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class MicrosoftEmailAliasManagerService {
|
||||||
|
constructor(
|
||||||
|
private readonly microsoftClientProvider: MicrosoftClientProvider,
|
||||||
|
) {}
|
||||||
|
|
||||||
|
public async getHandleAliases(
|
||||||
|
connectedAccount: ConnectedAccountWorkspaceEntity,
|
||||||
|
) {
|
||||||
|
const microsoftClient =
|
||||||
|
await this.microsoftClientProvider.getMicrosoftClient(connectedAccount);
|
||||||
|
|
||||||
|
const response = await microsoftClient
|
||||||
|
.api('/me?$select=proxyAddresses')
|
||||||
|
.get()
|
||||||
|
.catch((error) => {
|
||||||
|
throw new Error(`Failed to fetch email aliases: ${error.message}`);
|
||||||
|
});
|
||||||
|
|
||||||
|
const proxyAddresses = response.proxyAddresses;
|
||||||
|
|
||||||
|
const handleAliases =
|
||||||
|
proxyAddresses
|
||||||
|
?.filter((address) => {
|
||||||
|
return address.startsWith('SMTP:') === false;
|
||||||
|
})
|
||||||
|
.map((address) => {
|
||||||
|
return address.replace('smtp:', '').toLowerCase();
|
||||||
|
})
|
||||||
|
.filter((address) => {
|
||||||
|
return address !== '';
|
||||||
|
}) || [];
|
||||||
|
|
||||||
|
return handleAliases;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,9 @@
|
|||||||
|
export const microsoftGraphMeResponseWithProxyAddresses = {
|
||||||
|
'@odata.context':
|
||||||
|
'https://graph.microsoft.com/v1.0/$metadata#users(proxyAddresses)/$entity',
|
||||||
|
proxyAddresses: [
|
||||||
|
'SMTP:bertrand1@domain.onmicrosoft.com',
|
||||||
|
'smtp:bertrand2@domain.onmicrosoft.com',
|
||||||
|
'smtp:bertrand3@otherdomain.com',
|
||||||
|
],
|
||||||
|
};
|
||||||
@ -1,12 +1,19 @@
|
|||||||
import { Module } from '@nestjs/common';
|
import { Module } from '@nestjs/common';
|
||||||
|
|
||||||
import { GoogleEmailAliasManagerService } from 'src/modules/connected-account/email-alias-manager/drivers/google/google-email-alias-manager.service';
|
import { GoogleEmailAliasManagerService } from 'src/modules/connected-account/email-alias-manager/drivers/google/google-email-alias-manager.service';
|
||||||
|
import { MicrosoftEmailAliasManagerService } from 'src/modules/connected-account/email-alias-manager/drivers/microsoft/microsoft-email-alias-manager.service';
|
||||||
import { EmailAliasManagerService } from 'src/modules/connected-account/email-alias-manager/services/email-alias-manager.service';
|
import { EmailAliasManagerService } from 'src/modules/connected-account/email-alias-manager/services/email-alias-manager.service';
|
||||||
import { OAuth2ClientManagerModule } from 'src/modules/connected-account/oauth2-client-manager/oauth2-client-manager.module';
|
import { OAuth2ClientManagerModule } from 'src/modules/connected-account/oauth2-client-manager/oauth2-client-manager.module';
|
||||||
|
import { MicrosoftClientProvider } from 'src/modules/messaging/message-import-manager/drivers/microsoft/providers/microsoft-client.provider';
|
||||||
|
|
||||||
@Module({
|
@Module({
|
||||||
imports: [OAuth2ClientManagerModule],
|
imports: [OAuth2ClientManagerModule],
|
||||||
providers: [EmailAliasManagerService, GoogleEmailAliasManagerService],
|
providers: [
|
||||||
|
EmailAliasManagerService,
|
||||||
|
GoogleEmailAliasManagerService,
|
||||||
|
MicrosoftEmailAliasManagerService,
|
||||||
|
MicrosoftClientProvider,
|
||||||
|
],
|
||||||
exports: [EmailAliasManagerService],
|
exports: [EmailAliasManagerService],
|
||||||
})
|
})
|
||||||
export class EmailAliasManagerModule {}
|
export class EmailAliasManagerModule {}
|
||||||
|
|||||||
@ -0,0 +1,102 @@
|
|||||||
|
import { Test, TestingModule } from '@nestjs/testing';
|
||||||
|
|
||||||
|
import { ConnectedAccountProvider } from 'twenty-shared';
|
||||||
|
import { Repository } from 'typeorm';
|
||||||
|
|
||||||
|
import { TwentyORMManager } from 'src/engine/twenty-orm/twenty-orm.manager';
|
||||||
|
import { GoogleEmailAliasManagerService } from 'src/modules/connected-account/email-alias-manager/drivers/google/google-email-alias-manager.service';
|
||||||
|
import { MicrosoftEmailAliasManagerService } from 'src/modules/connected-account/email-alias-manager/drivers/microsoft/microsoft-email-alias-manager.service';
|
||||||
|
import { microsoftGraphMeResponseWithProxyAddresses } from 'src/modules/connected-account/email-alias-manager/drivers/microsoft/mocks/microsoft-api-examples';
|
||||||
|
import { ConnectedAccountWorkspaceEntity } from 'src/modules/connected-account/standard-objects/connected-account.workspace-entity';
|
||||||
|
import { MicrosoftClientProvider } from 'src/modules/messaging/message-import-manager/drivers/microsoft/providers/microsoft-client.provider';
|
||||||
|
|
||||||
|
import { EmailAliasManagerService } from './email-alias-manager.service';
|
||||||
|
|
||||||
|
describe('Email Alias Manager Service', () => {
|
||||||
|
let emailAliasManagerService: EmailAliasManagerService;
|
||||||
|
let microsoftEmailAliasManagerService: MicrosoftEmailAliasManagerService;
|
||||||
|
let connectedAccountRepository: Partial<
|
||||||
|
Repository<ConnectedAccountWorkspaceEntity>
|
||||||
|
>;
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
|
connectedAccountRepository = {
|
||||||
|
update: jest.fn().mockResolvedValue((arg) => arg),
|
||||||
|
};
|
||||||
|
|
||||||
|
const module: TestingModule = await Test.createTestingModule({
|
||||||
|
providers: [
|
||||||
|
{
|
||||||
|
provide: TwentyORMManager,
|
||||||
|
useValue: {
|
||||||
|
getRepository: jest
|
||||||
|
.fn()
|
||||||
|
.mockResolvedValue(connectedAccountRepository),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
EmailAliasManagerService,
|
||||||
|
{
|
||||||
|
provide: GoogleEmailAliasManagerService,
|
||||||
|
useValue: {},
|
||||||
|
},
|
||||||
|
MicrosoftEmailAliasManagerService,
|
||||||
|
{
|
||||||
|
provide: MicrosoftClientProvider,
|
||||||
|
useValue: {
|
||||||
|
getMicrosoftClient: jest.fn().mockResolvedValue({
|
||||||
|
api: jest.fn().mockReturnValue({
|
||||||
|
get: jest
|
||||||
|
.fn()
|
||||||
|
.mockResolvedValue(
|
||||||
|
microsoftGraphMeResponseWithProxyAddresses,
|
||||||
|
),
|
||||||
|
}),
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}).compile();
|
||||||
|
|
||||||
|
emailAliasManagerService = module.get<EmailAliasManagerService>(
|
||||||
|
EmailAliasManagerService,
|
||||||
|
);
|
||||||
|
microsoftEmailAliasManagerService =
|
||||||
|
module.get<MicrosoftEmailAliasManagerService>(
|
||||||
|
MicrosoftEmailAliasManagerService,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('Service should be defined', () => {
|
||||||
|
expect(emailAliasManagerService).toBeDefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('Refresh handle aliases for Microsoft', () => {
|
||||||
|
it('Should refresh Microsoft handle aliases successfully', async () => {
|
||||||
|
const mockConnectedAccount: Partial<ConnectedAccountWorkspaceEntity> = {
|
||||||
|
id: 'test-id',
|
||||||
|
provider: ConnectedAccountProvider.MICROSOFT,
|
||||||
|
refreshToken: 'test-refresh-token',
|
||||||
|
};
|
||||||
|
|
||||||
|
const expectedAliases =
|
||||||
|
'bertrand2@domain.onmicrosoft.com,bertrand3@otherdomain.com';
|
||||||
|
|
||||||
|
jest.spyOn(microsoftEmailAliasManagerService, 'getHandleAliases');
|
||||||
|
|
||||||
|
await emailAliasManagerService.refreshHandleAliases(
|
||||||
|
mockConnectedAccount as ConnectedAccountWorkspaceEntity,
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(
|
||||||
|
microsoftEmailAliasManagerService.getHandleAliases,
|
||||||
|
).toHaveBeenCalledWith(mockConnectedAccount);
|
||||||
|
|
||||||
|
expect(connectedAccountRepository.update).toHaveBeenCalledWith(
|
||||||
|
{ id: mockConnectedAccount.id },
|
||||||
|
{
|
||||||
|
handleAliases: expectedAliases,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
@ -2,12 +2,14 @@ import { Injectable } from '@nestjs/common';
|
|||||||
|
|
||||||
import { TwentyORMManager } from 'src/engine/twenty-orm/twenty-orm.manager';
|
import { TwentyORMManager } from 'src/engine/twenty-orm/twenty-orm.manager';
|
||||||
import { GoogleEmailAliasManagerService } from 'src/modules/connected-account/email-alias-manager/drivers/google/google-email-alias-manager.service';
|
import { GoogleEmailAliasManagerService } from 'src/modules/connected-account/email-alias-manager/drivers/google/google-email-alias-manager.service';
|
||||||
|
import { MicrosoftEmailAliasManagerService } from 'src/modules/connected-account/email-alias-manager/drivers/microsoft/microsoft-email-alias-manager.service';
|
||||||
import { ConnectedAccountWorkspaceEntity } from 'src/modules/connected-account/standard-objects/connected-account.workspace-entity';
|
import { ConnectedAccountWorkspaceEntity } from 'src/modules/connected-account/standard-objects/connected-account.workspace-entity';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class EmailAliasManagerService {
|
export class EmailAliasManagerService {
|
||||||
constructor(
|
constructor(
|
||||||
private readonly googleEmailAliasManagerService: GoogleEmailAliasManagerService,
|
private readonly googleEmailAliasManagerService: GoogleEmailAliasManagerService,
|
||||||
|
private readonly microsoftEmailAliasManagerService: MicrosoftEmailAliasManagerService,
|
||||||
private readonly twentyORMManager: TwentyORMManager,
|
private readonly twentyORMManager: TwentyORMManager,
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
@ -18,7 +20,11 @@ export class EmailAliasManagerService {
|
|||||||
|
|
||||||
switch (connectedAccount.provider) {
|
switch (connectedAccount.provider) {
|
||||||
case 'microsoft':
|
case 'microsoft':
|
||||||
return;
|
handleAliases =
|
||||||
|
await this.microsoftEmailAliasManagerService.getHandleAliases(
|
||||||
|
connectedAccount,
|
||||||
|
);
|
||||||
|
break;
|
||||||
case 'google':
|
case 'google':
|
||||||
handleAliases =
|
handleAliases =
|
||||||
await this.googleEmailAliasManagerService.getHandleAliases(
|
await this.googleEmailAliasManagerService.getHandleAliases(
|
||||||
|
|||||||
Reference in New Issue
Block a user