Skip to content

Commit

Permalink
fix(Gmail Trigger Node): Trigger node missing some emails
Browse files Browse the repository at this point in the history
  • Loading branch information
michael-radency authored Dec 5, 2022
1 parent e07e32f commit 67aad63
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 15 deletions.
27 changes: 15 additions & 12 deletions packages/nodes-base/nodes/Google/Gmail/GenericFunctions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -166,19 +166,13 @@ export async function parseRawEmail(
dataPropertyNameDownload: string,
): Promise<INodeExecutionData> {
const messageEncoded = Buffer.from(messageData.raw, 'base64').toString('utf8');
let responseData = await simpleParser(messageEncoded);
const responseData = await simpleParser(messageEncoded);

const headers: IDataObject = {};
// @ts-ignore
for (const header of responseData.headerLines) {
headers[header.key] = header.line;
}

// @ts-ignore
responseData.headers = headers;
// @ts-ignore
responseData.headerLines = undefined;

const binaryData: IBinaryKeyData = {};
if (responseData.attachments) {
const downloadAttachments = this.getNodeParameter(
Expand All @@ -196,23 +190,24 @@ export async function parseRawEmail(
);
}
}
// @ts-ignore
responseData.attachments = undefined;
}

const mailBaseData: IDataObject = {};

const resolvedModeAddProperties = ['id', 'threadId', 'labelIds', 'sizeEstimate'];

for (const key of resolvedModeAddProperties) {
// @ts-ignore
mailBaseData[key] = messageData[key];
}

responseData = Object.assign(mailBaseData, responseData);
const json = Object.assign({}, mailBaseData, responseData, {
headers,
headerLines: undefined,
attachments: undefined,
}) as IDataObject;

return {
json: responseData as unknown as IDataObject,
json,
binary: Object.keys(binaryData).length ? binaryData : undefined,
} as INodeExecutionData;
}
Expand Down Expand Up @@ -390,6 +385,14 @@ export function prepareQuery(
let timestamp = DateTime.fromISO(qs.receivedAfter as string).toSeconds();
const timestampLengthInMilliseconds1990 = 12;

if (
!timestamp &&
typeof qs.receivedAfter === 'number' &&
qs.receivedAfter.toString().length < timestampLengthInMilliseconds1990
) {
timestamp = qs.receivedAfter;
}

if (!timestamp && (qs.receivedAfter as string).length < timestampLengthInMilliseconds1990) {
timestamp = parseInt(qs.receivedAfter as string, 10);
}
Expand Down
37 changes: 34 additions & 3 deletions packages/nodes-base/nodes/Google/Gmail/GmailTrigger.node.ts
Original file line number Diff line number Diff line change
Expand Up @@ -194,8 +194,8 @@ export class GmailTrigger implements INodeType {
let responseData;

const now = Math.floor(DateTime.now().toSeconds()) + '';
const startDate = (webhookData.lastTimeChecked as string) || now;
const endDate = now;
const startDate = (webhookData.lastTimeChecked as string) || +now;
const endDate = +now;

const options = this.getNodeParameter('options', {}) as IDataObject;
const filters = this.getNodeParameter('filters', {}) as IDataObject;
Expand Down Expand Up @@ -273,7 +273,38 @@ export class GmailTrigger implements INodeType {
);
}

webhookData.lastTimeChecked = endDate;
const getEmailDateAsSeconds = (email: IDataObject) => {
const { internalDate, date } = email;
return internalDate
? +(internalDate as string) / 1000
: +DateTime.fromJSDate(new Date(date as string)).toSeconds();
};

const lastEmailDate = (responseData as IDataObject[]).reduce((lastDate, { json }) => {
const emailDate = getEmailDateAsSeconds(json as IDataObject);
return emailDate > lastDate ? emailDate : lastDate;
}, 0);

const nextPollPossibleDuplicates = (responseData as IDataObject[]).reduce(
(duplicates, { json }) => {
const emailDate = getEmailDateAsSeconds(json as IDataObject);
return emailDate === lastEmailDate
? duplicates.concat((json as IDataObject).id as string)
: duplicates;
},
[] as string[],
);

const possibleDuplicates = (webhookData.possibleDuplicates as string[]) || [];
if (possibleDuplicates.length) {
responseData = (responseData as IDataObject[]).filter(({ json }) => {
const { id } = json as IDataObject;
return !possibleDuplicates.includes(id as string);
});
}

webhookData.possibleDuplicates = nextPollPossibleDuplicates;
webhookData.lastTimeChecked = lastEmailDate || endDate;

if (Array.isArray(responseData) && responseData.length) {
return [responseData as INodeExecutionData[]];
Expand Down

0 comments on commit 67aad63

Please sign in to comment.