Skip to content

Commit 5a53636

Browse files
committed
Add conversation support
- Updated chat UI - Additional support for conversations (WIP) - Add support for automatically upgrading the DB schema on changes
1 parent ddd5656 commit 5a53636

File tree

15 files changed

+433
-321
lines changed

15 files changed

+433
-321
lines changed

package.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,13 @@
3535
"jwtsecret": "mysecret",
3636
"admin_username": "admin",
3737
"admin_password": "admin",
38-
"db_schema": "3.0.0"
38+
"db_schema": "3.0.1",
39+
"db_autoupdate": "true"
3940
},
4041
"scripts": {
4142
"test": "echo \"Error: no test specified\" && exit 1",
42-
"start": "node server/server.js"
43+
"start": "node server/server.js",
44+
"dev": "nodemon server/server.js --ignore 'server/data/'"
4345
},
4446
"author": "Paul Aschmann",
4547
"url": "https://github.com/paschmann/rasa-ui",

server/db/conversations.js

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
const db = require('./db');
2+
const logger = require('../util/logger');
3+
4+
module.exports = {
5+
getConversations,
6+
createConversation,
7+
removeConversation
8+
};
9+
10+
function getConversations(req, res, next) {
11+
logger.winston.info('Conversations.getConversations');
12+
db.all('select * from conversations where bot_id = ? order by timestamp desc', req.params.bot_id, function(err, data) {
13+
if (err) {
14+
logger.winston.info(err);
15+
} else {
16+
res.status(200).json(data);
17+
}
18+
});
19+
}
20+
21+
function createConversation(req, res, next) {
22+
logger.winston.info('Conversations.createConversation');
23+
db.run('insert into conversations(bot_id)' + 'values (?)', [req.body.bot_id], function(err) {
24+
if (err) {
25+
logger.winston.info("Error inserting a new record");
26+
} else {
27+
res.status(200).json({ status: 'success', message: 'Inserted' });
28+
}
29+
});
30+
}
31+
32+
function removeConversation(req, res, next) {
33+
logger.winston.info('Conversations.removeConversation');
34+
console.log(req.params);
35+
db.run('delete from conversations where conversation_id = ?', req.query.conversation_id, function(err) {
36+
if (err) {
37+
logger.winston.info("Error removing the record");
38+
} else {
39+
res.status(200).json({ status: 'success', message: 'Removed' });
40+
}
41+
});
42+
}

server/db/db.js

