From 2d8ac4b477f8fb381a35eba34710084d5e4d3402 Mon Sep 17 00:00:00 2001 From: Tom <19203795+that-one-tom@users.noreply.github.com> Date: Sun, 13 Mar 2022 10:45:26 +0100 Subject: [PATCH] fix(SeaTableTrigger Node): Fix timezone issues (#2726) * SeaTable: Add timezone field to credentials, make trigger query timezone-aware * :zap: replaced string input with options for timezone, small fixes * :zap: small fixes Co-authored-by: Michael Kret --- .../credentials/SeaTableApi.credentials.ts | 19 +++++++++++++++++++ .../nodes/SeaTable/SeaTableTrigger.node.ts | 17 ++++++++++++----- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/packages/nodes-base/credentials/SeaTableApi.credentials.ts b/packages/nodes-base/credentials/SeaTableApi.credentials.ts index e521cc6e0ca12..01805c19ad067 100644 --- a/packages/nodes-base/credentials/SeaTableApi.credentials.ts +++ b/packages/nodes-base/credentials/SeaTableApi.credentials.ts @@ -1,8 +1,17 @@ import { ICredentialType, INodeProperties, + INodePropertyOptions, } from 'n8n-workflow'; +import * as moment from 'moment-timezone'; + +// Get options for timezones +const timezones: INodePropertyOptions[] = moment.tz.countries().reduce( (timezones: INodePropertyOptions[], country: string) => { + const zonesForCountry = moment.tz.zonesForCountry(country).map(zone => ({value: zone, name: zone})); + return timezones.concat(zonesForCountry); +}, []); + export class SeaTableApi implements ICredentialType { name = 'seaTableApi'; displayName = 'SeaTable API'; @@ -44,5 +53,15 @@ export class SeaTableApi implements ICredentialType { type: 'string', default: '', }, + { + displayName: 'Timezone', + name: 'timezone', + type: 'options', + default: 'Europe/Berlin', + description: `Seatable server's timezone`, + options: [ + ...timezones, + ], + }, ]; } diff --git a/packages/nodes-base/nodes/SeaTable/SeaTableTrigger.node.ts b/packages/nodes-base/nodes/SeaTable/SeaTableTrigger.node.ts index ca0294568300a..34a6cfb6a11e0 100644 --- a/packages/nodes-base/nodes/SeaTable/SeaTableTrigger.node.ts +++ b/packages/nodes-base/nodes/SeaTable/SeaTableTrigger.node.ts @@ -3,6 +3,7 @@ import { } from 'n8n-core'; import { + IDataObject, ILoadOptionsFunctions, INodeExecutionData, INodePropertyOptions, @@ -108,13 +109,12 @@ export class SeaTableTrigger implements INodeType { const simple = this.getNodeParameter('simple') as boolean; const event = this.getNodeParameter('event') as string; const ctx: ICtx = {}; + const credentials = await this.getCredentials('seaTableApi') as IDataObject; + const timezone = credentials.timezone as string || 'Europe/Berlin'; const now = moment().utc().format(); - const startDate = webhookData.lastTimeChecked as string || now; - const endDate = now; - webhookData.lastTimeChecked = endDate; let rows; @@ -126,8 +126,15 @@ export class SeaTableTrigger implements INodeType { if (this.getMode() === 'manual') { rows = await seaTableApiRequest.call(this, ctx, 'POST', endpoint, { sql: `SELECT * FROM ${tableName} LIMIT 1` }) as IRowResponse; } else { - rows = await seaTableApiRequest.call(this, ctx, 'POST', endpoint, - { sql: `SELECT * FROM ${tableName} WHERE ${filterField} BETWEEN "${moment(startDate).utc().format('YYYY-MM-D HH:mm:ss')}" AND "${moment(endDate).utc().format('YYYY-MM-D HH:mm:ss')}"` }) as IRowResponse; + rows = (await seaTableApiRequest.call(this, ctx, 'POST', endpoint, { + sql: `SELECT * FROM ${tableName} + WHERE ${filterField} BETWEEN "${moment(startDate) + .tz(timezone) + .format('YYYY-MM-D HH:mm:ss')}" + AND "${moment(endDate) + .tz(timezone) + .format('YYYY-MM-D HH:mm:ss')}"`, + })) as IRowResponse; } let response;