Initial commit
This commit is contained in:
commit
3d4c04fcde
3 changed files with 181 additions and 0 deletions
17
package.json
Normal file
17
package.json
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
{
|
||||||
|
"name": "oohost.js",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"description": "TypeScript library for accessing the oohost API",
|
||||||
|
"main": "src/index.ts",
|
||||||
|
"license": "MIT",
|
||||||
|
"author": "oohost.cz",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.codespace.cz/oohost/oohost.js"
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"oohost",
|
||||||
|
"webhosting",
|
||||||
|
"api"
|
||||||
|
]
|
||||||
|
}
|
161
src/API.ts
Normal file
161
src/API.ts
Normal file
|
@ -0,0 +1,161 @@
|
||||||
|
/**
|
||||||
|
* Class for requesting API
|
||||||
|
*/
|
||||||
|
export default class API {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default API endpoint
|
||||||
|
*/
|
||||||
|
public static readonly defaultEndpoint = "https://api.oohost.cz/";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* API endpoint
|
||||||
|
*/
|
||||||
|
public static endpoint = this.defaultEndpoint;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send request to the API and create Response
|
||||||
|
* @param url requested URL
|
||||||
|
* @param data request data
|
||||||
|
* @returns Response instance
|
||||||
|
*/
|
||||||
|
static async get(url: string, data: ComboObject = {}): Promise<Response> {
|
||||||
|
let opt: RequestInit = {method: "post", body: JSON.stringify(data), headers: {"Content-Type": "application/json"}, credentials: "include"};
|
||||||
|
let res = (await fetch(API.endpoint + url, opt));
|
||||||
|
return new Response(await res.json());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Response class
|
||||||
|
*/
|
||||||
|
export class Response {
|
||||||
|
|
||||||
|
data: Response.Data = {};
|
||||||
|
errors: Response.Error[] = [];
|
||||||
|
took: number;
|
||||||
|
success: boolean;
|
||||||
|
session?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create Response instance from JSON response
|
||||||
|
* @param data JSON response
|
||||||
|
*/
|
||||||
|
constructor(data: ComboObject) {
|
||||||
|
|
||||||
|
data = Object.assign({errors: ["api"], took: -1, success: false, session: undefined}, data);
|
||||||
|
|
||||||
|
this.errors = data.errors;
|
||||||
|
delete data.errors;
|
||||||
|
|
||||||
|
this.took = data.took;
|
||||||
|
delete data.took;
|
||||||
|
|
||||||
|
this.success = data.success;
|
||||||
|
delete data.success;
|
||||||
|
|
||||||
|
this.session = data.session;
|
||||||
|
delete data.session;
|
||||||
|
|
||||||
|
this.data = data;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Reponse meta keys
|
||||||
|
* @returns meta keys
|
||||||
|
*/
|
||||||
|
get_meta() {
|
||||||
|
let keys: Response.MetaKeys[] = ["errors", "took", "success", "session"];
|
||||||
|
let meta: ComboObject = {};
|
||||||
|
keys.forEach(key => {
|
||||||
|
meta[key] = this[key];
|
||||||
|
});
|
||||||
|
return meta;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Recreate original response
|
||||||
|
* @returns JSON response
|
||||||
|
*/
|
||||||
|
get() {
|
||||||
|
let response: Response.Main = Object.assign({}, this.data, {errors: this.errors, took: this.took, success: this.success, session: this.session});
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if Response has specified error code
|
||||||
|
* @param error error code
|
||||||
|
* @returns boolean or ExtendedError
|
||||||
|
*/
|
||||||
|
has_error(error: string): Response.ExtendedError | boolean {
|
||||||
|
let found: boolean = false;
|
||||||
|
let response: Response.ExtendedError | undefined;
|
||||||
|
this.errors.forEach(err => {
|
||||||
|
if (typeof err == "string") {
|
||||||
|
if (error == err) found = true;
|
||||||
|
} else {
|
||||||
|
if (error == err.code) response = err;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (response) return response;
|
||||||
|
return found;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all errors in Response
|
||||||
|
* @returns Response errors
|
||||||
|
*/
|
||||||
|
get_errors() {
|
||||||
|
let errors: Response.ExtendedError[] = [];
|
||||||
|
this.errors.forEach(err => {
|
||||||
|
if (typeof err == "string") errors.push({code: err});
|
||||||
|
else errors.push(err);
|
||||||
|
});
|
||||||
|
return errors;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get first error in Response
|
||||||
|
* @returns Response error
|
||||||
|
*/
|
||||||
|
get_error(): null | Response.ExtendedError {
|
||||||
|
let errors = this.get_errors();
|
||||||
|
return errors[0] ? errors[0] : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get errors sorted by their relations
|
||||||
|
* @returns Related errors
|
||||||
|
*/
|
||||||
|
get_errors_related() {
|
||||||
|
let resp: Response.RelatedErrors = {};
|
||||||
|
this.get_errors().forEach(e => {
|
||||||
|
let keys = ["global"];
|
||||||
|
if (e.related_to) {
|
||||||
|
keys = Array.isArray(e.related_to) ? e.related_to : [e.related_to];
|
||||||
|
}
|
||||||
|
keys.forEach(k => {
|
||||||
|
if (!resp[k]) resp[k] = [];
|
||||||
|
resp[k].push(e);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return resp;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
export namespace Response {
|
||||||
|
export interface Main extends Data {errors: Error[], took: number | null, success: boolean}
|
||||||
|
export interface Data {[U: string]: any}
|
||||||
|
export type Error = string | ExtendedError;
|
||||||
|
export interface ExtendedError {code: string, related_to?: string | string[], [U: string]: any}
|
||||||
|
export type MetaKeys = "errors" | "took" | "success" | "session";
|
||||||
|
export interface RelatedErrors {[U: string]: Response.ExtendedError[]}
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ComboObject {
|
||||||
|
[U: string]: any
|
||||||
|
}
|
3
src/index.ts
Normal file
3
src/index.ts
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
import API from "./API";
|
||||||
|
|
||||||
|
export { API };
|
Loading…
Reference in a new issue