blob: e8f665ce42e68ad329c6611919de1c435683b6da [file] [log] [blame]
Adrià Vilanova Martínez54964a52022-10-26 23:53:29 +02001import {CCApi} from '../../../../common/api.js';
2import {getAuthUser} from '../../../../common/communityConsoleUtils.js';
3
4const kPiiScanType_ScanNone = 0;
5const kType_Reply = 1;
6const kType_RecommendedAnswer = 3;
7const kPostMethodCommunityConsole = 4;
8
9export default class CRRunner {
10 constructor() {
11 this._CRs = [];
12 this._haveCRsBeenLoaded = false;
13 }
14
15 loadCRs() {
16 return CCApi(
17 'ListCannedResponses', {}, /* authenticated = */ true,
18 getAuthUser())
19 .then(res => {
20 this._CRs = res?.[1] ?? [];
21 this._haveCRsBeenLoaded = true;
22 });
23 }
24
25 _getCRPayload(id) {
26 let maybeLoadCRsPromise;
27 if (!this._haveCRsBeenLoaded)
28 maybeLoadCRsPromise = this.loadCRs();
29 else
30 maybeLoadCRsPromise = Promise.resolve();
31
32 return maybeLoadCRsPromise.then(() => {
33 let cr = this._CRs.find(cr => cr?.[1]?.[1] == id);
34 if (!cr) throw new Error(`Couldn't find CR with id ${id}.`);
35 return cr?.[3];
36 });
37 }
38
39 execute(action, thread) {
40 let crId = action?.getCannedResponseId?.();
41 if (!crId)
42 return Promise.reject(
43 new Error('The action doesn\'t contain a valid CR id.'));
44
45 return this._getCRPayload(crId).then(payload => {
46 let subscribe = action?.getSubscribe?.() ?? false;
47 let markAsAnswer = action?.getMarkAsAnswer?.() ?? false;
48 return CCApi(
49 'CreateMessage', {
50 1: thread.forum, // forumId
51 2: thread.thread, // threadId
52 // message
53 3: {
54 4: payload,
55 6: {
56 1: markAsAnswer ? kType_RecommendedAnswer : kType_Reply,
57 },
58 11: kPostMethodCommunityConsole,
59 },
60 4: subscribe,
61 6: kPiiScanType_ScanNone,
62 },
63 /* authenticated = */ true, getAuthUser());
64 });
65 }
66}