blob: 16385a9cd6b7cf7605c678ed42f9b2e5e9b4a285 [file] [log] [blame]
Adrià Vilanova Martíneza10fff22021-06-29 21:07:40 +02001const CC_API_BASE_URL = 'https://support.google.com/s/community/api/';
2
Adrià Vilanova Martínezfeb28192021-08-07 23:31:17 +02003const apiErrors = {
4 0: 'OK',
5 1: 'CANCELLED',
6 2: 'UNKNOWN',
7 3: 'INVALID_ARGUMENT',
8 4: 'DEADLINE_EXCEEDED',
9 5: 'NOT_FOUND',
10 6: 'ALREADY_EXISTS',
11 7: 'PERMISSION_DENIED',
12 8: 'RESOURCE_EXHAUSTED',
13 9: 'FAILED_PRECONDITION',
14 10: 'ABORTED',
15 11: 'OUT_OF_RANGE',
avm9996347c407b2021-08-18 09:54:35 +020016 12: 'UNIMPLEMENTED',
Adrià Vilanova Martínezfeb28192021-08-07 23:31:17 +020017 13: 'INTERNAL',
18 14: 'UNAVAILABLE',
19 15: 'DATA_LOSS',
20 16: 'UNAUTHENTICATED',
21};
22
Adrià Vilanova Martíneza10fff22021-06-29 21:07:40 +020023// Function to wrap calls to the Community Console API with intelligent error
24// handling.
Adrià Vilanova Martínezc41edf42021-07-18 02:06:55 +020025export function CCApi(
26 method, data, authenticated, authuser = 0,
27 returnUnauthorizedStatus = false) {
Adrià Vilanova Martínezfeb28192021-08-07 23:31:17 +020028 let authuserPart =
Adrià Vilanova Martíneza10fff22021-06-29 21:07:40 +020029 authuser == '0' ? '' : '?authuser=' + encodeURIComponent(authuser);
30
31 return fetch(CC_API_BASE_URL + method + authuserPart, {
32 'headers': {
33 'content-type': 'text/plain; charset=utf-8',
34 },
35 'body': JSON.stringify(data),
36 'method': 'POST',
37 'mode': 'cors',
38 'credentials': (authenticated ? 'include' : 'omit'),
39 })
40 .then(res => {
41 if (res.status == 200 || res.status == 400) {
42 return res.json().then(data => ({
43 status: res.status,
44 body: data,
45 }));
46 } else {
47 throw new Error(
48 'Status code ' + res.status + ' was not expected when calling ' +
49 method + '.');
50 }
51 })
52 .then(res => {
53 if (res.status == 400) {
Adrià Vilanova Martínezc41edf42021-07-18 02:06:55 +020054 // If the canonicalCode is PERMISSION_DENIED:
55 if (returnUnauthorizedStatus && res.body?.[2] == 7)
56 return {
57 unauthorized: true,
58 };
59
Adrià Vilanova Martíneza10fff22021-06-29 21:07:40 +020060 throw new Error(
61 res.body[4] ||
62 ('Response status 400 for method ' + method + '. ' +
Adrià Vilanova Martínezfeb28192021-08-07 23:31:17 +020063 'Error code: ' +
64 (apiErrors[res.body?.[2]] ?? res.body?.[2] ?? 'unknown')));
Adrià Vilanova Martíneza10fff22021-06-29 21:07:40 +020065 }
66
Adrià Vilanova Martínezc41edf42021-07-18 02:06:55 +020067 if (returnUnauthorizedStatus)
68 return {
69 unauthorized: false,
70 body: res.body,
71 };
72
Adrià Vilanova Martíneza10fff22021-06-29 21:07:40 +020073 return res.body;
74 });
75}