# SPDX-License-Identifier: AGPL-3.0
REACT_APP_ARVADOS_CONFIG_URL=/config.json
-REACT_APP_ARVADOS_API_HOST=https://qr1hi.arvadosapi.com
\ No newline at end of file
+REACT_APP_ARVADOS_API_HOST=qr1hi.arvadosapi.com
+HTTPS=true
\ No newline at end of file
export const API_HOST = process.env.REACT_APP_ARVADOS_API_HOST;
-export const serverApi: AxiosInstance = Axios.create({
- baseURL: API_HOST + '/arvados/v1'
-});
+export const authClient: AxiosInstance = Axios.create();
+export const apiClient: AxiosInstance = Axios.create();
export function setServerApiAuthorizationHeader(token: string) {
- serverApi.defaults.headers.common = {
- 'Authorization': `OAuth2 ${token}`
- };}
+ [authClient, apiClient].forEach(client => {
+ client.defaults.headers.common = {
+ Authorization: `OAuth2 ${token}`
+ };
+ });
+}
export function removeServerApiAuthorizationHeader() {
- delete serverApi.defaults.headers.common.Authorization;
+ [authClient, apiClient].forEach(client => {
+ delete client.defaults.headers.common.Authorization;
+ });
}
export const setBaseUrl = (url: string) => {
- serverApi.defaults.baseURL = url + "/arvados/v1";
+ authClient.defaults.baseURL = url;
+ apiClient.defaults.baseURL = url + "/arvados/v1";
};
API_HOST: string;
}
-const defaultConfig: Config = {
- API_HOST: process.env.REACT_APP_ARVADOS_API_HOST || ""
-};
-
export const fetchConfig = () => {
return Axios
.get<Config>(CONFIG_URL + "?nocache=" + (new Date()).getTime())
.then(response => response.data)
- .catch(() => Promise.resolve(defaultConfig));
+ .catch(() => Promise.resolve(getDefaultConfig()))
+ .then(mapConfig);
};
+const mapConfig = (config: Config): Config => ({
+ ...config,
+ API_HOST: addProtocol(config.API_HOST)
+});
+
+const getDefaultConfig = (): Config => ({
+ API_HOST: process.env.REACT_APP_ARVADOS_API_HOST || ""
+});
+
+const addProtocol = (url: string) => `${window.location.protocol}//${url}`;
export class AuthService {
- constructor(protected serverApi: AxiosInstance) { }
+ constructor(
+ protected authClient: AxiosInstance,
+ protected apiClient: AxiosInstance) { }
public saveApiToken(token: string) {
localStorage.setItem(API_TOKEN_KEY, token);
public login() {
const currentUrl = `${window.location.protocol}//${window.location.host}/token`;
- window.location.assign(`${API_HOST}/login?return_to=${currentUrl}`);
+ window.location.assign(`${this.authClient.defaults.baseURL || ""}/login?return_to=${currentUrl}`);
}
public logout() {
const currentUrl = `${window.location.protocol}//${window.location.host}`;
- window.location.assign(`${API_HOST}/logout?return_to=${currentUrl}`);
+ window.location.assign(`${this.authClient.defaults.baseURL || ""}/logout?return_to=${currentUrl}`);
}
public getUserDetails = (): Promise<User> => {
- return this.serverApi
+ return this.apiClient
.get<UserDetailsResponse>('/users/current')
.then(resp => ({
email: resp.data.email,
import { AuthService } from "./auth-service/auth-service";
import { GroupsService } from "./groups-service/groups-service";
-import { serverApi } from "../common/api/server-api";
+import { authClient, apiClient } from "../common/api/server-api";
import { ProjectService } from "./project-service/project-service";
import { LinkService } from "./link-service/link-service";
import { FavoriteService } from "./favorite-service/favorite-service";
-export const authService = new AuthService(serverApi);
-export const groupsService = new GroupsService(serverApi);
-export const projectService = new ProjectService(serverApi);
-export const linkService = new LinkService(serverApi);
+export const authService = new AuthService(authClient, apiClient);
+export const groupsService = new GroupsService(apiClient);
+export const projectService = new ProjectService(apiClient);
+export const linkService = new LinkService(apiClient);
export const favoriteService = new FavoriteService(linkService, groupsService);
USER_OWNER_UUID_KEY,
USER_UUID_KEY
} from "../../services/auth-service/auth-service";
-import { API_HOST } from "../../common/api/server-api";
import 'jest-localstorage-mock';
window.location.assign = jest.fn();
authReducer(initialState, authActions.LOGIN());
expect(window.location.assign).toBeCalledWith(
- `${API_HOST}/login?return_to=${window.location.protocol}//${window.location.host}/token`
+ `/login?return_to=${window.location.protocol}//${window.location.host}/token`
);
});
window.location.assign = jest.fn();
authReducer(initialState, authActions.LOGOUT());
expect(window.location.assign).toBeCalledWith(
- `${API_HOST}/logout?return_to=${location.protocol}//${location.host}`
+ `/logout?return_to=${location.protocol}//${location.host}`
);
});
});
import { unionize, ofType, UnionOf } from "unionize";
import { CommonResourceService } from "../../common/api/common-resource-service";
import { Dispatch } from "redux";
-import { serverApi } from "../../common/api/server-api";
+import { apiClient } from "../../common/api/server-api";
import { Resource, ResourceKind } from "../../models/resource";
export const detailsPanelActions = unionize({
const getService = (kind: ResourceKind) => {
switch (kind) {
case ResourceKind.Project:
- return new CommonResourceService(serverApi, "groups");
+ return new CommonResourceService(apiClient, "groups");
case ResourceKind.Collection:
- return new CommonResourceService(serverApi, "collections");
+ return new CommonResourceService(apiClient, "collections");
default:
- return new CommonResourceService(serverApi, "");
+ return new CommonResourceService(apiClient, "");
}
};