import fetch, {HeadersInit, RequestInit, Response} from "node-fetch" import {TemplateData, TemplateResponse} from "../TemplateData"; import {GroupData, GroupResponse} from "../GroupData"; class ApiSdk { constructor(host: string) { this.host = host; } private readonly host: string; private Endpoint(path: string): string { return `${this.host}/${path}`; } private async ping(path: string, method: string = "GET", content: any = null, headers: HeadersInit = { accept: "application/json", 'Content-Type': 'application/json' }): Promise { try { const request: RequestInit = { method, headers, }; if (content != null) { request.body = JSON.stringify(content); } return await this.fetch(this.Endpoint(path), request); } catch (e) { return Promise.reject(e); } } private async fetch(input: string, init?: RequestInit): Promise { const response: Response = await fetch(input, init); if (response.status === 204) { return {} as T; } let body: T = {} as T; try { body = await response.json(); } catch {} if (!response.ok) return Promise.reject({name: "Error", message: body, type: response.status}); return body; } async TemplateExist(k: string): Promise { try { await this.ping(`template/${k}`, "HEAD"); return true; } catch (e) { return false; } } async GetTemplateData(k: string): Promise { try { return await this.ping(`template/${k}`, "GET", null, { cli: "kirinnee" }); } catch (e) { return Promise.reject(e); } } async GetGroupData(k: string): Promise { try { return await this.ping(`group/${k}`, "GET", null, {cli: "kirinnee"}); } catch (e) { return Promise.reject(e); } } async GroupExist(k: string): Promise { try { await this.ping(`group/${k}`, "HEAD"); return true; } catch (e) { return false; } } async getReadMeContent(k: string): Promise { const ep = PRODUCTION ? k : this.Endpoint(k); const response: Response = await fetch(ep); return await response.text() }; async UpdateTemplate(template: TemplateData, secret: string): Promise { try { const body = { name: template.name, repo: template.repo, secret, email: template.email, readme: template.readme, }; await this.ping(`template/${template.key}`, "PUT", body); return } catch (e) { return Promise.reject(e); } } async UpdateGroup(group: GroupData, secret: string): Promise { try { const body = { name: group.name, secret, email: group.email, readme: group.readme, templates: Object.keys(group.templates) }; await this.ping(`group/${group.key}`, "PUT", body); return; } catch (e) { return Promise.reject(e); } } } export {ApiSdk}