152 lines
4.0 KiB
JavaScript
152 lines
4.0 KiB
JavaScript
// auto-split module
|
|
|
|
|
|
function sleep(ms) {
|
|
return new Promise(r => setTimeout(r, ms));
|
|
}
|
|
|
|
|
|
async function getJSON(url) {
|
|
const r = await fetch(url, {
|
|
method: "GET",
|
|
headers: {
|
|
"Authorization": "Bearer " + DOCBEE_TOKEN,
|
|
"Accept": "application/json"
|
|
}
|
|
});
|
|
const text = await r.text().catch(() => "-");
|
|
let json = null;
|
|
try {
|
|
json = JSON.parse(text);
|
|
} catch {}
|
|
console.log("[DocBee][GET]", url);
|
|
console.log("[DocBee][RES]", r.status, text.slice(0, 700));
|
|
return {
|
|
ok: r.ok,
|
|
status: r.status,
|
|
json,
|
|
text
|
|
};
|
|
}
|
|
|
|
|
|
async function putJSON(url, body) {
|
|
const r = await fetch(url, {
|
|
method: "PUT",
|
|
headers: {
|
|
"Authorization": "Bearer " + DOCBEE_TOKEN,
|
|
"Content-Type": "application/json; charset=utf-8",
|
|
"Accept": "application/json"
|
|
},
|
|
body: JSON.stringify(body)
|
|
});
|
|
const text = await r.text().catch(() => "-");
|
|
console.log("[DocBee][PUT]", url, body);
|
|
console.log("[DocBee][RES]", r.status, text.slice(0, 700));
|
|
let json = null;
|
|
try {
|
|
json = JSON.parse(text);
|
|
} catch {}
|
|
return {
|
|
ok: r.ok,
|
|
status: r.status,
|
|
json,
|
|
text
|
|
};
|
|
}
|
|
|
|
|
|
async function postJSON(url, body) {
|
|
const r = await fetch(url, {
|
|
method: "POST",
|
|
headers: {
|
|
"Authorization": "Bearer " + DOCBEE_TOKEN,
|
|
"Content-Type": "application/json; charset=utf-8",
|
|
"Accept": "application/json"
|
|
},
|
|
body: JSON.stringify(body)
|
|
});
|
|
const text = await r.text().catch(() => "-");
|
|
console.log("[DocBee][POST]", url, body);
|
|
console.log("[DocBee][RES]", r.status, text.slice(0, 700));
|
|
if (r.status === 401) {
|
|
try {
|
|
updateTokenBadge("bad");
|
|
} catch (_) {}
|
|
}
|
|
return {
|
|
ok: r.ok,
|
|
status: r.status,
|
|
text
|
|
};
|
|
}
|
|
|
|
|
|
async function restoreTicketStatus(ticketId, prevStatusId) {
|
|
try {
|
|
const maxLoops = 5; // ~30s
|
|
let stable = 0;
|
|
for (let i = 0; i < maxLoops; i++) {
|
|
await sleep(100);
|
|
const tCur = await getJSON(`${DOCBEE_BASEURL}/restApi/v1/ticket/${ticketId}?fields=ticketStatus`);
|
|
const curId = tCur?.json?.ticketStatus ?? null;
|
|
if (curId == null) break;
|
|
if (curId !== prevStatusId) {
|
|
let r = await putJSON(`${DOCBEE_BASEURL}/restApi/v1/ticket/${ticketId}`, {
|
|
ticketStatus: {
|
|
id: prevStatusId
|
|
}
|
|
});
|
|
if (!r.ok) {
|
|
await putJSON(`${DOCBEE_BASEURL}/restApi/v1/ticket/${ticketId}`, {
|
|
status: {
|
|
id: prevStatusId
|
|
}
|
|
});
|
|
}
|
|
stable = 0;
|
|
} else {
|
|
stable++;
|
|
if (stable >= 2) break;
|
|
}
|
|
}
|
|
} catch (e) {
|
|
console.warn("[DocBee] restoreTicketStatus failed:", e);
|
|
}
|
|
}
|
|
|
|
|
|
async function setTicketStatus(ticketId, statusId) {
|
|
const base = `${DOCBEE_BASEURL}/restApi/v1`;
|
|
const tries = [
|
|
() => putJSON(`${base}/ticket/${ticketId}`, {
|
|
ticketStatus: statusId
|
|
}),
|
|
];
|
|
let last = null;
|
|
for (let i = 0; i < tries.length; i++) {
|
|
try {
|
|
const r = await tries[i]();
|
|
console.log(`[DocBee][STATUS][try ${i}]`, r?.status, r?.ok);
|
|
if (r && r.ok) return {
|
|
ok: true,
|
|
variant: i,
|
|
status: r.status,
|
|
text: r.text
|
|
};
|
|
last = r;
|
|
} catch (e) {
|
|
console.warn(`[DocBee][STATUS][try ${i}] exception`, e);
|
|
last = {
|
|
ok: false,
|
|
status: 0,
|
|
text: String(e)
|
|
};
|
|
}
|
|
}
|
|
return last || {
|
|
ok: false
|
|
};
|
|
}
|
|
|