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> { const url = `${this.hackURL}/user`; return this.get({ url, useCookie: true, }); } /** * 判断当前 Cookie 是否有效 * @returns */ async checkCookieValid(): Promise { 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> { const url = '/user'; return this.get({ url }); } createAccessToken(data?: { description?: string, scope?: string }): Promise { 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 { 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 { 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; }