Lines changed: 49 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -12,50 +12,73 @@ let db = new sqlite3.Database("server/data/db.sqlite3", (err) => {
1212

1313
function checkDBSchema() {
1414
//Get version of DB Schema from version table, if != to version, suggest upgrade
15-
db.all("SELECT version from version", function(err, rows) {
15+
db.all("SELECT * from version", function(err, rows) {
1616
if (err && err.errno == 1) {
1717
createDBSchema();
1818
} else {
19-
if (rows[0].version == global.db_schema) {
20-
logger.winston.info("Schema version (" + rows[0].version + ") matches package.json schema version (" + global.db_schema + ")");
19+
if (rows.length > 0 && rows[0].version == global.db_schema) {
20+
logger.winston.info("Schema version v" + rows[0].version + " matches package.json schema version v" + global.db_schema);
2121
} else {
22-
logger.winston.info("Schema version (" + rows[0].version + ") DOES NOT match package.json schema version (" + global.db_schema + ")");
23-
logger.winston.info("Please upgrade your schema");
22+
var current_version = "?";
23+
if (rows.length > 0) {
24+
current_version = rows[0].version;
25+
}
26+
logger.winston.info("Schema version v" + current_version + " DOES NOT match package.json schema version v" + global.db_schema);
27+
if (global.db_autoupdate == "true") {
28+
createDBSchema();
29+
} else {
30+
logger.winston.info("Please upgrade your schema");
31+
}
2432
}
2533
}
2634
});
27-
//
2835
}
2936

30-
function createDBSchema() {
37+
function createDBSchema() {
3138
try {
32-
logger.winston.info("------------------------- Starting to create DB schema -------------------------");
33-
db.run("CREATE TABLE IF NOT EXISTS version(version)", setDBSchemaVersion);
34-
db.run("CREATE TABLE IF NOT EXISTS bots (bot_id INTEGER PRIMARY KEY AUTOINCREMENT, bot_name TEXT, bot_config TEXT, output_folder TEXT)");
35-
db.run("CREATE TABLE IF NOT EXISTS intents (intent_id INTEGER PRIMARY KEY AUTOINCREMENT, intent_name TEXT, bot_id INTEGER)");
36-
db.run("CREATE TABLE IF NOT EXISTS synonyms (synonym_id INTEGER PRIMARY KEY AUTOINCREMENT, synonym_reference TEXT, regex_pattern TEXT, bot_id INTEGER)");
37-
db.run("CREATE TABLE IF NOT EXISTS entities (entity_id INTEGER PRIMARY KEY AUTOINCREMENT, entity_name TEXT, slot_data_type TEXT, bot_id INTEGER)");
38-
db.run("CREATE TABLE IF NOT EXISTS expressions (expression_id INTEGER PRIMARY KEY AUTOINCREMENT, expression_text TEXT, intent_id INTEGER)");
39-
db.run("CREATE TABLE IF NOT EXISTS expression_parameters (parameter_id INTEGER PRIMARY KEY AUTOINCREMENT, parameter_start INTEGER, parameter_end INTEGER, parameter_value TEXT, expression_id INTEGER, intent_id INTEGER, entity_id INTEGER)");
40-
db.run("CREATE TABLE IF NOT EXISTS regex (regex_id INTEGER PRIMARY KEY AUTOINCREMENT, regex_name TEXT, regex_pattern TEXT, bot_id INTEGER)");
41-
db.run("CREATE TABLE IF NOT EXISTS responses (response_id INTEGER PRIMARY KEY AUTOINCREMENT, response_text TEXT, response_type TEXT, action_id INTEGER)");
42-
db.run("CREATE TABLE IF NOT EXISTS synonym_variants (synonym_variant_id INTEGER PRIMARY KEY AUTOINCREMENT, synonym_value TEXT, synonym_id INTEGER)");
43-
db.run("CREATE TABLE IF NOT EXISTS nlu_log (log_id INTEGER PRIMARY KEY AUTOINCREMENT, ip_address TEXT, query TEXT, event_type TEXT, event_data TEXT, timestamp DATETIME DEFAULT CURRENT_TIMESTAMP)");
44-
db.run("CREATE TABLE IF NOT EXISTS models (model_id INTEGER PRIMARY KEY AUTOINCREMENT, model_name TEXT, timestamp DATETIME DEFAULT CURRENT_TIMESTAMP, comment TEXT, bot_id INTEGER, local_path TEXT, server_path TEXT, server_response TEXT)");
45-
db.run("CREATE TABLE IF NOT EXISTS actions (action_id INTEGER PRIMARY KEY AUTOINCREMENT, action_name TEXT, bot_id INTEGER)");
46-
db.run("CREATE TABLE IF NOT EXISTS stories (story_id INTEGER PRIMARY KEY AUTOINCREMENT, story_name TEXT, story TEXT, bot_id INTEGER, timestamp DATETIME DEFAULT CURRENT_TIMESTAMP)");
39+
logger.winston.info("------------------------- Starting to create/update DB schema -------------------------");
40+
db.run("CREATE TABLE bots (bot_id INTEGER PRIMARY KEY AUTOINCREMENT, bot_name TEXT, bot_config TEXT, output_folder TEXT)", function(error) { sqlOutput(error, "bots"); });
41+
db.run("CREATE TABLE intents (intent_id INTEGER PRIMARY KEY AUTOINCREMENT, intent_name TEXT, bot_id INTEGER)", function(error) { sqlOutput(error, "intents"); });
42+
db.run("CREATE TABLE synonyms (synonym_id INTEGER PRIMARY KEY AUTOINCREMENT, synonym_reference TEXT, regex_pattern TEXT, bot_id INTEGER)", function(error) { sqlOutput(error, "synonyms"); });
43+
db.run("CREATE TABLE entities (entity_id INTEGER PRIMARY KEY AUTOINCREMENT, entity_name TEXT, slot_data_type TEXT, bot_id INTEGER)", function(error) { sqlOutput(error, "entities"); });
44+
db.run("CREATE TABLE expressions (expression_id INTEGER PRIMARY KEY AUTOINCREMENT, expression_text TEXT, intent_id INTEGER)", function(error) { sqlOutput(error, "expressions"); });
45+
db.run("CREATE TABLE expression_parameters (parameter_id INTEGER PRIMARY KEY AUTOINCREMENT, parameter_start INTEGER, parameter_end INTEGER, parameter_value TEXT, expression_id INTEGER, intent_id INTEGER, entity_id INTEGER)", function(error) { sqlOutput(error, "expression_parameters"); });
46+
db.run("CREATE TABLE regex (regex_id INTEGER PRIMARY KEY AUTOINCREMENT, regex_name TEXT, regex_pattern TEXT, bot_id INTEGER)", function(error) { sqlOutput(error, "regex"); });
47+
db.run("CREATE TABLE responses (response_id INTEGER PRIMARY KEY AUTOINCREMENT, response_text TEXT, response_type TEXT, action_id INTEGER)", function(error) { sqlOutput(error, "responses"); });
48+
db.run("CREATE TABLE synonym_variants (synonym_variant_id INTEGER PRIMARY KEY AUTOINCREMENT, synonym_value TEXT, synonym_id INTEGER)", function(error) { sqlOutput(error, "synonym_variants"); });
49+
db.run("CREATE TABLE nlu_log (log_id INTEGER PRIMARY KEY AUTOINCREMENT, ip_address TEXT, query TEXT, event_type TEXT, event_data TEXT, timestamp DATETIME DEFAULT CURRENT_TIMESTAMP)", function(error) { sqlOutput(error, "nlu_log"); });
50+
db.run("CREATE TABLE models (model_id INTEGER PRIMARY KEY AUTOINCREMENT, model_name TEXT, timestamp DATETIME DEFAULT CURRENT_TIMESTAMP, comment TEXT, bot_id INTEGER, local_path TEXT, server_path TEXT, server_response TEXT)", function(error) { sqlOutput(error, "models"); });
51+
db.run("CREATE TABLE actions (action_id INTEGER PRIMARY KEY AUTOINCREMENT, action_name TEXT, bot_id INTEGER)", function(error) { sqlOutput(error, "actions"); });
52+
db.run("CREATE TABLE stories (story_id INTEGER PRIMARY KEY AUTOINCREMENT, story_name TEXT, story TEXT, bot_id INTEGER, timestamp DATETIME DEFAULT CURRENT_TIMESTAMP)", function(error) { sqlOutput(error, "stories"); });
4753

48-
db.run("CREATE TABLE IF NOT EXISTS settings (setting_name TEXT, setting_value TEXT)", function() {
54+
db.run("CREATE TABLE settings (setting_name TEXT, setting_value TEXT)", function(error) {
55+
sqlOutput(error, "settings");
4956
db.run("INSERT into settings (setting_name, setting_value) values ('refresh_time', '60000')");
5057
});
58+
59+
//New table part of Version 3.0.1
60+
db.run("CREATE TABLE conversations (conversation_id INTEGER PRIMARY KEY AUTOINCREMENT, ip_address TEXT, conversation TEXT, story TEXT, bot_id INTEGER, timestamp DATETIME DEFAULT CURRENT_TIMESTAMP)", function(error) { sqlOutput(error, "conversations"); });
61+
62+
db.run("CREATE TABLE version(version)", function(error) { setDBSchemaVersion(error); });
5163
} catch (err) {
5264
console.log(err);
5365
}
5466
}
5567

56-
function setDBSchemaVersion() {
57-
db.run("INSERT into version (version) values (?)", global.db_schema);
58-
logger.winston.info("Database Schema v" + global.db_schema + " created");
68+
function sqlOutput(error, table_name) {
69+
if (!error) {
70+
logger.winston.info("Table: " + table_name + " created");
71+
}
72+
}
73+
74+
function setDBSchemaVersion(error) {
75+
if (error) {
76+
db.run("UPDATE version set version = ?", global.db_schema);
77+
logger.winston.info("Database Schema updated to v" + global.db_schema + " ");
78+
} else {
79+
db.run("INSERT into version (version) values (?)", global.db_schema);
80+
logger.winston.info("Database Schema v" + global.db_schema + " created");
81+
}
5982
}
6083

6184
module.exports = db;

server/routes/index.js

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ const responses = require('../db/responses');
1414
const models = require('../db/models');
1515
const stories = require('../db/stories');
1616
const actions = require('../db/actions');
17+
const conversations = require('../db/conversations');
1718

1819
const rasa_router = require('./rasa_router');
1920
const auth = require('./auth');
@@ -119,17 +120,24 @@ router.get('/avgUserResponseTimesLast30Days', logs.getAvgUserResponseTimesLast30
119120
router.get('/activeUserCountLast12Months', logs.getActiveUserCountLast12Months);
120121
router.get('/activeUserCountLast30Days', logs.getActiveUserCountLast30Days);
121122

123+
//Conversations
124+
router.get('/conversations/:bot_id', conversations.getConversations);
125+
router.post('/conversations', conversations.createConversation);
126+
router.delete('/conversations', conversations.removeConversation);
127+
122128
//rasa api's
123129
router.get('/rasa/status', rasa_router.getRasaNluStatus);
124130
router.get('/rasa/url', rasa_router.getRasaNluEndpoint);
125-
//router.get('/rasa/config', rasa_router.getRasaNluConfig);
126131
router.get('/rasa/version', rasa_router.getRasaNluVersion);
127132
router.post('/rasa/model/train', rasa_router.trainRasaNlu);
128133
router.put('/rasa/model', rasa_router.loadRasaModel);
129134
router.delete('/rasa/model', rasa_router.unloadRasaModel);
130135
router.post('/rasa/model/parse', rasa_router.modelParseRequest);
131-
router.post('/rasa/webhooks/rest/webhook', rasa_router.conversationParseRequest);
136+
router.post('/rasa/conversations/messages', rasa_router.conversationParseRequest);
132137
router.post('/rasa/restart', rasa_router.restartRasaCoreConversation);
138+
router.get('/rasa/story', rasa_router.getConversationStory);
139+
140+
133141

134142
//authentication js
135143
router.post('/auth', auth.authenticateUser);

0 commit comments

Comments
 (0)