Files
cnb/src/user/index.ts

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