Merge branch '21535-multi-wf-delete'
[arvados.git] / services / workbench2 / src / services / services.ts
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 import Axios from "axios";
6 import { AxiosInstance } from "axios";
7 import { ApiClientAuthorizationService } from 'services/api-client-authorization-service/api-client-authorization-service';
8 import { AuthService } from "./auth-service/auth-service";
9 import { GroupsService } from "./groups-service/groups-service";
10 import { ProjectService } from "./project-service/project-service";
11 import { LinkService } from "./link-service/link-service";
12 import { FavoriteService } from "./favorite-service/favorite-service";
13 import { CollectionService } from "./collection-service/collection-service";
14 import { TagService } from "./tag-service/tag-service";
15 import { KeepService } from "./keep-service/keep-service";
16 import { WebDAV } from "common/webdav";
17 import { Config } from "common/config";
18 import { UserService } from './user-service/user-service';
19 import { AncestorService } from "services/ancestors-service/ancestors-service";
20 import { ResourceKind } from "models/resource";
21 import { ContainerRequestService } from './container-request-service/container-request-service';
22 import { ContainerService } from './container-service/container-service';
23 import { LogService } from './log-service/log-service';
24 import { ApiActions } from "services/api/api-actions";
25 import { WorkflowService } from "services/workflow-service/workflow-service";
26 import { SearchService } from 'services/search-service/search-service';
27 import { PermissionService } from "services/permission-service/permission-service";
28 import { VirtualMachinesService } from "services/virtual-machines-service/virtual-machines-service";
29 import { RepositoriesService } from 'services/repositories-service/repositories-service';
30 import { AuthorizedKeysService } from 'services/authorized-keys-service/authorized-keys-service';
31 import { VocabularyService } from 'services/vocabulary-service/vocabulary-service';
32 import { FileViewersConfigService } from 'services/file-viewers-config-service/file-viewers-config-service';
33 import { LinkAccountService } from "./link-account-service/link-account-service";
34 import parse from "parse-duration";
35
36 export type ServiceRepository = ReturnType<typeof createServices>;
37
38 export function setAuthorizationHeader(services: ServiceRepository, token: string) {
39     services.apiClient.defaults.headers.common = {
40         Authorization: `Bearer ${token}`
41     };
42     services.keepWebdavClient.setAuthorization(`Bearer ${token}`);
43     services.apiWebdavClient.setAuthorization(`Bearer ${token}`);
44 }
45
46 export function removeAuthorizationHeader(services: ServiceRepository) {
47     services.apiClient.defaults.headers.common = {};
48
49     services.keepWebdavClient.setAuthorization(undefined);
50     services.apiWebdavClient.setAuthorization(undefined);
51 }
52
53 export const createServices = (config: Config, actions: ApiActions, useApiClient?: AxiosInstance) => {
54     // Need to give empty 'headers' object or it will create an
55     // instance with a reference to the global default headers object,
56     // which is very bad because that means setAuthorizationHeader
57     // would update the global default instead of the instance default.
58     const apiClient = useApiClient || Axios.create({ headers: {} });
59     apiClient.defaults.baseURL = config.baseUrl;
60
61     const keepWebdavClient = new WebDAV({
62         baseURL: config.keepWebServiceUrl
63     });
64
65     const apiWebdavClient = new WebDAV({
66         baseURL: config.baseUrl
67     });
68
69     const apiClientAuthorizationService = new ApiClientAuthorizationService(apiClient, actions);
70     const authorizedKeysService = new AuthorizedKeysService(apiClient, actions);
71     const containerRequestService = new ContainerRequestService(apiClient, actions);
72     const containerService = new ContainerService(apiClient, actions);
73     const groupsService = new GroupsService(apiClient, actions);
74     const keepService = new KeepService(apiClient, actions);
75     const linkService = new LinkService(apiClient, actions);
76     const logService = new LogService(apiClient, apiWebdavClient, actions);
77     const permissionService = new PermissionService(apiClient, actions);
78     const projectService = new ProjectService(apiClient, actions);
79     const repositoriesService = new RepositoriesService(apiClient, actions);
80     const userService = new UserService(apiClient, actions);
81     const virtualMachineService = new VirtualMachinesService(apiClient, actions);
82     const workflowService = new WorkflowService(apiClient, actions);
83     const linkAccountService = new LinkAccountService(apiClient, actions);
84
85     const idleTimeout = (config && config.clusterConfig && config.clusterConfig.Workbench.IdleTimeout) || '0s';
86     const authService = new AuthService(apiClient, config.rootUrl, actions,
87         (parse(idleTimeout, 's') || 0) > 0);
88
89     const collectionService = new CollectionService(apiClient, keepWebdavClient, authService, actions);
90     const ancestorsService = new AncestorService(groupsService, userService, collectionService);
91     const favoriteService = new FavoriteService(linkService, groupsService);
92     const tagService = new TagService(linkService);
93     const searchService = new SearchService();
94     const vocabularyService = new VocabularyService(config.vocabularyUrl);
95     const fileViewersConfig = new FileViewersConfigService(config.fileViewersConfigUrl);
96
97     return {
98         ancestorsService,
99         apiClient,
100         apiClientAuthorizationService,
101         authService,
102         authorizedKeysService,
103         collectionService,
104         containerRequestService,
105         containerService,
106         favoriteService,
107         fileViewersConfig,
108         groupsService,
109         keepService,
110         linkService,
111         logService,
112         permissionService,
113         projectService,
114         repositoriesService,
115         searchService,
116         tagService,
117         userService,
118         virtualMachineService,
119         keepWebdavClient,
120         apiWebdavClient,
121         workflowService,
122         vocabularyService,
123         linkAccountService
124     };
125 };
126
127 export const getResourceService = (kind?: ResourceKind) => (serviceRepository: ServiceRepository) => {
128     switch (kind) {
129         case ResourceKind.USER:
130             return serviceRepository.userService;
131         case ResourceKind.GROUP:
132             return serviceRepository.groupsService;
133         case ResourceKind.COLLECTION:
134             return serviceRepository.collectionService;
135         case ResourceKind.LINK:
136             return serviceRepository.linkService;
137         default:
138             return undefined;
139     }
140 };