From cb58648843160a672ba9427b0abfb2dd87c86206 Mon Sep 17 00:00:00 2001 From: crupest Date: Mon, 4 Mar 2019 19:45:49 +0800 Subject: Migrate todo page from Azure DevOps WorkItems to Github Issues. --- .../src/app/todo-list-page/todo-list.service.ts | 112 ++++++--------------- 1 file changed, 29 insertions(+), 83 deletions(-) (limited to 'Timeline/ClientApp/src/app/todo-list-page/todo-list.service.ts') diff --git a/Timeline/ClientApp/src/app/todo-list-page/todo-list.service.ts b/Timeline/ClientApp/src/app/todo-list-page/todo-list.service.ts index bfeb3285..ffcbbc6f 100644 --- a/Timeline/ClientApp/src/app/todo-list-page/todo-list.service.ts +++ b/Timeline/ClientApp/src/app/todo-list-page/todo-list.service.ts @@ -1,101 +1,47 @@ import { Injectable } from '@angular/core'; -import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { HttpClient } from '@angular/common/http'; import { Observable, from } from 'rxjs'; -import { switchMap, concatMap, map } from 'rxjs/operators'; +import { switchMap, map, filter } from 'rxjs/operators'; -export interface AzureDevOpsAccessInfo { - username: string; - personalAccessToken: string; - organization: string; - project: string; -} - -export interface WiqlWorkItemResult { - id: number; - url: string; -} - -export interface WiqlResult { - workItems: WiqlWorkItemResult[]; -} - -export interface WorkItemResult { - id: number; - fields: { [name: string]: any }; +export interface IssueResponseItem { + number: number; + title: string; + state: string; + html_url: string; + pull_request?: any; } -export interface WorkItemTypeResult { - icon: { - url: string; - }; -} +export type IssueResponse = IssueResponseItem[]; -export interface WorkItem { - id: number; +export interface TodoItem { + number: number; title: string; - isCompleted: boolean; + isClosed: boolean; detailUrl: string; - iconUrl: string; } @Injectable({ providedIn: 'root' }) export class TodoListService { - public static titleFieldName = 'System.Title'; - public static stateFieldName = 'System.State'; - public static typeFieldName = 'System.WorkItemType'; - - constructor(private client: HttpClient) {} - - private getAzureDevOpsAccessInfo(): Observable { - return this.client.get('/api/TodoPage/AzureDevOpsAccessInfo'); - } - - private getItemIconUrl(baseUrl: string, headers: HttpHeaders, type: string): Observable { - return this.client - .get(`${baseUrl}_apis/wit/workitemtypes/${encodeURIComponent(type)}?api-version=5.0`, { - headers: headers - }) - .pipe(map(result => result.icon.url)); - } - getWorkItemList(): Observable { - return this.getAzureDevOpsAccessInfo().pipe( - switchMap(accessInfo => { - const baseUrl = `https://dev.azure.com/${accessInfo.organization}/${accessInfo.project}/`; - const headers = new HttpHeaders({ - Accept: 'application/json', - Authorization: `Basic ${btoa(accessInfo.username + ':' + accessInfo.personalAccessToken)}` - }); - return this.client - .post( - `${baseUrl}_apis/wit/wiql?api-version=5.0`, - { - query: 'SELECT [System.Id] FROM workitems WHERE [System.TeamProject] = @project' - }, - { headers: headers } - ) - .pipe( - concatMap(result => from(result.workItems)), - concatMap(result => this.client.get(result.url, { headers: headers })), - concatMap(result => - this.getItemIconUrl(baseUrl, headers, result.fields[TodoListService.typeFieldName]).pipe( - map( - iconResult => - { - id: result.id, - title: result.fields[TodoListService.titleFieldName], - isCompleted: (function(stateErasedCase: string): Boolean { - return stateErasedCase === 'closed' || stateErasedCase === 'resolved'; - })((result.fields[TodoListService.stateFieldName] as string).toLowerCase()), - detailUrl: `${baseUrl}_workitems/edit/${result.id}/`, - iconUrl: iconResult - } - ) - ) - ) - ); + readonly baseUrl = 'https://api.github.com/repos/crupest/Timeline'; + + constructor(private client: HttpClient) { } + + getWorkItemList(): Observable { + return this.client.get(`${this.baseUrl}/issues`, { + params: { + state: 'all' + } + }).pipe( + switchMap(result => from(result)), + filter(result => result.pull_request === undefined), // filter out pull requests. + map(result => { + number: result.number, + title: result.title, + isClosed: result.state === 'closed', + detailUrl: result.html_url }) ); } -- cgit v1.2.3