packages/article-feedback/widgets/api.ts (129 lines of code) (raw):

export interface User { isGuest: boolean; liked?: boolean; leftMessage: boolean; } export interface Project { projectKey: string; } export interface Stat { likes: number; guestLikes: number; dislikes: number; messages: Array<{ userId: string; message: string; timestamp: number; }>; guestMessages: Array<{ name: string; email?: string; message: string; timestamp: number; }>; } export interface YTUser { id: string; ringId: string; fullName: string; } export interface YTPermission { global: boolean; permission: {key: string}; projects: {shortName: string}[] | null; } export interface YTConfig { contextPath: string; } export interface YTUserProfile { profiles: { general: { dateFieldFormat: { pattern: string; } } }; } const READ_USER_PERMISSION = 'jetbrains.jetpass.user-read'; export default class API { project?: Project; permissions?: YTPermission[]; constructor(private host: YTPluginHost) { } async loadProject() { this.project = await this.getProject(); } async loadPermissions() { this.permissions = await this.getYtPermissions(); } hasPermission(permission: string) { if (!this.project) { throw new Error('Project isn\'t loaded'); } if (!this.permissions) { throw new Error('Permissions aren\'t loaded'); } const project = this.project; return this.permissions.some(it => it.permission.key === permission && ( it.global || it.projects?.some(pr => pr.shortName === project.projectKey) ) ); } canReadUser() { return this.hasPermission(READ_USER_PERMISSION); } getDebug() { return this.host.fetchApp('backend/debug', {scope: true}); } getUser() { return this.host.fetchApp('backend/user', {scope: true}) as Promise<User>; } getProject() { return this.host.fetchApp('backend/project', {scope: true}) as Promise<Project>; } getStat() { return this.host.fetchApp('backend/stat', {scope: true}) as Promise<Stat>; } postLike() { return this.host.fetchApp('backend/like', {scope: true, method: 'post'}) as Promise<void>; } postGuestLike() { return this.host.fetchApp('backend/guest-like', {scope: true, method: 'post'}) as Promise<void>; } postDislike(message: string) { return this.host.fetchApp('backend/dislike', { scope: true, method: 'post', query: {message} }) as Promise<void>; } postGuestDislike( message: string, userName: string, userEmail: string ) { return this.host.fetchApp('backend/guest-dislike', { scope: true, method: 'post', query: {message, userName, userEmail} }) as Promise<void>; } getYtUsers(ids: string[]) { return Promise.all( ids.map( id => this.host.fetchYouTrack(`users/${id}?fields=id,ringId,fullName`) as Promise<YTUser> ) ); } getYtConfig() { return this.host.fetchYouTrack('config?fields=contextPath') as Promise<YTConfig>; } getYtUserProfile() { return this.host.fetchYouTrack('users/me?fields=profiles(general(dateFieldFormat(pattern)))') as Promise<YTUserProfile>; } getYtPermissions() { return this.host.fetchYouTrack('permissions/cache?fields=global,permission(key),projects(shortName)') as Promise<YTPermission[]>; } }