From 8d9178ab0e97f4a2cc7d81db8c3cb82ff26903b5 Mon Sep 17 00:00:00 2001 From: Gintautas Miselis Date: Mon, 17 Jun 2019 13:22:03 +0300 Subject: [PATCH 1/2] Initialize AssistantV1 in constructor --- lib/index.js | 8 +++----- src/index.ts | 14 ++++++-------- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/lib/index.js b/lib/index.js index 39e13b6..1cccbd0 100644 --- a/lib/index.js +++ b/lib/index.js @@ -37,6 +37,9 @@ class WatsonMiddleware { if (config.minimum_confidence) { this.minimumConfidence = config.minimum_confidence; } + debug('Creating Assistant object with parameters: ' + + JSON.stringify(this.config, null, 2)); + this.conversation = new AssistantV1(this.config); } hear(patterns, message) { if (message.watsonData && message.watsonData.intents) { @@ -59,11 +62,6 @@ class WatsonMiddleware { } sendToWatson(bot, message, contextDelta) { return __awaiter(this, void 0, void 0, function* () { - if (!this.conversation) { - debug('Creating Assistant object with parameters: ' + - JSON.stringify(this.config, null, 2)); - this.conversation = new AssistantV1(this.config); - } if ((!message.text && message.type !== 'welcome') || this.ignoreType.indexOf(message.type) !== -1 || message.reply_to || diff --git a/src/index.ts b/src/index.ts index 46912cb..1ddf2cd 100644 --- a/src/index.ts +++ b/src/index.ts @@ -68,6 +68,12 @@ export class WatsonMiddleware { if (config.minimum_confidence) { this.minimumConfidence = config.minimum_confidence; } + + debug( + 'Creating Assistant object with parameters: ' + + JSON.stringify(this.config, null, 2), + ); + this.conversation = new AssistantV1(this.config); } public hear(patterns: string[], message: Botkit.BotkitMessage): boolean { @@ -105,14 +111,6 @@ export class WatsonMiddleware { message: Botkit.BotkitMessage, contextDelta: ContextDelta, ): Promise { - if (!this.conversation) { - debug( - 'Creating Assistant object with parameters: ' + - JSON.stringify(this.config, null, 2), - ); - this.conversation = new AssistantV1(this.config); - } - if ( (!message.text && message.type !== 'welcome') || this.ignoreType.indexOf(message.type) !== -1 || From 7123772fca37cb90c511a5de18200b5f9c2c4846 Mon Sep 17 00:00:00 2001 From: Gintautas Miselis Date: Mon, 17 Jun 2019 16:56:09 +0300 Subject: [PATCH 2/2] Implemented deleteUserData --- README.md | 35 +++++++++++++- lib/index.d.ts | 1 + lib/index.js | 15 ++++++ lib/index.js.map | 2 +- src/index.ts | 18 +++++++ test/middleware-delete-user-data.test.ts | 61 ++++++++++++++++++++++++ 6 files changed, 130 insertions(+), 2 deletions(-) create mode 100644 test/middleware-delete-user-data.test.ts diff --git a/README.md b/README.md index dcbd7b7..1497930 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,9 @@ This middleware plugin for [Botkit](http://howdy.ai/botkit) allows developers to + [Intent matching](#intent-matching) - [`before` and `after`](#before-and-after) - [Dynamic workspace](#dynamic-workspace) - +* [Information security](#information-security) + + [Labeling user data](#labeling-user-data) + + [Deleting user data](#deleting-user-data) ## Middleware Overview @@ -45,6 +47,7 @@ This middleware plugin for [Botkit](http://howdy.ai/botkit) allows developers to * `readContext`: used in [implementing event handlers](#implementing-event-handlers). * `before`: [pre-process](#before-and-after) requests before sending to Watson Assistant (formerly Conversation). * `after`: [post-process](#before-and-after) responses before forwarding them to Botkit. +* `deleteUserData`: [deletes](#information-security) all data associated with a specified customer ID. ## Installation @@ -371,6 +374,36 @@ async handleHelloEvent = (bot, message) => { controller.on('hello', handleHelloEvent); ``` +## Information security + +It may be necessary to be to able delete message logs associated with particular customer in order to comply with +[GDPR or HIPPA regulations](https://cloud.ibm.com/docs/services/assistant?topic=assistant-information-security#information-security) + +### Labeling User Data + +Messages can be labeled with customer id by adding `x-watson-metadata` header to request in `before` hook: + +```js +watsonMiddleware.before = async (message, payload) => { + // it is up to you to implement calculateCustomerId function + customerId = calculateCustomerId(payload.context); + payload.headers['X-Watson-Metadata'] = 'customer_id=' + customerId; + + return payload; +}; +``` + +### Deleting User Data + +```js +try { + await watsonMiddleware.deleteUserData(customerId); + //Customer data was deleted successfully +} catch (e) { + //Failed to delete +} +``` + ## License This library is licensed under Apache 2.0. Full license text is available in [LICENSE](LICENSE). diff --git a/lib/index.d.ts b/lib/index.d.ts index 05fc75f..54ba49f 100644 --- a/lib/index.d.ts +++ b/lib/index.d.ts @@ -60,4 +60,5 @@ export declare class WatsonMiddleware { updateContext(user: string, context: Context): Promise<{ context: Context; }>; + deleteUserData(customerId: string): Promise; } diff --git a/lib/index.js b/lib/index.js index 1cccbd0..d37095b 100644 --- a/lib/index.js +++ b/lib/index.js @@ -150,6 +150,21 @@ class WatsonMiddleware { }); }); } + deleteUserData(customerId) { + return __awaiter(this, void 0, void 0, function* () { + const params = { + customer_id: customerId, + return_response: true, + }; + try { + const response = yield this.conversation.deleteUserData(params); + debug('deleteUserData response', response); + } + catch (err) { + throw new Error('Failed to delete user data, response code: ' + err.code + ', message: ' + err.message); + } + }); + } } exports.WatsonMiddleware = WatsonMiddleware; //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/lib/index.js.map b/lib/index.js.map index dd2a745..3dcf99a 100644 --- a/lib/index.js.map +++ b/lib/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index 1ddf2cd..2d0c2d4 100644 --- a/src/index.ts +++ b/src/index.ts @@ -217,4 +217,22 @@ export class WatsonMiddleware { context: context, }); } + + public async deleteUserData(customerId: string) { + const params = { + customer_id: customerId, + return_response: true, + }; + try { + const response = await this.conversation.deleteUserData(params); + debug('deleteUserData response', response); + } catch (err) { + throw new Error( + 'Failed to delete user data, response code: ' + + err.code + + ', message: ' + + err.message, + ); + } + } } diff --git a/test/middleware-delete-user-data.test.ts b/test/middleware-delete-user-data.test.ts new file mode 100644 index 0000000..95b0f4a --- /dev/null +++ b/test/middleware-delete-user-data.test.ts @@ -0,0 +1,61 @@ +/** + * Copyright 2016-2019 IBM Corp. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { WatsonMiddleware } from '../lib/index'; +import nock = require('nock'); + +//Watson Assistant params +const service = { + username: 'batman', + password: 'bruce-wayne', + url: 'http://ibm.com:80', + version: '2018-07-10', +}; + +const workspaceId = 'zyxwv-54321'; + +const customerId = 'XXXXXX'; + +const middleware = new WatsonMiddleware({ + ...service, + workspace_id: workspaceId, +}); + +beforeEach(function() { + nock.disableNetConnect(); +}); + +afterEach(function() { + nock.cleanAll(); +}); + +test('makes delete request', async () => { + nock(service.url) + .delete(`/v1/user_data?version=2018-07-10&customer_id=${customerId}`) + .reply(202, ''); + + await middleware.deleteUserData(customerId); +}); + +test('throws error on unexpected response code', async () => { + nock(service.url) + .delete(`/v1/user_data?version=2018-07-10&customer_id=${customerId}`) + .reply(404, ''); + + return await expect(middleware.deleteUserData(customerId)).rejects.toThrow( + 'Failed to delete user data, response code: 404, message: null', + ); +});