new(basic.gblib): #300 FIND custom SET FILTER TYPE new keyword.

This commit is contained in:
rodrigorodriguez 2023-03-06 07:09:24 -03:00
parent 5534b416da
commit e392759d45
3 changed files with 66 additions and 55 deletions

View file

@ -556,7 +556,6 @@ export class DialogKeywords {
if (this.isUserSystemParam(name)) {
throw new Error(`Not possible to define ${name} as it is a reserved system param name.`);
}
const process = GBServer.globals.processes[pid];
let { min, user, params } = await DialogKeywords.getProcessInfo(pid);
const sec = new SecService();
await sec.setParam(user.userId, name, value);
@ -568,7 +567,6 @@ export class DialogKeywords {
if (this.isUserSystemParam(name)) {
throw new Error(`Not possible to retrieve ${name} system param.`);
}
const process = GBServer.globals.processes[pid];
let { min, user, params } = await DialogKeywords.getProcessInfo(pid);
const sec = new SecService();
return await sec.getParam(user, name);
@ -625,6 +623,17 @@ export class DialogKeywords {
await this.setOption({ pid, name: 'wholeWord', value: value });
}
/**
* Defines the FIND behaviour to consider whole words while searching.
*
* @example SET FILTER TYPE date, string
*
*/
public async setFilterTypes({ pid, types }) {
const value = types;
await this.setOption({ pid, name: 'filterTypes', value: value });
}
/**
* Defines the theme for assets generation.
*

View file

@ -292,7 +292,7 @@ export class KeywordsExpressions {
keywords[i++] = [
/^\s*((?:[a-z]+.?)(?:(?:\w+).)(?:\w+)*)\s*=\s*find\s*(.*)\s*or talk\s*(.*)/gim,
($0, $1, $2, $3) => {
return `${$1} = await sys.getFind({pid: pid, args:[${$2}])\n
return `${$1} = await sys.find({pid: pid, args:[${$2}])\n
if (!${$1}) {s
await dk.talk ({pid: pid, ${$3}})\n;
return -1;
@ -312,7 +312,7 @@ export class KeywordsExpressions {
/^\s*((?:[a-z]+.?)(?:(?:\w+).)(?:\w+)*)\s*=\s*find\s*(.*)/gim,
($0, $1, $2, $3) => {
return `
${$1} = await sys.getFind({pid: pid, args: [${$2}]})`;
${$1} = await sys.find({pid: pid, args: [${$2}]})`;
}
];

View file

@ -39,7 +39,7 @@ import { DialogKeywords } from './DialogKeywords.js';
import { GBServer } from '../../../src/app.js';
import { GBVMService } from './GBVMService.js';
import Fs from 'fs';
import { GBSSR }from '../../core.gbapp/services/GBSSR.js';
import { GBSSR } from '../../core.gbapp/services/GBSSR.js';
import urlJoin from 'url-join';
import Excel from 'exceljs';
import { TwitterApi } from 'twitter-api-v2';
@ -59,7 +59,6 @@ import * as MSAL from '@azure/msal-node';
import { GBConversationalService } from '../../core.gbapp/services/GBConversationalService.js';
import { WebAutomationServices } from './WebAutomationServices.js';
/**
* @fileoverview General Bots server core.
*/
@ -68,7 +67,6 @@ import { WebAutomationServices } from './WebAutomationServices.js';
* BASIC system class for extra manipulation of bot behaviour.
*/
export class SystemKeywords {
public async callVM({ pid, text }) {
const { min, user } = await DialogKeywords.getProcessInfo(pid);
const step = null;
@ -323,7 +321,7 @@ export class SystemKeywords {
// Checks if it is a GBFILE.
if (data.data) {
if (data.data) {
const gbfile = data.data;
let { baseUrl, client } = await GBDeployer.internalGetDriveClient(min);
@ -478,10 +476,8 @@ export class SystemKeywords {
// Handles calls for HTML stuff
if (handle) {
GBLog.info(`BASIC: Web automation SET ${file}' to '${address}' . `);
await new WebAutomationServices()
.setElementText({ pid, handle, selector: file, text: address });
await new WebAutomationServices().setElementText({ pid, handle, selector: file, text: address });
return;
}
@ -693,7 +689,7 @@ export class SystemKeywords {
* @see NPM package data-forge
*
*/
public async getFind({ pid, args }): Promise<any> {
public async find({ pid, args }): Promise<any> {
const { min, user, params } = await DialogKeywords.getProcessInfo(pid);
const file = args[0];
args.shift();
@ -834,7 +830,12 @@ export class SystemKeywords {
// Increments columnIndex by looping until find a column match.
const filters = [];
let predefinedFilterTypes;
if (params.filterTypes) {
predefinedFilterTypes = params.filterTypes.split(',');
}
let filterIndex = 0;
await CollectionUtil.asyncForEach(args, async arg => {
const filter = await getFilter(arg);
if (!filter) {
@ -848,20 +849,22 @@ export class SystemKeywords {
}
}
filter.columnIndex = columnIndex;
const fixed = predefinedFilterTypes ? predefinedFilterTypes[filterIndex] : null;
if (this.isValidHour(filter.value)) {
filter.dataType = 'hourInterval';
filter.dataType = fixed ? fixed : 'hourInterval';
} else if (this.isValidDate(filter.value)) {
filter.value = SystemKeywords.getDateFromLocaleString(pid, filter.value, contentLocale);
filter.dataType = 'date';
filter.dataType = fixed ? fixed : 'date';
} else if (this.isValidNumber(filter.value)) {
filter.value = Number.parseInt(filter.value);
filter.dataType = 'number';
filter.dataType = fixed ? fixed : 'number';
} else {
filter.value = filter.value;
filter.dataType = 'string';
filter.dataType = fixed ? fixed : 'string';
}
filters.push(filter);
filterIndex++;
});
// As BASIC uses arrays starting with 1 (one) as index,
@ -885,7 +888,6 @@ export class SystemKeywords {
switch (filter.dataType) {
case 'string':
const v1 = GBConversationalService.removeDiacritics(result.toLowerCase().trim());
const v2 = GBConversationalService.removeDiacritics(filter.toLowerCase().trim());
@ -1373,9 +1375,8 @@ export class SystemKeywords {
return text.replace(/\D/gi, '');
}
//Create a CREAT LEAD keyword
public async createLead({ pid, templateName, data }) {
public async createLead({ pid, templateName, data }) {
//OAuth Token Endpoint (from your Azure App Registration)
const authorityUrl = 'https://login.microsoftonline.com/<COPY A GUID HERE>';
const msalConfig = {
@ -1384,43 +1385,49 @@ export class SystemKeywords {
clientId: process.env.DYNAMICS_CLIENTID,
clientSecret: process.env.DYNAMICS_CLIENTSECRET,
knownAuthorities: ['login.microsoftonline.com']
}
}
}
};
const cca = new MSAL.ConfidentialClientApplication(msalConfig);
const serverUrl = ` `;
//function that acquires a token and passes it to DynamicsWebApi
const acquireToken = (dynamicsWebApiCallback) => {
cca.acquireTokenByClientCredential({
scopes: [`${serverUrl}/.default`],
}).then(response => {
const acquireToken = dynamicsWebApiCallback => {
cca
.acquireTokenByClientCredential({
scopes: [`${serverUrl}/.default`]
})
.then(response => {
//call DynamicsWebApi callback only when a token has been retrieved successfully
dynamicsWebApiCallback(response.accessToken);
}).catch((error) => {
})
.catch(error => {
console.log(JSON.stringify(error));
});
}
//create DynamicsWebApi
});
};
//create DynamicsWebApi
const dynamicsWebApi = new DynamicsWebApi({
webApiUrl: `${serverUrl}/api/data/v9.2/`,
onTokenRefresh: acquireToken
});
//initialize a CRM entity record object
var lead = {
subject: "Test WebAPI",
firstname: "Test",
lastname: "WebAPI",
jobtitle: "Title"
subject: 'Test WebAPI',
firstname: 'Test',
lastname: 'WebAPI',
jobtitle: 'Title'
};
//call dynamicsWebApi.create function
dynamicsWebApi.create(lead, "leads").then(function (id) {
//do something with id here
}).catch(function (error) {
//catch error here
})
}
dynamicsWebApi
.create(lead, 'leads')
.then(function (id) {
//do something with id here
})
.catch(function (error) {
//catch error here
});
}
/**
*
* Fills a .docx or .pptx with template data.
@ -1460,14 +1467,13 @@ export class SystemKeywords {
for (var i in o) {
let value = o[i];
if (value && value.gbarray){
if (value && value.gbarray) {
o.shift();
value = o[i];
}
for (const kind of ['png', 'jpg', 'jpeg']) {
if (value.endsWith && value.endsWith(`.${kind}`)) {
const { baseUrl, client } = await GBDeployer.internalGetDriveClient(min);
path = urlJoin(gbaiName, `${botId}.gbdrive`);
@ -1475,7 +1481,7 @@ export class SystemKeywords {
path = '/' + urlJoin(path, Path.dirname(value));
value = Path.basename(value);
}
const ref = await this.internalGetDocument(client, baseUrl, path, value);
let url = ref['@microsoft.graph.downloadUrl'];
const imageName = Path.join(
@ -1487,15 +1493,14 @@ export class SystemKeywords {
const response = await fetch(url);
const buf = Buffer.from(await response.arrayBuffer());
Fs.writeFileSync(imageName, buf, { encoding: null });
const getNormalSize = ({ width, height, orientation }) => {
return (orientation || 0) >= 5 ? [ height, width ] : [ width, height];
return (orientation || 0) >= 5 ? [height, width] : [width, height];
};
const size = getNormalSize(await sharp(buf).metadata());
url = urlJoin(GBServer.globals.publicAddress, min.botId, 'cache', Path.basename(imageName));
images[index++] = {url: url, size:size, buf: buf} ;
images[index++] = { url: url, size: size, buf: buf };
}
}
if (o[i] !== null && typeof o[i] == 'object') {
@ -1510,7 +1515,6 @@ export class SystemKeywords {
centered: false,
getImage: (tagValue, tagName) => {
return images[indexImage].buf;
},
getSize: (img, tagValue, tagName) => {
return images[indexImage++].size;
@ -1526,10 +1530,8 @@ export class SystemKeywords {
doc.attachModule(new ImageModule(opts));
await traverseDataToInjectImageUrl(data);
doc
.setData(data)
.render();
doc.setData(data).render();
buf = doc.getZip().generate({ type: 'nodebuffer', compression: 'DEFLATE' });
Fs.writeFileSync(localName, buf, { encoding: null });
@ -1689,7 +1691,7 @@ export class SystemKeywords {
const address = `${cell}:${cell}`;
if (value !== found[columnName]) {
await this.set({ pid, handle:null, file, address, value });
await this.set({ pid, handle: null, file, address, value });
merges++;
}
}