UNPKG

5.02 kBJavaScriptView Raw
1const {decode} = require('base64-arraybuffer');
2const uuid = require('uuid');
3const moment = require('moment-timezone');
4const Logger = require('@kiina/logger');
5
6const logger = new Logger('CASE-API');
7
8class CaseApi {
9
10 constructor(config, driver = require('nforce')) {
11 this.__driver = driver;
12 this.__config = config;
13 this.__connection = this.__driver.createConnection(config);
14 }
15
16 static getInstance(config) {
17 if(!this.instance) this.instance = new CaseApi(config);
18 return this.instance;
19 }
20
21 authenticate() {
22 const { username, password, securityToken } = this.__config;
23 return new Promise((resolve, reject) => {
24 this.__connection.authenticate({ username, password, securityToken }, (error, oauth) => {
25 if (error) {
26 logger.error('AuthenticationError:', error.stack);
27 return reject(error);
28 }
29 else resolve(oauth);
30 });
31 });
32 }
33
34 __createCaseObject(args = {}) {
35 return this.__driver.createSObject('Case', { ...args });
36 }
37
38 async __insertCase(sobject) {
39 const oauth = await this.authenticate();
40 return new Promise((resolve, reject) => {
41 this.__connection.insert({ sobject, oauth }, (error, resp) => {
42 if (error) {
43 logger.error('InsertCaseError:', error.stack);
44 return reject(error);
45 }
46 else resolve(resp);
47 });
48 });
49 }
50
51 __getCaseId(oauth, sessionId){
52 let query = `SELECT caseID, ID, ChatKey, ownerID FROM LiveChatTranscript WHERE ChatKey = '${sessionId}'
53 LIMIT 1`;
54 return new Promise((resolve, reject) => {
55 this.__connection.query({ query: query }, function(err, res) {
56 logger.info("__getCaseId", res);
57 if(err) {
58 logger.error(err);
59 return reject(err);
60 }
61 else {
62 resolve(res.records[0]);
63 }
64 });
65 });
66 }
67
68 __insertObject(oauth, caseID, tableName, data) {
69 return new Promise((resolve, reject) => {
70 let sobject = this.__driver.createSObject(tableName, data);
71 this.__connection.insert({sobject, oauth}, (err, resp) => {
72 if(err) {
73 logger.error('err:', err);
74 reject(err);
75 }
76 resolve(resp.id);
77 })
78 });
79 }
80
81 async __insertFiles(oauth, caseID, fileObject, fileName) {
82 fileObject = decode(fileObject);
83 let att = {
84 Name: fileName,
85 ParentId: caseID,
86 attachment: {
87 fileName: fileName,
88 body: fileObject
89 }
90 };
91 return await this.__insertObject(oauth, caseID, 'Attachment', att);
92 }
93
94 async insertFiles(sessionId, filesObject, filesName) {
95 const oauth = await this.authenticate();
96 let caseID = await this.__getCaseId(oauth, sessionId);
97 for(let file = 0; file < filesObject.length; file++){
98 await this.__insertFiles(oauth, caseID._fields.caseid, filesObject[file], filesName[file]);
99 }
100 }
101
102 async __saveNPS(oauth, caseID, ownerID, area, npsScore, name, client, RecordTypeId){
103 let surveyId = uuid.v4();
104 let att = {
105 Name: name, //identify the area
106 Caso_Associado__c: caseID,
107 AreaNPS__c: area, //identify the area
108 Nota_Atendimento__c: npsScore,
109 Assessor_Atendente__c: ownerID,
110 survey_id__c: surveyId, //generate uuid.v4
111 RecordTypeId,
112 NPS_Conta_Rico__r: {
113 Numero_da_Conta_Rico__c: client.toString()
114 },
115 NPS_Data_de_resposta__c: moment().tz('America/Sao_Paulo').format()
116 };
117 let respInsertObj = await this.__insertObject(oauth, caseID, 'NPS__c', att);
118 console.log('respInsertObj', respInsertObj);
119 return respInsertObj;
120 }
121
122 async saveNPS(sessionId, area, npsScore, name, client, RecordTypeId) {
123 const oauth = await this.authenticate();
124 let caseID = await this.__getCaseId(oauth, sessionId);
125 let resp__saveNPS = await this.__saveNPS(oauth, caseID._fields.caseid, caseID._fields.ownerid, area, npsScore, name, client, RecordTypeId);
126 console.log('resp__saveNPS', resp__saveNPS);
127 return resp__saveNPS;
128 }
129
130 async __saveCSAT(oauth, npsScore, name, lastMessages, client, atendantId, RecordTypeId){
131 let surveyId = uuid.v4();
132 let att = {
133 Name: name, //identify the area
134 Nota_Atendimento__c: npsScore,
135 Assessor_Atendente__c: atendantId,
136 survey_id__c: surveyId, //generate uuid.v4
137 RecordTypeId,
138 Comentario__c: lastMessages,
139 NPS_Conta_Rico__r: {
140 Numero_da_Conta_Rico__c: client.toString()
141 },
142 NPS_Data_de_resposta__c: moment().tz('America/Sao_Paulo').format()
143 };
144 return await this.__insertObject(oauth, null, 'NPS__c', att);
145 }
146
147 async saveCSAT(npsScore, name, lastMessages,client, atendantId, RecordTypeId ) {
148 const oauth = await this.authenticate();
149 this.__saveCSAT(oauth, npsScore, name, lastMessages, client, atendantId, RecordTypeId);
150 }
151
152
153 async createCase(sfCase) {
154 sfCase = sfCase || {};
155 sfCase = this.__createCaseObject(sfCase);
156 await this.__insertCase(sfCase);
157 }
158}
159
160module.exports = CaseApi;
\No newline at end of file