diff options
author | 杨宇千 <crupest@outlook.com> | 2019-03-04 19:57:56 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-03-04 19:57:56 +0800 |
commit | 8033d6523885486c24af2bdd57a24b0fd62d0b00 (patch) | |
tree | 942326b2d9a0c71a5c141b633e90b5f77d2887cd /Timeline/ClientApp/src/app/todo-list-page/todo-list.service.ts | |
parent | e64ace0173d5bb737bf7320c8779fbcce0251aae (diff) | |
parent | 0ae0459be4f9eade994acbca65a60070672854fb (diff) | |
download | timeline-8033d6523885486c24af2bdd57a24b0fd62d0b00.tar.gz timeline-8033d6523885486c24af2bdd57a24b0fd62d0b00.tar.bz2 timeline-8033d6523885486c24af2bdd57a24b0fd62d0b00.zip |
Merge pull request #2 from crupest/migrate-todo
Migrate todo page from Azure DevOps WorkItems to Github Issues.
Diffstat (limited to 'Timeline/ClientApp/src/app/todo-list-page/todo-list.service.ts')
-rw-r--r-- | Timeline/ClientApp/src/app/todo-list-page/todo-list.service.ts | 112 |
1 files changed, 29 insertions, 83 deletions
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<AzureDevOpsAccessInfo> { - return this.client.get<AzureDevOpsAccessInfo>('/api/TodoPage/AzureDevOpsAccessInfo'); - } - - private getItemIconUrl(baseUrl: string, headers: HttpHeaders, type: string): Observable<string> { - return this.client - .get<WorkItemTypeResult>(`${baseUrl}_apis/wit/workitemtypes/${encodeURIComponent(type)}?api-version=5.0`, { - headers: headers - }) - .pipe(map(result => result.icon.url)); - } - getWorkItemList(): Observable<WorkItem> { - 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<WiqlResult>( - `${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<WorkItemResult>(result.url, { headers: headers })), - concatMap(result => - this.getItemIconUrl(baseUrl, headers, result.fields[TodoListService.typeFieldName]).pipe( - map( - iconResult => - <WorkItem>{ - id: result.id, - title: <string>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<TodoItem> { + return this.client.get<IssueResponse>(`${this.baseUrl}/issues`, { + params: { + state: 'all' + } + }).pipe( + switchMap(result => from(result)), + filter(result => result.pull_request === undefined), // filter out pull requests. + map(result => <TodoItem>{ + number: result.number, + title: result.title, + isClosed: result.state === 'closed', + detailUrl: result.html_url }) ); } |