diff --git a/DATABASE-CHANGES.md b/DATABASE-CHANGES.md index 55c25c00..da775b99 100644 --- a/DATABASE-CHANGES.md +++ b/DATABASE-CHANGES.md @@ -49,6 +49,11 @@ ALTER TABLE dbo.GuaribasInstance ADD activationCode nvarchar(16) NULL GO +# 1.7.9 + +ALTER TABLE dbo.GuaribasInstance ADD + params nvarchar(4000) NULL +GO ``` \ No newline at end of file diff --git a/packages/admin.gbapp/dialogs/AdminDialog.ts b/packages/admin.gbapp/dialogs/AdminDialog.ts index 2075a6c7..7b19e650 100644 --- a/packages/admin.gbapp/dialogs/AdminDialog.ts +++ b/packages/admin.gbapp/dialogs/AdminDialog.ts @@ -179,9 +179,7 @@ export class AdminDialog extends IGBDialog { let from = step.context.activity.from.id; - let canPublish = process.env.SECURITY_CAN_PUBLISH ? - AdminDialog.canSendBroadcast(from) : - + let canPublish = AdminDialog.canPublish(min, from); if (canPublish) { @@ -216,7 +214,9 @@ export class AdminDialog extends IGBDialog { await min.conversationalService.sendText(min, step, `Finished publishing ${packageName}.`); }); } catch (error) { - await min.conversationalService.sendText(min, step, error.message); + await min.conversationalService.sendText(min, step, `ERROR: ${error}` ); + GBLog.error(error); + return await step.replaceDialog('/ask', { isReturning: true }); } await min.conversationalService.sendText(min, step, Messages[locale].publish_success); if (!step.activeDialog.state.options.confirm) { @@ -240,13 +240,18 @@ export class AdminDialog extends IGBDialog { * the /broadcast command with specific phone numbers. * @param phone Phone number to check (eg.: +5521900002233) */ - public static canSendBroadcast(phone: string): Boolean { - return true; // TODO: REMOVE THIS. + public static canPublish(min: GBMinInstance, phone: string): Boolean { + const list = process.env.SECURITY_CAN_PUBLISH.split(';'); - return list.includes(phone); + let result = list.includes(phone); + + if (!result && min.instance.params) { + const params = JSON.parse(min.instance.params); + return list.includes(params['Can Publish']); + } + return result; } - - + private static setupSecurityDialogs(min: GBMinInstance) { min.dialogs.add( new WaterfallDialog('/setupSecurity', [ diff --git a/packages/admin.gbapp/index.ts b/packages/admin.gbapp/index.ts index d44a43fe..1e497038 100644 --- a/packages/admin.gbapp/index.ts +++ b/packages/admin.gbapp/index.ts @@ -59,6 +59,10 @@ export class GBAdminPackage implements IGBPackage { public async onNewSession(min: GBMinInstance, step: GBDialogStep): Promise { GBLog.verbose(`onNewSession called.`); } + public async onExchangeData(min: GBMinInstance, kind: string, data: any) { + GBLog.verbose(`onExchangeData called.`); + } + public async loadPackage(core: IGBCoreService, sequelize: Sequelize): Promise { core.sequelize.addModels([GuaribasAdmin]); @@ -67,4 +71,5 @@ export class GBAdminPackage implements IGBPackage { public async loadBot(min: GBMinInstance): Promise { AdminDialog.setup(min); } + } diff --git a/packages/admin.gbapp/services/GBAdminService.ts b/packages/admin.gbapp/services/GBAdminService.ts index 01f94704..4af393f9 100644 --- a/packages/admin.gbapp/services/GBAdminService.ts +++ b/packages/admin.gbapp/services/GBAdminService.ts @@ -212,8 +212,7 @@ export class GBAdminService implements IGBAdminService { return path.indexOf('sharepoint.com') > 0; } - public async publish(min: GBMinInstance, packageName: string, republish: boolean): Promise - { + public async publish(min: GBMinInstance, packageName: string, republish: boolean): Promise { } public static async deployPackageCommand(min: GBMinInstance, text: string, deployer: IGBDeployer) { @@ -227,18 +226,24 @@ export class GBAdminService implements IGBAdminService { await deployer.deployPackage(min, urlJoin(additionalPath, packageName)); } else { - let s = new GBSharePointService(); let siteName = text.split(' ')[1]; let folderName = text.split(' ')[2]; - let localFolder = Path.join('work', Path.basename(folderName)); - GBLog.warn(`${GBConfigService.get('CLOUD_USERNAME')} must be authorized on SharePoint related site`); - await s.downloadFolder(localFolder, siteName, folderName, - GBConfigService.get('CLOUD_USERNAME'), GBConfigService.get('CLOUD_PASSWORD')) - await deployer.deployPackage(min, localFolder); + let packageType = Path.extname(folderName); + if (packageType !== '.gbot') { + let s = new GBSharePointService(); + + let localFolder = Path.join('work', Path.basename(folderName)); + GBLog.warn(`${GBConfigService.get('CLOUD_USERNAME')} must be authorized on SharePoint related site`); + await s.downloadFolder(localFolder, siteName, folderName, + GBConfigService.get('CLOUD_USERNAME'), GBConfigService.get('CLOUD_PASSWORD')) + await deployer.deployPackage(min, localFolder); + } + else { + await deployer.deployPackage(min, folderName); + } } } - public static async rebuildIndexPackageCommand(min: GBMinInstance, deployer: IGBDeployer) { await deployer.rebuildIndex( min.instance, diff --git a/packages/analytics.gblib/index.ts b/packages/analytics.gblib/index.ts index 6ad8fe67..2c366026 100644 --- a/packages/analytics.gblib/index.ts +++ b/packages/analytics.gblib/index.ts @@ -65,4 +65,8 @@ export class GBAnalyticsPackage implements IGBPackage { public async onNewSession(min: GBMinInstance, step: GBDialogStep): Promise { GBLog.verbose(`onNewSession called.`); } + public async onExchangeData(min: GBMinInstance, kind: string, data: any) { + GBLog.verbose(`onExchangeData called.`); + } + } diff --git a/packages/azuredeployer.gbapp/index.ts b/packages/azuredeployer.gbapp/index.ts index b48d1e7d..b9ef3f60 100644 --- a/packages/azuredeployer.gbapp/index.ts +++ b/packages/azuredeployer.gbapp/index.ts @@ -62,4 +62,8 @@ export class GBAzureDeployerPackage implements IGBPackage { public async onNewSession(min: GBMinInstance, step: GBDialogStep): Promise { GBLog.verbose(`onNewSession called.`); } + public async onExchangeData(min: GBMinInstance, kind: string, data: any) { + GBLog.verbose(`onExchangeData called.`); + } + } diff --git a/packages/console.gblib/index.ts b/packages/console.gblib/index.ts index d17035fa..41cc5ae1 100644 --- a/packages/console.gblib/index.ts +++ b/packages/console.gblib/index.ts @@ -61,6 +61,10 @@ export class GBConsolePackage implements IGBPackage { public async onNewSession(min: GBMinInstance, step: GBDialogStep): Promise { GBLog.verbose(`onNewSession called.`); } + public async onExchangeData(min: GBMinInstance, kind: string, data: any) { + GBLog.verbose(`onExchangeData called.`); + } + public async loadBot(min: GBMinInstance): Promise { this.channel = new ConsoleDirectLine(min.instance.webchatKey); diff --git a/packages/core.gbapp/index.ts b/packages/core.gbapp/index.ts index 73733842..1fdfe470 100644 --- a/packages/core.gbapp/index.ts +++ b/packages/core.gbapp/index.ts @@ -66,6 +66,10 @@ export class GBCorePackage implements IGBPackage { public async onNewSession(min: GBMinInstance, step: GBDialogStep): Promise { GBLog.verbose(`onNewSession called.`); } + public async onExchangeData(min: GBMinInstance, kind: string, data: any) { + GBLog.verbose(`onExchangeData called.`); + } + public async loadBot(min: GBMinInstance): Promise { WelcomeDialog.setup(min.bot, min); diff --git a/packages/core.gbapp/models/GBModel.ts b/packages/core.gbapp/models/GBModel.ts index b86d85da..58fdc8fe 100644 --- a/packages/core.gbapp/models/GBModel.ts +++ b/packages/core.gbapp/models/GBModel.ts @@ -238,6 +238,9 @@ export class GuaribasInstance extends Model @Column @UpdatedAt public updatedAt: Date; + + @Column(DataType.STRING(4000)) + public params: string; } /** @@ -267,6 +270,7 @@ export class GuaribasPackage extends Model { @Column @UpdatedAt public updatedAt: Date; + } /** diff --git a/packages/core.gbapp/services/GBAPIService.ts b/packages/core.gbapp/services/GBAPIService.ts index f1d11c9a..25940216 100644 --- a/packages/core.gbapp/services/GBAPIService.ts +++ b/packages/core.gbapp/services/GBAPIService.ts @@ -43,7 +43,6 @@ import { GBDeployer } from './GBDeployer'; const MicrosoftGraph = require("@microsoft/microsoft-graph-client"); import { Messages } from "../strings"; import { GBServer } from '../../../src/app'; -import { GBConversationalService } from './GBConversationalService'; const request = require('request-promise-native'); /** @@ -101,8 +100,8 @@ class SysClass { let token = await this.min.adminService.acquireElevatedToken(this.min.instance.instanceId); - let siteId = process.env.SAAS_SHAREPOINT_SITE_ID; - let libraryId = process.env.SAAS_SHAREPOINT_LIBRARY_ID; + let siteId = process.env.STORAGE_SITE_ID; + let libraryId = process.env.STORAGE_LIBRARY; let client = MicrosoftGraph.Client.init({ authProvider: done => { @@ -149,21 +148,17 @@ class SysClass { let token = await this.min.adminService.acquireElevatedToken(this.min.instance.instanceId); - let siteId = process.env.SAAS_SHAREPOINT_SITE_ID; - let libraryId = process.env.SAAS_SHAREPOINT_LIBRARY_ID; - let client = MicrosoftGraph.Client.init({ authProvider: done => { done(null, token); } }); + let siteId = process.env.STORAGE_SITE_ID; + let libraryId = process.env.STORAGE_LIBRARY; const botId = this.min.instance.botId; - const path = `/${botId}.gbai/${botId}.gbdata`; try { - - let res = await client.api( `https://graph.microsoft.com/v1.0/sites/${siteId}/lists/${libraryId}/drive/root:${path}:/children`) .get(); diff --git a/packages/core.gbapp/services/GBCoreService.ts b/packages/core.gbapp/services/GBCoreService.ts index 2dbc8bf3..56efaf7c 100644 --- a/packages/core.gbapp/services/GBCoreService.ts +++ b/packages/core.gbapp/services/GBCoreService.ts @@ -210,13 +210,11 @@ export class GBCoreService implements IGBCoreService { * Loads all items to start several listeners. */ public async loadInstances(): Promise { - if (process.env.LOAD_ONLY !== undefined) - { + if (process.env.LOAD_ONLY !== undefined) { const options = { where: { botId: process.env.LOAD_ONLY } }; return GuaribasInstance.findAll(options); } - else - { + else { return GuaribasInstance.findAll({}); } } @@ -318,6 +316,11 @@ STORAGE_SYNC=true let instance = await GuaribasInstance.findOne(options); // tslint:disable-next-line:prefer-object-spread instance = Object.assign(instance, fullInstance); + try { + instance.params = JSON.stringify(JSON.parse(instance.params)); + } catch (err) { + instance.params = JSON.stringify(instance.params); + } return await instance.save(); } @@ -433,7 +436,7 @@ STORAGE_SYNC=true ); } } - + public async createBootInstance( core: GBCoreService, installationDeployer: IGBInstallationDeployer, diff --git a/packages/core.gbapp/services/GBDeployer.ts b/packages/core.gbapp/services/GBDeployer.ts index 809ffad5..865dc33e 100644 --- a/packages/core.gbapp/services/GBDeployer.ts +++ b/packages/core.gbapp/services/GBDeployer.ts @@ -55,7 +55,7 @@ import { GBConfigService } from './GBConfigService'; import { GBImporter } from './GBImporterService'; import { GBVMService } from './GBVMService'; import { CollectionUtil } from 'pragmatismo-io-framework'; - +const MicrosoftGraph = require("@microsoft/microsoft-graph-client"); /** * @@ -246,11 +246,60 @@ export class GBDeployer implements IGBDeployer { */ public async deployBotFromLocalPath(localPath: string, publicAddress: string): Promise { + const packageName = Path.basename(localPath); let instance = await this.importer.importIfNotExistsBotPackage(undefined, packageName, localPath); this.deployBotFull(instance, publicAddress); } + public async loadParamsFromExcel(min: GBMinInstance): Promise { + + let token = + await min.adminService.acquireElevatedToken(min.instance.instanceId); + + let siteId = process.env.STORAGE_SITE_ID; + let libraryId = process.env.STORAGE_LIBRARY; + + let client = MicrosoftGraph.Client.init({ + authProvider: done => { + done(null, token); + } + }); + const botId = min.instance.botId; + const path = `/${botId}.gbai/${botId}.gbot`; + + let res = await client.api( + `https://graph.microsoft.com/v1.0/sites/${siteId}/lists/${libraryId}/drive/root:${path}:/children`) + .get(); + + + // Performs validation. + + let document = res.value.filter(m => { + return m.name === "Config.xlsx" + }); + if (document === undefined) { + throw `Config.xlsx not found on .bot folder, check the package.`; + } + + // Creates workbook session that will be discarded. + + let results = await client.api( + `https://graph.microsoft.com/v1.0/sites/${siteId}/lists/${libraryId}/drive/items/${document[0].id}/workbook/worksheets('General')/range(address='A7:B100')`) + .get(); + + let index = 0; + let obj = {}; + for (; index < results.text.length; index++) { + if (results.text[index][0] === "") { + return obj; + } + obj[results.text[index][0]] = results.text[index][1]; + } + return obj; + } + + /** * UndDeploys a bot to the storage. */ @@ -298,7 +347,12 @@ export class GBDeployer implements IGBDeployer { switch (packageType) { case '.gbot': - await this.deployBotFromLocalPath(localPath, GBServer.globals.publicAddress); + if (Fs.existsSync(localPath)) { + await this.deployBotFromLocalPath(localPath, GBServer.globals.publicAddress); + } + min.instance.params = await this.loadParamsFromExcel(min); + await this.core.saveInstance(min.instance); + break; case '.gbkb': @@ -404,7 +458,7 @@ export class GBDeployer implements IGBDeployer { throw err; } } - + try { await search.createDataSource(dsName, dsName, 'GuaribasQuestion', 'azuresql', connectionString); } catch (err) { diff --git a/packages/customer-satisfaction.gbapp/index.ts b/packages/customer-satisfaction.gbapp/index.ts index f294a936..a4ba520b 100644 --- a/packages/customer-satisfaction.gbapp/index.ts +++ b/packages/customer-satisfaction.gbapp/index.ts @@ -61,6 +61,10 @@ export class GBCustomerSatisfactionPackage implements IGBPackage { public async onNewSession(min: GBMinInstance, step: GBDialogStep): Promise { GBLog.verbose(`onNewSession called.`); } + public async onExchangeData(min: GBMinInstance, kind: string, data: any) { + GBLog.verbose(`onExchangeData called.`); + } + public async loadPackage(core: IGBCoreService, sequelize: Sequelize): Promise { core.sequelize.addModels([GuaribasQuestionAlternate]); diff --git a/packages/kb.gbapp/index.ts b/packages/kb.gbapp/index.ts index f9896a89..2ff5a442 100644 --- a/packages/kb.gbapp/index.ts +++ b/packages/kb.gbapp/index.ts @@ -60,6 +60,10 @@ export class GBKBPackage implements IGBPackage { public async onNewSession(min: GBMinInstance, step: GBDialogStep): Promise { GBLog.verbose(`onNewSession called.`); } + public async onExchangeData(min: GBMinInstance, kind: string, data: any) { + GBLog.verbose(`onExchangeData called.`); + } + public async loadPackage(core: IGBCoreService, sequelize: Sequelize): Promise { core.sequelize.addModels([GuaribasAnswer, GuaribasQuestion, GuaribasSubject]); diff --git a/packages/security.gblib/index.ts b/packages/security.gblib/index.ts index b7d7cd79..8eb313ea 100644 --- a/packages/security.gblib/index.ts +++ b/packages/security.gblib/index.ts @@ -63,6 +63,10 @@ export class GBSecurityPackage implements IGBPackage { public async onNewSession(min: GBMinInstance, step: GBDialogStep): Promise { GBLog.verbose(`onNewSession called.`); } + public async onExchangeData(min: GBMinInstance, kind: string, data: any) { + GBLog.verbose(`onExchangeData called.`); + } + public async loadPackage(core: IGBCoreService, sequelize: Sequelize): Promise { core.sequelize.addModels([GuaribasGroup, GuaribasUser, GuaribasUserGroup]); diff --git a/packages/sharepoint.gblib/index.ts b/packages/sharepoint.gblib/index.ts index 8e18c53b..10e649a2 100644 --- a/packages/sharepoint.gblib/index.ts +++ b/packages/sharepoint.gblib/index.ts @@ -62,4 +62,8 @@ export class GBSharePointPackage implements IGBPackage { public async onNewSession(min: GBMinInstance, step: GBDialogStep): Promise { GBLog.verbose(`onNewSession called.`); } + public async onExchangeData(min: GBMinInstance, kind: string, data: any) { + GBLog.verbose(`onExchangeData called.`); + } + } diff --git a/packages/whatsapp.gblib/index.ts b/packages/whatsapp.gblib/index.ts index fe2bc4a7..fcc54135 100644 --- a/packages/whatsapp.gblib/index.ts +++ b/packages/whatsapp.gblib/index.ts @@ -65,4 +65,8 @@ export class GBWhatsappPackage implements IGBPackage { public async onNewSession(min: GBMinInstance, step: GBDialogStep): Promise { GBLog.verbose(`onNewSession called.`); } + public async onExchangeData(min: GBMinInstance, kind: string, data: any) { + GBLog.verbose(`onExchangeData called.`); + } + } diff --git a/rodriguez.env b/rodriguez.env index e7ccbbad..54197a7a 100644 --- a/rodriguez.env +++ b/rodriguez.env @@ -12,7 +12,7 @@ STORAGE_DIALECT=mssql STORAGE_SERVER=dev-rodriguez-storage-server.database.windows.net STORAGE_NAME=dev-rodriguez-storage STORAGE_USERNAME=sanreaeffbpuydq -STORAGE_PASSWORD=CGF#x%c#4I68 +STORAGE_PASSWORD=CGF#x%c#4 STORAGE_SYNC=false GBAPP_DISABLE_COMPILE=true NLP_AUTHORING_KEY=59c157d348614cceaf041c1e06c65656