3202 fetch emails by threads (#3214)

* change fetchAllByBatches and fetchBatch to allow messages and threads to be fetched by batches

* wip

* format threads batches

* command is working

* command is working

* fix typing

* updates
This commit is contained in:
bosiraphael
2024-01-03 15:01:22 +01:00
committed by GitHub
parent ea06f04350
commit 67fca68480
7 changed files with 198 additions and 108 deletions

View File

@ -9,7 +9,7 @@ import { EnvironmentService } from 'src/integrations/environment/environment.ser
import { DataSourceService } from 'src/metadata/data-source/data-source.service';
import { FetchBatchMessagesService } from 'src/workspace/messaging/services/fetch-batch-messages.service';
import { GmailMessage } from 'src/workspace/messaging/types/gmailMessage';
import { MessageQuery } from 'src/workspace/messaging/types/messageQuery';
import { MessageOrThreadQuery } from 'src/workspace/messaging/types/messageOrThreadQuery';
import { DataSourceEntity } from 'src/metadata/data-source/data-source.entity';
@Injectable()
@ -26,10 +26,6 @@ export class FetchWorkspaceMessagesService {
workspaceId,
'20202020-0687-4c41-b707-ed1bfca972a7',
);
await this.fetchWorkspaceMemberMessages(
workspaceId,
'20202020-0687-4c41-b707-ed1bfca972a7',
);
}
async fetchWorkspaceMemberThreads(
@ -59,6 +55,7 @@ export class FetchWorkspaceMessagesService {
throw new Error('No connected account found');
}
const accessToken = connectedAccounts[0]?.accessToken;
const refreshToken = connectedAccounts[0]?.refreshToken;
if (!refreshToken) {
@ -74,7 +71,7 @@ export class FetchWorkspaceMessagesService {
const threadsData = threads.data.threads;
if (!threadsData) {
if (!threadsData || threadsData?.length === 0) {
return;
}
@ -84,61 +81,29 @@ export class FetchWorkspaceMessagesService {
workspaceDataSource,
connectedAccounts[0].id,
);
}
async fetchWorkspaceMemberMessages(
workspaceId: string,
workspaceMemberId: string,
maxResults = 500,
): Promise<void> {
const dataSourceMetadata =
await this.dataSourceService.getLastDataSourceMetadataFromWorkspaceIdOrFail(
workspaceId,
);
const workspaceDataSource = await this.typeORMService.connectToDataSource(
dataSourceMetadata,
);
if (!workspaceDataSource) {
throw new Error('No workspace data source found');
}
const connectedAccounts = await workspaceDataSource?.query(
`SELECT * FROM ${dataSourceMetadata.schema}."connectedAccount" WHERE "provider" = 'gmail' AND "accountOwnerId" = $1`,
[workspaceMemberId],
);
if (!connectedAccounts || connectedAccounts.length === 0) {
throw new Error('No connected account found');
}
const accessToken = connectedAccounts[0]?.accessToken;
const refreshToken = connectedAccounts[0]?.refreshToken;
if (!accessToken || !refreshToken) {
throw new Error('No access token or refresh token found');
}
const gmailClient = await this.getGmailClient(refreshToken);
const messages = await gmailClient.users.messages.list({
userId: 'me',
maxResults,
});
const messagesData = messages.data.messages;
if (!messagesData || messagesData?.length === 0) {
return;
}
const messageQueries: MessageQuery[] = messagesData.map((message) => ({
uri: '/gmail/v1/users/me/messages/' + message.id + '?format=RAW',
const threadQueries: MessageOrThreadQuery[] = threadsData.map((thread) => ({
uri: '/gmail/v1/users/me/threads/' + thread.id + '?format=minimal',
}));
const threadsWithMessageIds =
await this.fetchBatchMessagesService.fetchAllThreads(
threadQueries,
accessToken,
);
const messageIds = threadsWithMessageIds
.map((thread) => thread.messageIds)
.flat();
const messageQueries: MessageOrThreadQuery[] = messageIds.map(
(messageId) => ({
uri: '/gmail/v1/users/me/messages/' + messageId + '?format=RAW',
}),
);
const messagesResponse =
await this.fetchBatchMessagesService.fetchAllByBatches(
await this.fetchBatchMessagesService.fetchAllMessages(
messageQueries,
accessToken,
);