-
Notifications
You must be signed in to change notification settings - Fork 8
/
civicrm.js
128 lines (108 loc) · 3.08 KB
/
civicrm.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/*ex:
var config = {
server:'http://example.org',
path:'/civicrm/ajax/rest/api4', (optional, default)
key:'your key from settings.civicrm.php',(optional)
api_key:'the user key'
};
*/
class crmAPI {
constructor(options) {
this.options = {
path: "/civicrm/ajax/api4",
sequential: 1,
json: 1,
debug: false,
...options,
};
if (!this.options.api_key) {
throw new Error ("civicrm missing api_key")
}
this.headers = {
// "Content-Type": "application/json;charset=UTF-8",
"X-Requested-With": "XMLHttpRequest",
"Content-Type": "application/x-www-form-urlencoded",
"X-Civi-Auth": "Bearer " + this.options.api_key,
Authorization: "Bearer " + this.options.api_key,
};
if (options.key) this.headers["X-Civi-Key"] = options.key;
if (!this.options.server) {
console.error(
"missing config.server in the initialization of civicrm API (should be the url of your civi install)"
);
}
}
urlize = function (entity, action) {
return (
this.options.server + this.options.path + "/" + entity + "/" + action
);
/* api v3?
const separator = this.options.server.includes("?") ? "&" : "?";
return (
this.options.server +
this.options.path +
separator +
qs.stringify({
entity: entity,
action: action,
})
);
*/
};
debug = function (enable) {
this.options.debug = enable || true;
};
api4 = async (entity, action, params, index) => {
const uri = this.urlize(entity, action);
if (this.options.debug) {
params.debug=true;
console.log(
"->api." + entity + "." + action,
uri,
index ? index : null,
JSON.stringify(params)
);
}
let b = { params: JSON.stringify(params) };
if (typeof index !== undefined) {
if (typeof index === "object") {
Object.keys(index).forEach((d) => (b["index[" + d + "]"] = index[d]));
} else {
if (index) b.index = index;
}
}
let body = new URLSearchParams(b).toString();
console.log("headers",this.headers);
const response = await fetch(uri, {
method: "POST",
redirect: "manual",
headers: this.headers,
body: body,
});
if (response.status === 301) {
throw new Error(`HTTP redirect! use ${response.url} instead`);
}
if (!response.ok) {
throw new Error(`HTTP error! Status: ${response.status}`);
}
const responseData = await response.json();
return responseData;
};
get = async (entity, params, index) => {
return this.api4(entity, "get", params, index);
};
create = async (entity, params, index) => {
return this.api4(entity, "create", params, index || 0);
};
update = async (entity, params, index) => {
// todo, test if params.id is set
return this.api4(entity, "update", params, index || 0);
};
delete = async (entity, params, index) => {
return this.api4(entity, "delete", params, index || 0);
};
}
var crmFactory = function (options) {
return new crmAPI(options);
};
module.exports = crmFactory;