149 lines
4.4 KiB
JavaScript
149 lines
4.4 KiB
JavaScript
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
|
|
/*
|
|
* Copyright 2018 Red Hat Inc. and/or its affiliates and other contributors
|
|
* as indicated by the @author tags. All rights reserved.
|
|
*
|
|
* 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 { ContentAlert } from "../content/ContentAlert.js";
|
|
export class AccountServiceError extends Error {
|
|
constructor(response) {
|
|
super(response.statusText);
|
|
this.response = response;
|
|
}
|
|
|
|
}
|
|
/**
|
|
*
|
|
* @author Stan Silvert ssilvert@redhat.com (C) 2018 Red Hat Inc.
|
|
*/
|
|
|
|
export class AccountServiceClient {
|
|
constructor(keycloakService) {
|
|
_defineProperty(this, "kcSvc", void 0);
|
|
|
|
_defineProperty(this, "accountUrl", void 0);
|
|
|
|
this.kcSvc = keycloakService;
|
|
this.accountUrl = this.kcSvc.authServerUrl() + 'realms/' + this.kcSvc.realm() + '/account';
|
|
}
|
|
|
|
async doGet(endpoint, config) {
|
|
return this.doRequest(endpoint, { ...config,
|
|
method: 'get'
|
|
});
|
|
}
|
|
|
|
async doDelete(endpoint, config) {
|
|
return this.doRequest(endpoint, { ...config,
|
|
method: 'delete'
|
|
});
|
|
}
|
|
|
|
async doPost(endpoint, body, config) {
|
|
return this.doRequest(endpoint, { ...config,
|
|
body: JSON.stringify(body),
|
|
method: 'post'
|
|
});
|
|
}
|
|
|
|
async doPut(endpoint, body, config) {
|
|
return this.doRequest(endpoint, { ...config,
|
|
body: JSON.stringify(body),
|
|
method: 'put'
|
|
});
|
|
}
|
|
|
|
async doRequest(endpoint, config) {
|
|
const response = await fetch(this.makeUrl(endpoint, config).toString(), await this.makeConfig(config));
|
|
|
|
try {
|
|
response.data = await response.json();
|
|
} catch (e) {} // ignore. Might be empty
|
|
|
|
|
|
if (!response.ok) {
|
|
this.handleError(response);
|
|
throw new AccountServiceError(response);
|
|
}
|
|
|
|
return response;
|
|
}
|
|
|
|
handleError(response) {
|
|
if (response !== null && response.status === 401) {
|
|
if (this.kcSvc.authenticated() && !this.kcSvc.audiencePresent()) {
|
|
// authenticated and the audience is not present => not allowed
|
|
window.location.href = baseUrl + '#/forbidden';
|
|
} else {
|
|
// session timed out?
|
|
this.kcSvc.login();
|
|
}
|
|
}
|
|
|
|
if (response !== null && response.status === 403) {
|
|
window.location.href = baseUrl + '#/forbidden';
|
|
}
|
|
|
|
if (response !== null && response.data != null) {
|
|
if (response.data['errors'] != null) {
|
|
for (let err of response.data['errors']) ContentAlert.danger(err['errorMessage'], err['params']);
|
|
} else {
|
|
ContentAlert.danger(`${response.statusText}: ${response.data['errorMessage'] ? response.data['errorMessage'] : ''} ${response.data['error'] ? response.data['error'] : ''}`);
|
|
}
|
|
|
|
;
|
|
} else {
|
|
ContentAlert.danger(response.statusText);
|
|
}
|
|
}
|
|
|
|
makeUrl(endpoint, config) {
|
|
if (endpoint.startsWith('http')) return new URL(endpoint);
|
|
const url = new URL(this.accountUrl + endpoint); // add request params
|
|
|
|
if (config && config.hasOwnProperty('params')) {
|
|
const params = config.params || {};
|
|
Object.keys(params).forEach(key => url.searchParams.append(key, params[key]));
|
|
}
|
|
|
|
return url;
|
|
}
|
|
|
|
makeConfig(config = {}) {
|
|
return new Promise(resolve => {
|
|
this.kcSvc.getToken().then(token => {
|
|
resolve({ ...config,
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
...config.headers,
|
|
Authorization: 'Bearer ' + token
|
|
}
|
|
});
|
|
}).catch(() => {
|
|
this.kcSvc.login();
|
|
});
|
|
});
|
|
}
|
|
|
|
}
|
|
window.addEventListener("unhandledrejection", event => {
|
|
event.promise.catch(error => {
|
|
if (error instanceof AccountServiceError) {
|
|
// We already handled the error. Ignore unhandled rejection.
|
|
event.preventDefault();
|
|
}
|
|
});
|
|
});
|
|
//# sourceMappingURL=account.service.js.map
|