//
// SPDX-License-Identifier: AGPL-3.0
-import Axios from "../../node_modules/axios";
+import Axios from "axios";
export const CONFIG_URL = process.env.REACT_APP_ARVADOS_CONFIG_URL || "/config.json";
export interface Config {
- API_HOST: string;
+ apiHost: string;
+ keepWebHost: string;
}
export const fetchConfig = () => {
const mapConfig = (config: Config): Config => ({
...config,
- API_HOST: addProtocol(config.API_HOST)
+ apiHost: addProtocol(config.apiHost),
+ keepWebHost: addProtocol(config.keepWebHost)
});
const getDefaultConfig = (): Config => ({
- API_HOST: process.env.REACT_APP_ARVADOS_API_HOST || ""
+ apiHost: process.env.REACT_APP_ARVADOS_API_HOST || "",
+ keepWebHost: process.env.REACT_APP_ARVADOS_KEEP_WEB_HOST || ""
});
const addProtocol = (url: string) => `${window.location.protocol}//${url}`;
import { collectionFilesActionSet } from './views-components/context-menu/action-sets/collection-files-action-set';
import { collectionFilesItemActionSet } from './views-components/context-menu/action-sets/collection-files-item-action-set';
import { collectionActionSet } from './views-components/context-menu/action-sets/collection-action-set';
+import { collectionResourceActionSet } from './views-components/context-menu/action-sets/collection-resource-action-set';
addMenuActionSet(ContextMenuKind.ROOT_PROJECT, rootProjectActionSet);
addMenuActionSet(ContextMenuKind.PROJECT, projectActionSet);
addMenuActionSet(ContextMenuKind.COLLECTION_FILES, collectionFilesActionSet);
addMenuActionSet(ContextMenuKind.COLLECTION_FILES_ITEM, collectionFilesItemActionSet);
addMenuActionSet(ContextMenuKind.COLLECTION, collectionActionSet);
+addMenuActionSet(ContextMenuKind.COLLECTION_RESOURCE, collectionResourceActionSet);
fetchConfig()
.then(config => {
const history = createBrowserHistory();
- const services = createServices(config.API_HOST);
+ const services = createServices(config);
const store = configureStore(history, services);
store.dispatch(initAuth());
store.dispatch(getProjectList(services.authService.getUuid()));
-
+
const TokenComponent = (props: any) => <ApiToken authService={services.authService} {...props}/>;
const WorkbenchComponent = (props: any) => <Workbench authService={services.authService} {...props}/>;
//
// SPDX-License-Identifier: AGPL-3.0
+import Axios, { AxiosInstance } from "axios";
import { AuthService } from "./auth-service/auth-service";
import { GroupsService } from "./groups-service/groups-service";
import { ProjectService } from "./project-service/project-service";
import { FavoriteService } from "./favorite-service/favorite-service";
import { CollectionService } from "./collection-service/collection-service";
import { TagService } from "./tag-service/tag-service";
-import Axios from "axios";
import { CollectionFilesService } from "./collection-files-service/collection-files-service";
import { KeepService } from "./keep-service/keep-service";
+ import { WebDAV } from "../common/webdav";
+ import { Config } from "../common/config";
- export interface ServiceRepository {
- apiClient: AxiosInstance;
+ export type ServiceRepository = ReturnType<typeof createServices>;
- authService: AuthService;
- keepService: KeepService;
- groupsService: GroupsService;
- projectService: ProjectService;
- linkService: LinkService;
- favoriteService: FavoriteService;
- tagService: TagService;
- collectionService: CollectionService;
- collectionFilesService: CollectionFilesService;
- }
-
- export const createServices = (baseUrl: string): ServiceRepository => {
+ export const createServices = (config: Config) => {
const apiClient = Axios.create();
- apiClient.defaults.baseURL = `${baseUrl}/arvados/v1`;
+ apiClient.defaults.baseURL = `${config.apiHost}/arvados/v1`;
+
+ const webdavClient = new WebDAV();
+ webdavClient.defaults.baseURL = config.keepWebHost;
- const authService = new AuthService(apiClient, baseUrl);
+ const authService = new AuthService(apiClient, config.apiHost);
const keepService = new KeepService(apiClient);
const groupsService = new GroupsService(apiClient);
const projectService = new ProjectService(apiClient);
return {
apiClient,
+ webdavClient,
authService,
keepService,
groupsService,
collectionFilesService
};
};
+
import { ofType, default as unionize, UnionOf } from "unionize";
import { Dispatch } from "redux";
-import { User } from "../../models/user";
+import { User } from "~/models/user";
import { RootState } from "../store";
-import { ServiceRepository } from "../../services/services";
+import { ServiceRepository } from "~/services/services";
import { AxiosInstance } from "axios";
export const authActions = unionize({
USER_DETAILS_REQUEST: {},
USER_DETAILS_SUCCESS: ofType<User>()
}, {
- tag: 'type',
- value: 'payload'
- });
+ tag: 'type',
+ value: 'payload'
+ });
- function setAuthorizationHeader(client: AxiosInstance, token: string) {
- client.defaults.headers.common = {
+ function setAuthorizationHeader(services: ServiceRepository, token: string) {
+ services.apiClient.defaults.headers.common = {
+ Authorization: `OAuth2 ${token}`
+ };
+ services.webdavClient.defaults.headers = {
Authorization: `OAuth2 ${token}`
};
}
const user = services.authService.getUser();
const token = services.authService.getApiToken();
if (token) {
- setAuthorizationHeader(services.apiClient, token);
+ setAuthorizationHeader(services, token);
}
if (token && user) {
dispatch(authActions.INIT({ user, token }));
export const saveApiToken = (token: string) => (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {
services.authService.saveApiToken(token);
- setAuthorizationHeader(services.apiClient, token);
+ setAuthorizationHeader(services, token);
dispatch(authActions.SAVE_API_TOKEN(token));
};
USER_LAST_NAME_KEY,
USER_OWNER_UUID_KEY,
USER_UUID_KEY
-} from "../../services/auth-service/auth-service";
+} from "~/services/auth-service/auth-service";
import 'jest-localstorage-mock';
-import { createServices } from "../../services/services";
+import { createServices } from "~/services/services";
import { configureStore, RootStore } from "../store";
import createBrowserHistory from "history/createBrowserHistory";
let store: RootStore;
beforeEach(() => {
- store = configureStore(createBrowserHistory(), createServices("/arvados/v1"));
+ store = configureStore(createBrowserHistory(), createServices({ apiHost: "/arvados/v1", keepWebHost: "" }));
localStorage.clear();
- reducer = authReducer(createServices("/arvados/v1"));
+ reducer = authReducer(createServices({ apiHost: "/arvados/v1", keepWebHost: "" }));
});
it('should initialise state with user and api token from local storage', () => {
import { AuthAction, authActions } from "./auth-action";
import 'jest-localstorage-mock';
-import { createServices } from "../../services/services";
+import { createServices } from "~/services/services";
describe('auth-reducer', () => {
let reducer: (state: AuthState | undefined, action: AuthAction) => any;
beforeAll(() => {
localStorage.clear();
- reducer = authReducer(createServices("/arvados/v1"));
+ reducer = authReducer(createServices({ apiHost: "/arvados/v1", keepWebHost: "" }));
});
it('should correctly initialise state', () => {
uuid: "uuid",
ownerUuid: "ownerUuid"
};
- const state = reducer(initialState, authActions.INIT({user, token: "token"}));
+ const state = reducer(initialState, authActions.INIT({ user, token: "token" }));
expect(state).toEqual({
apiToken: "token",
user