| /** | |
| * @license | |
| * Copyright (C) 2017 The Android Open Source Project | |
| * | |
| * Licensed under the Apache License, Version 2.0 (the "License"); | |
| * you may not use this file except in compliance with the License. | |
| * You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, software | |
| * distributed under the License is distributed on an "AS IS" BASIS, | |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| * See the License for the specific language governing permissions and | |
| * limitations under the License. | |
| */ | |
| import { | |
| ErrorCallback, | |
| RestApiService, | |
| } from '../../../services/services/gr-rest-api/gr-rest-api'; | |
| import {HttpMethod} from '../../../constants/constants'; | |
| import {RequestPayload} from '../../../types/common'; | |
| let restApi: RestApiService | null = null; | |
| export function _testOnlyResetRestApi() { | |
| restApi = null; | |
| } | |
| function getRestApi(): RestApiService { | |
| if (!restApi) { | |
| restApi = (document.createElement( | |
| 'gr-rest-api-interface' | |
| ) as unknown) as RestApiService; | |
| } | |
| return restApi; | |
| } | |
| export class GrPluginRestApi { | |
| constructor(private readonly prefix = '') {} | |
| getLoggedIn() { | |
| return getRestApi().getLoggedIn(); | |
| } | |
| getVersion() { | |
| return getRestApi().getVersion(); | |
| } | |
| getConfig() { | |
| return getRestApi().getConfig(); | |
| } | |
| invalidateReposCache() { | |
| getRestApi().invalidateReposCache(); | |
| } | |
| getAccount() { | |
| return getRestApi().getAccount(); | |
| } | |
| getAccountCapabilities(capabilities: string[]) { | |
| return getRestApi().getAccountCapabilities(capabilities); | |
| } | |
| getRepos(filter: string, reposPerPage: number, offset?: number) { | |
| return getRestApi().getRepos(filter, reposPerPage, offset); | |
| } | |
| fetch( | |
| method: HttpMethod, | |
| url: string, | |
| payload?: RequestPayload, | |
| errFn?: undefined, | |
| contentType?: string | |
| ): Promise<Response>; | |
| fetch( | |
| method: HttpMethod, | |
| url: string, | |
| payload: RequestPayload | undefined, | |
| errFn: ErrorCallback, | |
| contentType?: string | |
| ): Promise<Response | void>; | |
| fetch( | |
| method: HttpMethod, | |
| url: string, | |
| payload: RequestPayload | undefined, | |
| errFn?: ErrorCallback, | |
| contentType?: string | |
| ): Promise<Response | void>; | |
| /** | |
| * Fetch and return native browser REST API Response. | |
| */ | |
| fetch( | |
| method: HttpMethod, | |
| url: string, | |
| payload?: RequestPayload, | |
| errFn?: ErrorCallback, | |
| contentType?: string | |
| ): Promise<Response | void> { | |
| return getRestApi().send( | |
| method, | |
| this.prefix + url, | |
| payload, | |
| errFn, | |
| contentType | |
| ); | |
| } | |
| /** | |
| * Fetch and parse REST API response, if request succeeds. | |
| */ | |
| send( | |
| method: HttpMethod, | |
| url: string, | |
| payload?: RequestPayload, | |
| errFn?: ErrorCallback, | |
| contentType?: string | |
| ) { | |
| return this.fetch(method, url, payload, errFn, contentType).then( | |
| response => { | |
| if (!response) { | |
| // TODO(TS): Fix method definition | |
| // If errFn exists and doesn't throw an exception, the fetch method | |
| // returns empty response | |
| throw new Error('errFn must throw an exception'); | |
| } | |
| if (response.status < 200 || response.status >= 300) { | |
| return response.text().then(text => { | |
| if (text) { | |
| return Promise.reject(new Error(text)); | |
| } else { | |
| return Promise.reject(new Error(`${response.status}`)); | |
| } | |
| }); | |
| } else { | |
| return getRestApi().getResponseObject(response); | |
| } | |
| } | |
| ); | |
| } | |
| get(url: string) { | |
| return this.send(HttpMethod.GET, url); | |
| } | |
| post( | |
| url: string, | |
| payload?: RequestPayload, | |
| errFn?: ErrorCallback, | |
| contentType?: string | |
| ) { | |
| return this.send(HttpMethod.POST, url, payload, errFn, contentType); | |
| } | |
| put( | |
| url: string, | |
| payload?: RequestPayload, | |
| errFn?: ErrorCallback, | |
| contentType?: string | |
| ) { | |
| return this.send(HttpMethod.PUT, url, payload, errFn, contentType); | |
| } | |
| delete(url: string) { | |
| return this.fetch(HttpMethod.DELETE, url).then(response => { | |
| if (response.status !== 204) { | |
| return response.text().then(text => { | |
| if (text) { | |
| return Promise.reject(new Error(text)); | |
| } else { | |
| return Promise.reject(new Error(`${response.status}`)); | |
| } | |
| }); | |
| } | |
| return response; | |
| }); | |
| } | |
| } |