15736: When validating sessions, save the config
[arvados-workbench2.git] / src / routes / routes.ts
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 import { matchPath } from 'react-router';
6 import { ResourceKind, RESOURCE_UUID_PATTERN, extractUuidKind, COLLECTION_PDH_REGEX } from '~/models/resource';
7 import { getProjectUrl } from '~/models/project';
8 import { getCollectionUrl } from '~/models/collection';
9 import { Config } from '~/common/config';
10 import { Session } from "~/models/session";
11
12 export interface FederationConfig {
13     localCluster: string;
14     remoteHostsConfig: { [key: string]: Config };
15     sessions: Session[];
16 }
17
18 export const Routes = {
19     ROOT: '/',
20     TOKEN: '/token',
21     FED_LOGIN: '/fedtoken',
22     ADD_SESSION: '/add-session',
23     PROJECTS: `/projects/:id(${RESOURCE_UUID_PATTERN})`,
24     COLLECTIONS: `/collections/:id(${RESOURCE_UUID_PATTERN})`,
25     PROCESSES: `/processes/:id(${RESOURCE_UUID_PATTERN})`,
26     FAVORITES: '/favorites',
27     TRASH: '/trash',
28     PROCESS_LOGS: `/process-logs/:id(${RESOURCE_UUID_PATTERN})`,
29     REPOSITORIES: '/repositories',
30     SHARED_WITH_ME: '/shared-with-me',
31     RUN_PROCESS: '/run-process',
32     VIRTUAL_MACHINES_ADMIN: '/virtual-machines-admin',
33     VIRTUAL_MACHINES_USER: '/virtual-machines-user',
34     WORKFLOWS: '/workflows',
35     SEARCH_RESULTS: '/search-results',
36     SSH_KEYS_ADMIN: `/ssh-keys-admin`,
37     SSH_KEYS_USER: `/ssh-keys-user`,
38     SITE_MANAGER: `/site-manager`,
39     MY_ACCOUNT: '/my-account',
40     LINK_ACCOUNT: '/link_account',
41     KEEP_SERVICES: `/keep-services`,
42     COMPUTE_NODES: `/nodes`,
43     USERS: '/users',
44     API_CLIENT_AUTHORIZATIONS: `/api_client_authorizations`,
45     GROUPS: '/groups',
46     GROUP_DETAILS: `/group/:id(${RESOURCE_UUID_PATTERN})`,
47     LINKS: '/links',
48     PUBLIC_FAVORITES: '/public-favorites',
49     COLLECTIONS_CONTENT_ADDRESS: '/collections/:id',
50 };
51
52 export const getResourceUrl = (uuid: string) => {
53     const kind = extractUuidKind(uuid);
54     switch (kind) {
55         case ResourceKind.PROJECT:
56             return getProjectUrl(uuid);
57         case ResourceKind.USER:
58             return getProjectUrl(uuid);
59         case ResourceKind.COLLECTION:
60             return getCollectionUrl(uuid);
61         case ResourceKind.PROCESS:
62             return getProcessUrl(uuid);
63         default:
64             return undefined;
65     }
66 };
67
68 export const getNavUrl = (uuid: string, config: FederationConfig) => {
69     const path = getResourceUrl(uuid) || "";
70     const cls = uuid.substr(0, 5);
71     if (cls === config.localCluster || extractUuidKind(uuid) === ResourceKind.USER || COLLECTION_PDH_REGEX.exec(uuid)) {
72         return path;
73     } else if (config.remoteHostsConfig[cls]) {
74         let u: URL;
75         if (config.remoteHostsConfig[cls].workbench2Url) {
76             /* NOTE: wb2 presently doesn't support passing api_token
77                to arbitrary page to set credentials, only through
78                api-token route.  So for navigation to work, user needs
79                to already be logged in.  In the future we want to just
80                request the records and display in the current
81                workbench instance making this redirect unnecessary. */
82             u = new URL(config.remoteHostsConfig[cls].workbench2Url);
83         } else {
84             u = new URL(config.remoteHostsConfig[cls].workbenchUrl);
85             u.search = "api_token=" + config.sessions.filter((s) => s.clusterId === cls)[0].token;
86         }
87         u.pathname = path;
88         return u.toString();
89     } else {
90         return "";
91     }
92 };
93
94
95 export const getProcessUrl = (uuid: string) => `/processes/${uuid}`;
96
97 export const getProcessLogUrl = (uuid: string) => `/process-logs/${uuid}`;
98
99 export const getGroupUrl = (uuid: string) => `/group/${uuid}`;
100
101 export interface ResourceRouteParams {
102     id: string;
103 }
104
105 export const matchRootRoute = (route: string) =>
106     matchPath(route, { path: Routes.ROOT, exact: true });
107
108 export const matchFavoritesRoute = (route: string) =>
109     matchPath(route, { path: Routes.FAVORITES });
110
111 export const matchTrashRoute = (route: string) =>
112     matchPath(route, { path: Routes.TRASH });
113
114 export const matchProjectRoute = (route: string) =>
115     matchPath<ResourceRouteParams>(route, { path: Routes.PROJECTS });
116
117 export const matchCollectionRoute = (route: string) =>
118     matchPath<ResourceRouteParams>(route, { path: Routes.COLLECTIONS });
119
120 export const matchProcessRoute = (route: string) =>
121     matchPath<ResourceRouteParams>(route, { path: Routes.PROCESSES });
122
123 export const matchProcessLogRoute = (route: string) =>
124     matchPath<ResourceRouteParams>(route, { path: Routes.PROCESS_LOGS });
125
126 export const matchSharedWithMeRoute = (route: string) =>
127     matchPath(route, { path: Routes.SHARED_WITH_ME });
128
129 export const matchRunProcessRoute = (route: string) =>
130     matchPath(route, { path: Routes.RUN_PROCESS });
131
132 export const matchWorkflowRoute = (route: string) =>
133     matchPath<ResourceRouteParams>(route, { path: Routes.WORKFLOWS });
134
135 export const matchSearchResultsRoute = (route: string) =>
136     matchPath<ResourceRouteParams>(route, { path: Routes.SEARCH_RESULTS });
137
138 export const matchUserVirtualMachineRoute = (route: string) =>
139     matchPath<ResourceRouteParams>(route, { path: Routes.VIRTUAL_MACHINES_USER });
140
141 export const matchAdminVirtualMachineRoute = (route: string) =>
142     matchPath<ResourceRouteParams>(route, { path: Routes.VIRTUAL_MACHINES_ADMIN });
143
144 export const matchRepositoriesRoute = (route: string) =>
145     matchPath<ResourceRouteParams>(route, { path: Routes.REPOSITORIES });
146
147 export const matchSshKeysUserRoute = (route: string) =>
148     matchPath(route, { path: Routes.SSH_KEYS_USER });
149
150 export const matchSshKeysAdminRoute = (route: string) =>
151     matchPath(route, { path: Routes.SSH_KEYS_ADMIN });
152
153 export const matchSiteManagerRoute = (route: string) =>
154     matchPath(route, { path: Routes.SITE_MANAGER });
155
156 export const matchMyAccountRoute = (route: string) =>
157     matchPath(route, { path: Routes.MY_ACCOUNT });
158
159 export const matchLinkAccountRoute = (route: string) =>
160     matchPath(route, { path: Routes.LINK_ACCOUNT });
161
162 export const matchKeepServicesRoute = (route: string) =>
163     matchPath(route, { path: Routes.KEEP_SERVICES });
164
165 export const matchTokenRoute = (route: string) =>
166     matchPath(route, { path: Routes.TOKEN });
167
168 export const matchFedTokenRoute = (route: string) =>
169     matchPath(route, { path: Routes.FED_LOGIN });
170
171 export const matchUsersRoute = (route: string) =>
172     matchPath(route, { path: Routes.USERS });
173
174 export const matchComputeNodesRoute = (route: string) =>
175     matchPath(route, { path: Routes.COMPUTE_NODES });
176
177 export const matchApiClientAuthorizationsRoute = (route: string) =>
178     matchPath(route, { path: Routes.API_CLIENT_AUTHORIZATIONS });
179
180 export const matchGroupsRoute = (route: string) =>
181     matchPath(route, { path: Routes.GROUPS });
182
183 export const matchGroupDetailsRoute = (route: string) =>
184     matchPath<ResourceRouteParams>(route, { path: Routes.GROUP_DETAILS });
185
186 export const matchLinksRoute = (route: string) =>
187     matchPath(route, { path: Routes.LINKS });
188
189 export const matchPublicFavoritesRoute = (route: string) =>
190     matchPath(route, { path: Routes.PUBLIC_FAVORITES });
191
192 export const matchCollectionsContentAddressRoute = (route: string) =>
193     matchPath(route, { path: Routes.COLLECTIONS_CONTENT_ADDRESS });