|
@@ -1,12 +1,6 @@
|
|
-import { Dict } from "./util";
|
|
|
|
|
|
+import { Dict, tryDo, isHttpError } from "./util";
|
|
import got, { Method } from "got";
|
|
import got, { Method } from "got";
|
|
|
|
|
|
-enum ReqMethod {
|
|
|
|
- GET = "get",
|
|
|
|
- POST = "post",
|
|
|
|
- DELETE = "delete"
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
export interface RequestError {
|
|
export interface RequestError {
|
|
code: string;
|
|
code: string;
|
|
message: string;
|
|
message: string;
|
|
@@ -21,29 +15,32 @@ export class XenforoClient {
|
|
}
|
|
}
|
|
|
|
|
|
private async makeRequest<TResult, TData>(uri: string, method: Method, data?: TData): Promise<TResult> {
|
|
private async makeRequest<TResult, TData>(uri: string, method: Method, data?: TData): Promise<TResult> {
|
|
- const result = await got<TResult | RequestErrorSet>(`${this.endpoint}/${uri}`, {
|
|
|
|
|
|
+ const result = await tryDo(got<TResult | RequestErrorSet>(`${this.endpoint}/${uri}`, {
|
|
responseType: "json",
|
|
responseType: "json",
|
|
method: method,
|
|
method: method,
|
|
headers: {
|
|
headers: {
|
|
"XF-Api-Key": this.userKey
|
|
"XF-Api-Key": this.userKey
|
|
},
|
|
},
|
|
- json: data
|
|
|
|
- });
|
|
|
|
-
|
|
|
|
- if (result.statusCode != 200) {
|
|
|
|
- throw result.body as RequestErrorSet;
|
|
|
|
|
|
+ form: data
|
|
|
|
+ }));
|
|
|
|
+
|
|
|
|
+ if (!result.ok) {
|
|
|
|
+ if (isHttpError(result.error))
|
|
|
|
+ throw result.error.response.body as RequestErrorSet;
|
|
|
|
+ else
|
|
|
|
+ throw { errors: [{ code: "UNK", message: "Unkown error" }] } as RequestErrorSet;
|
|
} else {
|
|
} else {
|
|
- return result.body as TResult;
|
|
|
|
|
|
+ return result.result?.body as TResult;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
async getMe(): Promise<User> {
|
|
async getMe(): Promise<User> {
|
|
- const { me }: {me: User} = await this.makeRequest("me/", ReqMethod.GET);
|
|
|
|
|
|
+ const { me }: {me: User} = await this.makeRequest("me/", "get");
|
|
return me;
|
|
return me;
|
|
}
|
|
}
|
|
|
|
|
|
async postReply(thread_id: number, message: string, attachment_key?: string): Promise<void> {
|
|
async postReply(thread_id: number, message: string, attachment_key?: string): Promise<void> {
|
|
- return await this.makeRequest("posts/", ReqMethod.POST, {
|
|
|
|
|
|
+ return await this.makeRequest("posts/", "post", {
|
|
thread_id,
|
|
thread_id,
|
|
message,
|
|
message,
|
|
attachment_key
|
|
attachment_key
|
|
@@ -51,23 +48,23 @@ export class XenforoClient {
|
|
}
|
|
}
|
|
|
|
|
|
async editThread(id: number, opts?: EditThreadOptions): Promise<CreateThreadResponse> {
|
|
async editThread(id: number, opts?: EditThreadOptions): Promise<CreateThreadResponse> {
|
|
- return await this.makeRequest(`threads/${id}`, ReqMethod.POST, opts);
|
|
|
|
|
|
+ return await this.makeRequest(`threads/${id}`, "post", opts);
|
|
}
|
|
}
|
|
|
|
|
|
async editPost(id: number, opts?: EditPostOptions): Promise<EditPostResponse> {
|
|
async editPost(id: number, opts?: EditPostOptions): Promise<EditPostResponse> {
|
|
- return await this.makeRequest(`posts/${id}`, ReqMethod.POST, opts);
|
|
|
|
|
|
+ return await this.makeRequest(`posts/${id}`, "post", opts);
|
|
}
|
|
}
|
|
|
|
|
|
async getThread(id: number, opts?: GetThreadOptions): Promise<GetThreadResponse> {
|
|
async getThread(id: number, opts?: GetThreadOptions): Promise<GetThreadResponse> {
|
|
- return await this.makeRequest(`threads/${id}`, ReqMethod.GET, opts);
|
|
|
|
|
|
+ return await this.makeRequest(`threads/${id}`, "post", opts);
|
|
}
|
|
}
|
|
|
|
|
|
async deleteThread(id: number, opts?: DeleteThreadOptions): Promise<SuccessResponse> {
|
|
async deleteThread(id: number, opts?: DeleteThreadOptions): Promise<SuccessResponse> {
|
|
- return await this.makeRequest(`threads/${id}`, ReqMethod.DELETE, opts);
|
|
|
|
|
|
+ return await this.makeRequest(`threads/${id}`, "delete", opts);
|
|
}
|
|
}
|
|
|
|
|
|
async createThread(forumId: number, title: string, message: string, opts?: CreateThreadOptions): Promise<CreateThreadResponse> {
|
|
async createThread(forumId: number, title: string, message: string, opts?: CreateThreadOptions): Promise<CreateThreadResponse> {
|
|
- return await this.makeRequest("threads/", ReqMethod.POST, {
|
|
|
|
|
|
+ return await this.makeRequest("threads/", "post", {
|
|
node_id: forumId,
|
|
node_id: forumId,
|
|
title: title,
|
|
title: title,
|
|
message: message,
|
|
message: message,
|
|
@@ -76,12 +73,12 @@ export class XenforoClient {
|
|
}
|
|
}
|
|
|
|
|
|
async getPost(id: number): Promise<Post> {
|
|
async getPost(id: number): Promise<Post> {
|
|
- const { post }: {post: Post} = await this.makeRequest(`posts/${id}`, ReqMethod.GET);
|
|
|
|
|
|
+ const { post }: {post: Post} = await this.makeRequest(`posts/${id}`, "get");
|
|
return post;
|
|
return post;
|
|
}
|
|
}
|
|
|
|
|
|
async getForumThreads(id: number): Promise<GetForumThreadsResponse> {
|
|
async getForumThreads(id: number): Promise<GetForumThreadsResponse> {
|
|
- return await this.makeRequest(`forums/${id}/threads`, ReqMethod.GET);
|
|
|
|
|
|
+ return await this.makeRequest(`forums/${id}/threads`, "get");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|