Files
web-app/app/api/client.ts

134 lines
2.3 KiB
TypeScript

interface get {
"/item": {
parameters: {
query: {
uuid: string;
};
};
return: Item;
};
"/items": {
parameters: {
query?: never;
};
return?: Array<Item>;
};
"/case": {
parameters: {
query: {
uuid: string;
};
};
return: Case;
};
"/cases": {
parameters: {
query?: never;
};
return?: Array<Case>;
};
}
interface post {
"/login": {
parameters: {
query?: never;
body: {
username: string;
password: string;
};
};
return: User;
};
"/logout": {
parameters: {
query?: never;
body?: never;
};
return?: never;
};
"/register": {
parameters: {
query?: never;
body: {
username: string;
password: string;
email: string;
};
};
return?: never;
};
}
export interface Item {
uuid: string;
name: string;
rarity: number;
price: number;
image: string;
}
export interface Case {
uuid: string;
name: string;
price: number;
image: string;
}
export interface User {
uuid: string;
username: string;
}
class Client {
baseUrl: string;
constructor(baseUrl: string) {
this.baseUrl = baseUrl;
}
async GET<T extends keyof get>(
path: T,
parameters: get[T]["parameters"]
): Promise<[get[T]["return"], number]> {
let query = parameters["query"]
? "?" + new URLSearchParams(parameters["query"])
: "";
let response = await fetch(this.baseUrl + path + query, {
method: "GET",
headers: {
"Content-Type": "application/json",
},
});
let data = await response.json();
return [data, response.status];
}
async POST<T extends keyof post>(
path: T,
parameters: post[T]["parameters"]
): Promise<[post[T]["return"], number]> {
let query = parameters["query"]
? "?" + new URLSearchParams(parameters["query"])
: "";
let response = await fetch(this.baseUrl + path + query, {
method: "POST",
body: JSON.stringify(parameters["body"]),
headers: {
"Content-Type": "application/json",
},
});
let data;
try {
data = await response.json();
} catch (_) {
data = null;
}
return [data, response.status];
}
}
const client = new Client("http://127.0.0.1:8000");
export default client;