1 | const {decode} = require('base64-arraybuffer');
|
2 | const uuid = require('uuid');
|
3 | const moment = require('moment-timezone');
|
4 | const Logger = require('@kiina/logger');
|
5 |
|
6 | const logger = new Logger('CASE-API');
|
7 |
|
8 | class 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,
|
106 | Caso_Associado__c: caseID,
|
107 | AreaNPS__c: area,
|
108 | Nota_Atendimento__c: npsScore,
|
109 | Assessor_Atendente__c: ownerID,
|
110 | survey_id__c: surveyId,
|
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,
|
134 | Nota_Atendimento__c: npsScore,
|
135 | Assessor_Atendente__c: atendantId,
|
136 | survey_id__c: surveyId,
|
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 |
|
160 | module.exports = CaseApi; |
\ | No newline at end of file |