128 lines
3.4 KiB
TypeScript
128 lines
3.4 KiB
TypeScript
import { CNBCore, CNBCoreOptions } from "../cnb-core.ts";
|
|
import { Result } from "@kevisual/query";
|
|
export class User extends CNBCore {
|
|
constructor(options: CNBCoreOptions<{}>) {
|
|
super(options);
|
|
}
|
|
|
|
/**
|
|
* 获取当前用户信息,使用 Cookie 认证
|
|
* @returns
|
|
*/
|
|
getCurrentUser(): Promise<Result<UserInfo>> {
|
|
const url = `${this.hackURL}/user`;
|
|
return this.get({
|
|
url,
|
|
useCookie: true,
|
|
});
|
|
}
|
|
/**
|
|
* 判断当前 Cookie 是否有效
|
|
* @returns
|
|
*/
|
|
async checkCookieValid(): Promise<Result> {
|
|
const user = await this.getCurrentUser();
|
|
if (user.code === 200) {
|
|
return { code: 200, message: 'cookie valid' };
|
|
} else {
|
|
return { code: 401, message: 'cookie invalid' };
|
|
}
|
|
}
|
|
/**
|
|
* 使用 Token 获取用户信息
|
|
* @returns
|
|
*/
|
|
getUser(): Promise<Result<UserInfo>> {
|
|
const url = '/user';
|
|
return this.get({ url });
|
|
}
|
|
createAccessToken(data?: { description?: string, scope?: string }): Promise<AccessTokenResponse> {
|
|
const scope = data?.scope || 'mission-manage:rw,mission-delete:rw,group-delete:rw,group-manage:rw,group-resource:rw,account-engage:rw,account-email:r,account-profile:rw,registry-delete:rw,registry-manage:rw,registry-package-delete:rw,registry-package:rw,repo-security:r,repo-delete:rw,repo-manage:rw,repo-basic-info:r,repo-cnb-detail:rw,repo-cnb-history:r,repo-cnb-trigger:rw,repo-commit-status:rw,repo-contents:rw,repo-notes:rw,repo-issue:rw,repo-pr:rw,repo-code:rw'
|
|
const url = `${this.hackURL}/user/personal_access_tokens`
|
|
return this.post({
|
|
url,
|
|
useCookie: true,
|
|
data: {
|
|
description: data?.description || 'Created at ' + new Date().toISOString(),
|
|
scope: scope,
|
|
}
|
|
})
|
|
}
|
|
getAccessTokens(params?: { page?: number, page_size?: number }): Promise<AccessTokenResponse[]> {
|
|
const url = `${this.hackURL}/user/personal_access_tokens`
|
|
return this.get({
|
|
url,
|
|
useCookie: true,
|
|
params: {
|
|
...params,
|
|
page: params?.page || 1,
|
|
page_size: params?.page_size || 20,
|
|
}
|
|
})
|
|
}
|
|
deleteAccessToken(tokenId: string): Promise<any> {
|
|
const url = `${this.hackURL}/user/personal_access_tokens/${tokenId}`
|
|
return this.delete({
|
|
url,
|
|
useCookie: true,
|
|
})
|
|
}
|
|
}
|
|
|
|
type AccessTokenResponse = {
|
|
token: string;
|
|
description: string;
|
|
}
|
|
|
|
type UserInfo = {
|
|
id: string;
|
|
username: string;
|
|
nickname: string;
|
|
type: number;
|
|
verified: number;
|
|
verified_expire_in: string;
|
|
created_at: string;
|
|
freeze: boolean;
|
|
locked: boolean;
|
|
avatar: string;
|
|
email: string;
|
|
next_updated_name_at: string;
|
|
updated_name_at: string;
|
|
updated_nick_at: string;
|
|
editable: {
|
|
avatar: boolean;
|
|
email: boolean;
|
|
logoff: boolean;
|
|
nickname: boolean;
|
|
'sync-data': boolean;
|
|
username: boolean;
|
|
};
|
|
language: string;
|
|
appearance: string;
|
|
gender: number;
|
|
bio: string;
|
|
company: string;
|
|
location: string;
|
|
site: string;
|
|
address: string;
|
|
wechat_mp: string;
|
|
wechat_mp_qrcode: string;
|
|
appreciate_status: number;
|
|
follow_count: number;
|
|
follower_count: number;
|
|
reward_count: number;
|
|
reward_amount: number;
|
|
stars_count: number;
|
|
group_count: number;
|
|
repo_count: number;
|
|
mission_count: number;
|
|
registry_count: number;
|
|
public_repo_count: number;
|
|
public_mission_count: number;
|
|
public_registry_count: number;
|
|
follow_repo_count: number;
|
|
follow_mission_count: number;
|
|
readme_repo_path: string;
|
|
last_login_at: string;
|
|
last_login_ip: string;
|
|
} |