refs #13989 Merge branch 'origin/13989-webdav-service'
authorDaniel Kos <daniel.kos@contractors.roche.com>
Mon, 13 Aug 2018 18:10:58 +0000 (20:10 +0200)
committerDaniel Kos <daniel.kos@contractors.roche.com>
Mon, 13 Aug 2018 18:11:22 +0000 (20:11 +0200)
Arvados-DCO-1.1-Signed-off-by: Daniel Kos <daniel.kos@contractors.roche.com>

1  2 
src/common/config.ts
src/index.tsx
src/services/services.ts
src/store/auth/auth-action.ts
src/store/auth/auth-actions.test.ts
src/store/auth/auth-reducer.test.ts

diff --combined src/common/config.ts
index 250c806c69641cbf9a63cde243075bd234a88177,b898d2b16ab67a5e17f96762561b0237a46efc28..492328d986e55e3d6d2101d96f1d82f095a5690d
@@@ -2,12 -2,13 +2,13 @@@
  //
  // 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}`;
diff --combined src/index.tsx
index dd2722335d091f032bcd116979df33df61a37953,14a52e8e1eca4ea3d63491fcbadb61138ee3dbf2..cfdbb46cf55882743fd714e7520a9c64884a8d22
@@@ -26,7 -26,6 +26,7 @@@ import { favoriteActionSet } from "./vi
  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);
@@@ -35,17 -34,16 +35,17 @@@ addMenuActionSet(ContextMenuKind.FAVORI
  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}/>;
  
diff --combined src/services/services.ts
index 427148b41663753fdff62b0a1dd90a54b77b6934,45d360c19a470f77a0fd5073a90e1df94d06cca7..99f802dfe079521074c2fa143297e0d1bca0cb2d
@@@ -2,7 -2,6 +2,7 @@@
  //
  // 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";
@@@ -10,28 -9,22 +10,21 @@@ import { LinkService } from "./link-ser
  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);
@@@ -43,6 -36,7 +36,7 @@@
  
      return {
          apiClient,
+         webdavClient,
          authService,
          keepService,
          groupsService,
@@@ -54,3 -48,4 +48,4 @@@
          collectionFilesService
      };
  };
index 9f429f0537034a2fc34c7a582b52e62378aafccf,8bf4c3f7a684b6bb3b82b3e3fa1954a68f11ae92..33a5df90450e2cde772c73c8d80c7b06854c4f12
@@@ -4,9 -4,9 +4,9 @@@
  
  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}`
      };
  }
@@@ -35,7 -38,7 +38,7 @@@ export const initAuth = () => (dispatch
      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 }));
@@@ -44,7 -47,7 +47,7 @@@
  
  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));
  };
  
index dd928e0a27a152c75b7a245c6cebcbdcba3cb3d6,18bb3ff3a746b908bdb7835b05ed38026806d4ef..217a27cc49cfccd5d465a25480670ac327029e3e
@@@ -11,10 -11,10 +11,10 @@@ import 
      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";
  
@@@ -23,9 -23,9 +23,9 @@@ describe('auth-actions', () => 
      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', () => {
index bc9d34ee0ae5dde439e3332837867037669a96ba,aaedd40d0b847455d0852efbce0a031cfd14067d..8eeb7c3c636152c9087b868cd01ca71b1678c9df
@@@ -6,14 -6,14 +6,14 @@@ import { authReducer, AuthState } from 
  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', () => {
@@@ -25,7 -25,7 +25,7 @@@
              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