diff --git a/controller/activityLogController.js b/controller/activityLogController.js new file mode 100644 index 0000000..b1d6a19 --- /dev/null +++ b/controller/activityLogController.js @@ -0,0 +1,42 @@ +/** + * Created by maiquel on 07/03/18. + */ + +(function () { + "use strict"; + + const activityLogModel = require("../model/activityLogModel"); + + let activityLogController = () => { + + let createActivity = (classificationResult, callback) => { + + let activity = new activityLogModel(); + activity.text = classificationResult.text; + activity.result = classificationResult; + activity.datetime = new Date(); + + activity.save((err, newActivity) => { + if (err) { + console.log(err); + } + else { + console.log("Atividade salva com id: " + newActivity._id); + callback(newActivity) + } + }); + }; + + let updateActivity = (activityID, feedback, callback) => { + activityLogModel.findByIdAndUpdate(activityID, {feedback: feedback}, callback); + }; + + return { + createActivity: createActivity, + updateActivity: updateActivity + } + + }; + + module.exports = activityLogController(); +}()); \ No newline at end of file diff --git a/controller/classifierController.js b/controller/classifierController.js index 365afd7..a9ddb19 100644 --- a/controller/classifierController.js +++ b/controller/classifierController.js @@ -8,6 +8,7 @@ const natural = require('natural'), twitterController = require('./twitterController'), POSTaggerController = require('./POSTaggerController'), + activityLogController = require('./activityLogController'), properties = require('../config/properties'); let classifier; @@ -26,7 +27,7 @@ train(callback); }; - let getClassification = (target) => { + let getClassification = (target, callback) => { let result = classifier.classify(target); let details = classifier.getClassifications(target); let percentuals = {}; @@ -45,14 +46,19 @@ effectiveResult = "Agressivo"; } - return { + let results = { text: target, result: result, details: details, percentuals: percentuals, effectiveResult: effectiveResult, pos_tag: POSTaggerController.getPOSTags(target) - } + }; + + activityLogController.createActivity(results, (newActivity) => { + results.activityID = newActivity._id; + callback(results); + }); }; function train(callback) { diff --git a/main-services/classifier.js b/main-services/classifier.js index ef0b5e3..4909ac6 100644 --- a/main-services/classifier.js +++ b/main-services/classifier.js @@ -10,6 +10,7 @@ bodyParser = require('body-parser'), properties = require('../config/properties'), classifierController = require('../controller/classifierController'), + activityLogController = require('../controller/activityLogController'), db = require('../config/db'); db.getConnection(); @@ -22,7 +23,7 @@ })); classifierController.trainBayesClassifier(() => { - // classifierController.trainLogisticRegressionClassifier(() => { + // classifierController.trainLogisticRegressionClassifier(() => { app.server.listen(properties.CLASSIFIER_SERVER_PORT); console.log("Server started on port " + properties.CLASSIFIER_SERVER_PORT); }); @@ -39,10 +40,26 @@ let target = req.body.target; console.log("\nConnection from " + ip + "\n Processing: \"" + target + "\""); - let result = classifierController.getClassification(target); - console.log("Result: " + result.effectiveResult); + classifierController.getClassification(target, (results) => { + console.log("Result: " + results.effectiveResult); + res.json(results); + }); + }); + + app.post('/feedback', (req, res) => { + let activityID = req.body.activityID; + let feedback = req.body.feedback; - res.json(result); + activityLogController.updateActivity(activityID, feedback, (err) => { + if (err) { + res.status(400); + res.json(err); + } + else { + res.status(201); + res.json({"Status": "OK"}); + } + }) }); }()); \ No newline at end of file diff --git a/main-services/server.js b/main-services/server.js index 53a94e2..b2bd434 100644 --- a/main-services/server.js +++ b/main-services/server.js @@ -30,6 +30,7 @@ next(); }); + /* Server Routes */ app.post('/classify', (req, serverRes) => { let target = req.body.target; @@ -72,4 +73,48 @@ }); + app.post('/feedback', (req, serverRes) => { + let activityID = req.body.activityID; + let feedback = req.body.feedback; + + const postData = { + activityID: activityID, + feedback: feedback + }; + + let options = { + host: properties.CLASSIFIER_HOST, + port: properties.CLASSIFIER_SERVER_PORT, + method: 'POST', + path: "/feedback", + headers: { + 'Accept': 'application/json', //CONTENT NEGOTIATION: indica ao servidor que a requisição espera um json como resposta + 'Content-type': 'application/json' + } + }; + + const classifierRequest = http.request(options, (res) => { + const {statusCode} = res; + + res.setEncoding('utf8'); + res.on('data', (data) => { + serverRes.json(JSON.parse(data)); + }); + + }); + + classifierRequest.on('error', (e) => { + classifierRequest.status = 400; + if (e.code === "ECONNREFUSED") { + serverRes.send({error: "Classifier is offline"}) + } + else { + serverRes.send(e.message); + } + }); + + classifierRequest.end(JSON.stringify(postData)); + + }); + }()); \ No newline at end of file diff --git a/model/activityLogModel.js b/model/activityLogModel.js new file mode 100644 index 0000000..a0e5c9d --- /dev/null +++ b/model/activityLogModel.js @@ -0,0 +1,32 @@ +/** + * Created by maiquel on 07/03/18. + */ + +(function () { + "use strict"; + + + let mongoose = require("mongoose"), + Schema = mongoose.Schema; + + let activityLogSchema = new Schema({ + text: { + type: String, + required: true + }, + result: { + type: Object, + required: true + }, + datetime: { + type: Date, + required: true + }, + feedback: { + type: Boolean, + } + }); + + module.exports = mongoose.model('ActivityLog', activityLogSchema); + +}()); \ No newline at end of file