19275: Fix for race conditions in the full text search bar
[arvados-workbench2.git] / src / services / groups-service / groups-service.ts
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 import { CancelToken } from 'axios';
6 import { snakeCase, camelCase } from "lodash";
7 import { CommonResourceService } from 'services/common-service/common-resource-service';
8 import { ListResults, ListArguments } from 'services/common-service/common-service';
9 import { AxiosInstance, AxiosRequestConfig } from "axios";
10 import { CollectionResource } from "models/collection";
11 import { ProjectResource } from "models/project";
12 import { ProcessResource } from "models/process";
13 import { WorkflowResource } from "models/workflow";
14 import { TrashableResourceService } from "services/common-service/trashable-resource-service";
15 import { ApiActions } from "services/api/api-actions";
16 import { GroupResource } from "models/group";
17 import { Session } from "models/session";
18
19 export interface ContentsArguments {
20     limit?: number;
21     offset?: number;
22     order?: string;
23     filters?: string;
24     recursive?: boolean;
25     includeTrash?: boolean;
26     excludeHomeProject?: boolean;
27 }
28
29 export interface SharedArguments extends ListArguments {
30     include?: string;
31 }
32
33 export type GroupContentsResource =
34     CollectionResource |
35     ProjectResource |
36     ProcessResource |
37     WorkflowResource;
38
39 export class GroupsService<T extends GroupResource = GroupResource> extends TrashableResourceService<T> {
40
41     constructor(serverApi: AxiosInstance, actions: ApiActions) {
42         super(serverApi, "groups", actions);
43     }
44
45     async contents(uuid: string, args: ContentsArguments = {}, session?: Session, cancelToken?: CancelToken): Promise<ListResults<GroupContentsResource>> {
46         const { filters, order, ...other } = args;
47         const params = {
48             ...other,
49             filters: filters ? `[${filters}]` : undefined,
50             order: order ? order : undefined
51         };
52         const pathUrl = uuid ? `/${uuid}/contents` : '/contents';
53
54         const cfg: AxiosRequestConfig = { params: CommonResourceService.mapKeys(snakeCase)(params) };
55         if (session) {
56             cfg.baseURL = session.baseUrl;
57             cfg.headers = { 'Authorization': 'Bearer ' + session.token };
58         }
59
60         if (cancelToken) {
61             cfg.cancelToken = cancelToken;
62         }
63
64         const response = await CommonResourceService.defaultResponse(
65             this.serverApi.get(this.resourceType + pathUrl, cfg), this.actions, false
66         );
67
68         return { ...TrashableResourceService.mapKeys(camelCase)(response), clusterId: session && session.clusterId };
69     }
70
71     shared(params: SharedArguments = {}): Promise<ListResults<GroupContentsResource>> {
72         return CommonResourceService.defaultResponse(
73             this.serverApi
74                 .get(this.resourceType + '/shared', { params }),
75             this.actions
76         );
77     }
78 }
79
80 export enum GroupContentsResourcePrefix {
81     COLLECTION = "collections",
82     PROJECT = "groups",
83     PROCESS = "container_requests",
84     WORKFLOW = "workflows"
85 }