feat: 添加 Repo 和 User 模块,增强 CNBCore 功能
This commit is contained in:
126
src/cnb-core.ts
126
src/cnb-core.ts
@@ -1,56 +1,134 @@
|
||||
export type CNBCoreOptions<T = {}> = {
|
||||
token: string;
|
||||
cookie?: string;
|
||||
} & T;
|
||||
|
||||
export type RequestOptions = {
|
||||
url?: string;
|
||||
method?: string;
|
||||
data?: Record<string, any>;
|
||||
body?: any;
|
||||
params?: Record<string, any>;
|
||||
headers?: Record<string, any>;
|
||||
useCookie?: boolean;
|
||||
useOrigin?: boolean;
|
||||
};
|
||||
export class CNBCore {
|
||||
baseURL = 'https://api.cnb.cool';
|
||||
token: string;
|
||||
|
||||
cookie?: string;
|
||||
constructor(options: CNBCoreOptions) {
|
||||
this.token = options.token;
|
||||
this.cookie = options.cookie;
|
||||
}
|
||||
|
||||
async request({ url, method = 'GET', data, params }: { url: string, method?: string, data?: Record<string, any>, params?: Record<string, any> }): Promise<any> {
|
||||
const headers: Record<string, string> = {
|
||||
async request({ url, method = 'GET', data, params, headers, body, useCookie, useOrigin }: RequestOptions): Promise<any> {
|
||||
const defaultHeaders: Record<string, string> = {
|
||||
'Content-Type': 'application/json',
|
||||
'Accept': 'application/json, application/vnd.cnb.api+json, application/vnd.cnb.web+json',
|
||||
'Authorization': `Bearer ${this.token}`,
|
||||
// 'Accept': 'application/json, application/vnd.cnb.api+json, application/vnd.cnb.web+json',
|
||||
'Accept': 'application/json',
|
||||
};
|
||||
if (this.token) {
|
||||
defaultHeaders['Authorization'] = `Bearer ${this.token}`;
|
||||
}
|
||||
if (params) {
|
||||
const queryString = new URLSearchParams(params).toString();
|
||||
url += `?${queryString}`;
|
||||
defaultHeaders['Accept'] = 'application/json';
|
||||
}
|
||||
const response = await fetch(url, {
|
||||
const _headers = { ...defaultHeaders, ...headers };
|
||||
let _body = undefined;
|
||||
if (data) {
|
||||
_body = JSON.stringify(data);
|
||||
}
|
||||
if (body) {
|
||||
_body = body;
|
||||
}
|
||||
if (!_headers.Authorization) {
|
||||
delete _headers.Authorization;
|
||||
}
|
||||
if (useCookie) {
|
||||
_headers['Cookie'] = this.cookie || "";
|
||||
delete _headers.Authorization;
|
||||
}
|
||||
console.log('Request URL:', url, data, _headers);
|
||||
const response = await fetch(url || '', {
|
||||
method,
|
||||
headers,
|
||||
body: data ? JSON.stringify(data) : undefined,
|
||||
headers: _headers,
|
||||
body: _body,
|
||||
});
|
||||
const res = (data: any, message?: string) => {
|
||||
if (useOrigin) {
|
||||
return data;
|
||||
}
|
||||
return {
|
||||
code: 200,
|
||||
message: message || 'success',
|
||||
data,
|
||||
};
|
||||
}
|
||||
if (!response.ok) {
|
||||
const errorText = await response.text();
|
||||
throw new Error(`Request failed with status ${response.status}: ${errorText}`);
|
||||
if (useOrigin)
|
||||
throw new Error(`Request failed with status ${response.status}: ${errorText}`);
|
||||
return res(null, `Request failed with status ${response.status}: ${errorText}`);
|
||||
}
|
||||
|
||||
const contentType = response.headers.get('Content-Type');
|
||||
if (contentType && contentType.includes('application/json')) {
|
||||
return response.json();
|
||||
const values = await response.json();
|
||||
return res(values);
|
||||
} else {
|
||||
return response.text();
|
||||
const text = await response.text();
|
||||
return res(text);
|
||||
}
|
||||
}
|
||||
get<T = any>({ url, params }: { url: string, params?: Record<string, any> }): Promise<T> {
|
||||
const fullUrl = new URL(url, this.baseURL).toString();
|
||||
return this.request({ url: fullUrl, method: 'GET', params });
|
||||
makeUrl(url?: string): string {
|
||||
if (url && url.startsWith('http')) {
|
||||
return url;
|
||||
}
|
||||
return new URL(url || '', this.baseURL).toString();
|
||||
}
|
||||
post<T = any>({ url, data }: { url: string, data?: Record<string, any> }): Promise<T> {
|
||||
const fullUrl = new URL(url, this.baseURL).toString();
|
||||
return this.request({ url: fullUrl, method: 'POST', data });
|
||||
get<T = any>({ url, ...REST }: RequestOptions): Promise<T> {
|
||||
const fullUrl = this.makeUrl(url);
|
||||
return this.request({ url: fullUrl, method: 'GET', ...REST });
|
||||
}
|
||||
put<T = any>({ url, data }: { url: string, data?: Record<string, any> }): Promise<T> {
|
||||
const fullUrl = new URL(url, this.baseURL).toString();
|
||||
return this.request({ url: fullUrl, method: 'PUT', data });
|
||||
post<T = any>({ url, ...REST }: RequestOptions): Promise<T> {
|
||||
const fullUrl = this.makeUrl(url);
|
||||
return this.request({ url: fullUrl, method: 'POST', ...REST });
|
||||
}
|
||||
delete<T = any>({ url, data }: { url: string, data?: Record<string, any> }): Promise<T> {
|
||||
const fullUrl = new URL(url, this.baseURL).toString();
|
||||
return this.request({ url: fullUrl, method: 'DELETE', data });
|
||||
put<T = any>({ url, ...REST }: RequestOptions): Promise<T> {
|
||||
const fullUrl = this.makeUrl(url);
|
||||
return this.request({ url: fullUrl, method: 'PUT', ...REST });
|
||||
}
|
||||
}
|
||||
delete<T = any>({ url, ...REST }: RequestOptions): Promise<T> {
|
||||
const fullUrl = this.makeUrl(url);
|
||||
return this.request({ url: fullUrl, method: 'DELETE', ...REST });
|
||||
}
|
||||
patch<T = any>({ url, ...REST }: RequestOptions): Promise<T> {
|
||||
const fullUrl = this.makeUrl(url);
|
||||
return this.request({ url: fullUrl, method: 'PATCH', ...REST });
|
||||
}
|
||||
/**
|
||||
* 通过 PUT 请求上传文件内容
|
||||
* @param data 包含 URL、token 和文件内容
|
||||
* @returns 上传结果
|
||||
*/
|
||||
async putFile(data: { url: string, token: string, content: string | Buffer }): Promise<any> {
|
||||
return this.request({
|
||||
url: data.url,
|
||||
method: 'PUT',
|
||||
body: data.content,
|
||||
headers: {
|
||||
'Authorization': `Bearer ${data.token}`,
|
||||
'Content-Type': 'application/octet-stream'
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
export type Result<T = any> = {
|
||||
code: number;
|
||||
message: string;
|
||||
data: T
|
||||
};
|
||||
Reference in New Issue
Block a user