diff --git a/packages/basic.gblib/services/DialogKeywords.ts b/packages/basic.gblib/services/DialogKeywords.ts index dd70cf36..58eac13a 100644 --- a/packages/basic.gblib/services/DialogKeywords.ts +++ b/packages/basic.gblib/services/DialogKeywords.ts @@ -530,7 +530,11 @@ export class DialogKeywords { public async sendEmail({ pid, to, subject, body }) { const { min, user } = await DialogKeywords.getProcessInfo(pid); - if (!body) { + if (!process.env.EMAIL_FROM){ + return; + } + + if (!body ) { body = ""; }; diff --git a/packages/basic.gblib/services/GBVMService.ts b/packages/basic.gblib/services/GBVMService.ts index a598c1a9..89c8691d 100644 --- a/packages/basic.gblib/services/GBVMService.ts +++ b/packages/basic.gblib/services/GBVMService.ts @@ -638,11 +638,12 @@ export class GBVMService extends GBService { // Expires token 10min. before or if it the first time, load it. if (expiration < new Date().getTime() || firstTime) { - console.log ('Expired. Refreshing token...'); + console.log (Expired. Refreshing token...' + expiration); const {token, expiresOn} = await sys.getCustomToken({pid, tokenName}); global[tokenName] = token; global[tokenName + "_expiresOn"]= expiresOn; + console.log (DONE:' + new Date(global[tokenName + "_expiresOn"]);; } if (__indexer == 0) { diff --git a/packages/basic.gblib/services/KeywordsExpressions.ts b/packages/basic.gblib/services/KeywordsExpressions.ts index 431b1c1f..34199205 100644 --- a/packages/basic.gblib/services/KeywordsExpressions.ts +++ b/packages/basic.gblib/services/KeywordsExpressions.ts @@ -40,7 +40,6 @@ import Path from 'path'; * Image processing services of conversation to be called by BASIC. */ export class KeywordsExpressions { - public static splitParamsButIgnoreCommasInDoublequotes = (str: string) => { return str.split(',').reduce( (accum, curr) => { @@ -50,7 +49,7 @@ export class KeywordsExpressions { if (curr === '') { curr = null; } - accum.soFar.push(curr); + accum.soFar.push(curr?curr.trim(): ''); } if (curr.split('`').length % 2 == 0) { accum.isConcatting = !accum.isConcatting; @@ -61,9 +60,7 @@ export class KeywordsExpressions { ).soFar; }; - private static getParams = (text: string, names) => { - const items = KeywordsExpressions.splitParamsButIgnoreCommasInDoublequotes(text); let i = 0; @@ -104,12 +101,10 @@ export class KeywordsExpressions { keywords[i++] = [ /^\s*INPUT(.*)/gim, ($0, $1, $2) => { - let separator; if ($1.indexOf(',') > -1) { separator = ','; - } - else if ($1.indexOf(';') > -1) { + } else if ($1.indexOf(';') > -1) { separator = ';'; } let parts; @@ -117,8 +112,7 @@ export class KeywordsExpressions { return ` TALK ${parts[0]} HEAR ${parts[1]}`; - } - else { + } else { return ` HEAR ${$1}`; } @@ -158,8 +152,7 @@ export class KeywordsExpressions { let separator; if ($1.indexOf(',') > -1) { separator = ','; - } - else if ($1.indexOf(';') > -1) { + } else if ($1.indexOf(';') > -1) { separator = ';'; } let items; @@ -205,9 +198,8 @@ export class KeywordsExpressions { if (kind === 'AS' && KeywordsExpressions.isNumber(sessionName)) { const jParams = JSON.parse(`{${params}}`); - const filename = `${jParams.url.substr(0, jParams.url.lastIndexOf("."))}.xlsx`; - let code = - ` + const filename = `${jParams.url.substr(0, jParams.url.lastIndexOf('.'))}.xlsx`; + let code = ` col = 1 await sys.save({pid: pid,file: "${filename}", args: [id] }) await dk.setFilter ({pid: pid, value: "id=" + id }) @@ -255,7 +247,6 @@ export class KeywordsExpressions { keywords[i++] = [/^\s*for +(.*to.*)/gim, 'for ($1) {']; - keywords[i++] = [ /^\s*((?:[a-z]+.?)(?:(?:\w+).)(?:\w+)*)\s*=\s*pay\s*(.*)/gim, ($0, $1, $2, $3) => { @@ -342,7 +333,6 @@ export class KeywordsExpressions { keywords[i++] = [ /^\s*FOR EACH\s*(.*)\s*IN\s*(.*)/gim, ($0, $1, $2) => { - return ` __totalCalls = 10; @@ -366,9 +356,9 @@ export class KeywordsExpressions { } ]; - keywords[i++] = [/^\s*next *$/gim, + keywords[i++] = [ + /^\s*next *$/gim, ($0, $1, $2) => { - return ` __index = __index + 1; @@ -411,6 +401,64 @@ export class KeywordsExpressions { } ]; + keywords[i++] = [ + /^\s*synchronize\s*(.*)/gim, + ($0, $1) => { + const items = KeywordsExpressions.splitParamsButIgnoreCommasInDoublequotes($1); + const [url, tableName, key1, pageVariable, limitVariable] = items; + + return ` + + if (!limit) limit = 100; + __page = 1 + while (__page > 0 && __page < pages) { + + await retry( + async (bail) => { + await ensureTokens(); + __res = await sys.getHttp ({pid: pid, file: host + '${url}' + '?' + pageVariable + '=' + __page + '&' + limitVariable + '=' + limit, addressOrHeaders: headers, httpUsername, httpPs}) + },{ retries: 5}); + + res = __res + list1 = res.data + + + let j1 = 0 + items1 = [] + while (j1 < ubound(list1)) { + detail_id = caseInsensitive(list1[j1])['${key1}'] + + await retry( + async (bail) => { + await ensureTokens(); + __res = await sys.getHttp ({pid: pid, file: host + '${url}' + '/' + detail_id, addressOrHeaders: headers, httpUsername, httpPs}) + },{ retries: 5}); + + res = __res + + items1[j1] = res.data + + j1 = j1 + 1 + } + __reportMerge1 = await sys.merge({pid: pid, file: '${tableName}' , data: items1 , key1: '${key1}'}) + + __reportMerge.adds += __reportMerge1.adds; + __reportMerge.updates += __reportMerge1.updates; + __reportMerge.skipped += __reportMerge1.skipped; + __reportMerge.title = __reportMerge1.title; + REPORT = __report(); + + __page = __page + 1 + + if (list1?.length < limit) { + __page = 0 + } + } + + + `; + } + ]; keywords[i++] = [ /^\s*(.*)\=\s*(REWRITE)(\s*)(.*)/gim, @@ -451,8 +499,7 @@ export class KeywordsExpressions { if (params[1]) { return `await sys.deleteFromStorage ({pid: pid, ${params}})`; - } - else { + } else { return `await sys.deleteFile ({pid: pid, ${params}})`; } } @@ -865,7 +912,6 @@ export class KeywordsExpressions { keywords[i++] = [ /^\s*((?:[a-z]+.?)(?:(?:\w+).)(?:\w+)*)\s*=\s*post\s*(.*)/gim, ($0, $1, $2, $3) => { - const args = $2.split(','); return ` @@ -972,13 +1018,12 @@ export class KeywordsExpressions { keywords[i++] = [ /^\s*(talk)(\s*)(.*)/gim, ($0, $1, $2, $3) => { - $3 = GBVMService.normalizeQuotes($3); // // Uses auto quote if this is a phrase with more then one word. if (!($3.trim().substr(0, 1) === '`' || $3.trim().substr(0, 1) === "'")) { - $3 = "`" + $3 + "`"; + $3 = '`' + $3 + '`'; } return `await dk.talk ({pid: pid, text: ${$3}})`; } @@ -1214,12 +1259,11 @@ export class KeywordsExpressions { let index = 0; fields.forEach(field => { - - // Extracts only the last part of the variable like 'column' + // Extracts only the last part of the variable like 'column' // from 'row.column'. const fieldRegExp = /(?:.*\.)*(.*)/gim; - let name = fieldRegExp.exec(field.trim())[1] + let name = fieldRegExp.exec(field.trim())[1]; fieldsNamesOnly.push(`'${name}'`); }); diff --git a/packages/basic.gblib/services/SystemKeywords.ts b/packages/basic.gblib/services/SystemKeywords.ts index addfb471..0b6c367b 100644 --- a/packages/basic.gblib/services/SystemKeywords.ts +++ b/packages/basic.gblib/services/SystemKeywords.ts @@ -751,7 +751,7 @@ export class SystemKeywords { { retries: 5, onRetry: err => { - GBLog.error(`Retrying SaveToStorageBatch due to: ${err.message}.`); + GBLog.error(`Retrying SaveToStorageBatch due to: ${JSON.stringify(err)}.`); } } );