feat: 添加 Repo 和 User 模块,增强 CNBCore 功能

This commit is contained in:
2025-12-15 17:08:39 +08:00
parent 5e43eb2db7
commit 52ccf115fb
9 changed files with 390 additions and 32 deletions

View File

@@ -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
};