blob: 00b29634663eb72c3e6aaa0c2a563c4f6f4f5ebb [file] [log] [blame]
/**
* @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;
});
}
}