voicemail-ticketizer/src/sonar.ts
2021-03-10 22:10:47 -07:00

57 lines
1.3 KiB
TypeScript

import fetch from "node-fetch";
// simply to allow for gql tag syntax highlighting
export function gql(strings: TemplateStringsArray) {
return strings.join("");
}
export class Sonar {
url: string;
token: string;
constructor(url: string, token: string) {
this.url = url;
this.token = token;
}
async request(query: string, variables: any = {}) {
const resp = await fetch(this.url, {
method: "POST",
body: JSON.stringify({ query, variables }),
headers: {
"Content-Type": "application/json",
Authorization: "Bearer " + this.token,
},
});
if (!resp.ok) {
throw new Error(
`${resp.status} ${resp.statusText} ${JSON.stringify(await resp.json())}`
);
}
const { data, errors } = await resp.json();
if (errors) {
throw new Error(errors[0].message);
}
return data;
}
async handlePagination(
query: string,
key: string,
callback: (entities: any) => void | Promise<void>
) {
let page = 1;
let morePages = false;
do {
const response = await this.request(query, { page });
const { entities, page_info } = response[key];
morePages = page_info.total_pages > page;
await callback(entities);
page++;
} while (morePages);
}
}