Merge branch 'main' of git.arvados.org:arvados-workbench2 into 20377-dataexplorer...
[arvados-workbench2.git] / src / services / groups-service / groups-service.ts
index 1e9078d9382ecb508c36100a2c7246a0396f74d3..fc6033002dccea2532e27dfe361eaa354747f860 100644 (file)
@@ -2,11 +2,12 @@
 //
 // SPDX-License-Identifier: AGPL-3.0
 
-import { snakeCase, camelCase } from 'lodash';
+import { CancelToken } from 'axios';
+import { snakeCase, camelCase } from "lodash";
 import { CommonResourceService } from 'services/common-service/common-resource-service';
 import {
-  ListResults,
-  ListArguments,
+    ListResults,
+    ListArguments,
 } from 'services/common-service/common-service';
 import { AxiosInstance, AxiosRequestConfig } from 'axios';
 import { CollectionResource } from 'models/collection';
@@ -19,78 +20,85 @@ import { GroupResource } from 'models/group';
 import { Session } from 'models/session';
 
 export interface ContentsArguments {
-  limit?: number;
-  offset?: number;
-  order?: string;
-  filters?: string;
-  recursive?: boolean;
-  includeTrash?: boolean;
-  excludeHomeProject?: boolean;
+    limit?: number;
+    offset?: number;
+    order?: string;
+    filters?: string;
+    recursive?: boolean;
+    includeTrash?: boolean;
+    excludeHomeProject?: boolean;
+    select?: string[];
 }
 
 export interface SharedArguments extends ListArguments {
-  include?: string;
+    include?: string;
 }
 
 export type GroupContentsResource =
-  | CollectionResource
-  | ProjectResource
-  | ProcessResource
-  | WorkflowResource;
+    | CollectionResource
+    | ProjectResource
+    | ProcessResource
+    | WorkflowResource;
 
 export class GroupsService<
-  T extends GroupResource = GroupResource
-> extends TrashableResourceService<T> {
-  constructor(serverApi: AxiosInstance, actions: ApiActions) {
-    super(serverApi, 'groups', actions);
-  }
+    T extends GroupResource = GroupResource
+    > extends TrashableResourceService<T> {
+    constructor(serverApi: AxiosInstance, actions: ApiActions) {
+        super(serverApi, 'groups', actions);
+    }
 
-  async contents(
-    uuid: string,
-    args: ContentsArguments = {},
-    session?: Session
-  ): Promise<ListResults<GroupContentsResource>> {
-    const { filters, order, ...other } = args;
-    const params = {
-      ...other,
-      filters: filters ? `[${filters}]` : undefined,
-      order: order ? order : undefined,
-    };
-    const pathUrl = uuid ? `/${uuid}/contents` : '/contents';
+    async contents(uuid: string, args: ContentsArguments = {}, session?: Session, cancelToken?: CancelToken): Promise<ListResults<GroupContentsResource>> {
+        const { filters, order, select, ...other } = args;
+        const params = {
+            ...other,
+            filters: filters ? `[${filters}]` : undefined,
+            order: order ? order : undefined,
+            select: select
+                ? JSON.stringify(select.map(sel => {
+                    const sp = sel.split(".");
+                    return sp.length === 2 ? (sp[0] + "." + snakeCase(sp[1])) : snakeCase(sel);
+                }))
+                : undefined
+        };
+        const pathUrl = uuid ? `/${uuid}/contents` : '/contents';
+        const cfg: AxiosRequestConfig = {
+            params: CommonResourceService.mapKeys(snakeCase)(params),
+        };
 
-    const cfg: AxiosRequestConfig = {
-      params: CommonResourceService.mapKeys(snakeCase)(params),
-    };
-    if (session) {
-      cfg.baseURL = session.baseUrl;
-      cfg.headers = { Authorization: 'Bearer ' + session.token };
-    }
+        if (session) {
+            cfg.baseURL = session.baseUrl;
+            cfg.headers = { Authorization: 'Bearer ' + session.token };
+        }
 
-    const response = await CommonResourceService.defaultResponse(
-      this.serverApi.get(this.resourceType + pathUrl, cfg),
-      this.actions,
-      false
-    );
+        if (cancelToken) {
+            cfg.cancelToken = cancelToken;
+        }
 
-    return {
-      ...TrashableResourceService.mapKeys(camelCase)(response),
-      clusterId: session && session.clusterId,
-    };
-  }
+        const response = await CommonResourceService.defaultResponse(
+            this.serverApi.get(this.resourceType + pathUrl, cfg),
+            this.actions,
+            false
+        );
 
-  shared(
-    params: SharedArguments = {}
-  ): Promise<ListResults<GroupContentsResource>> {
-    return CommonResourceService.defaultResponse(
-      this.serverApi.get(this.resourceType + '/shared', { params }),
-      this.actions
-    );
-  }
+        return {
+            ...TrashableResourceService.mapKeys(camelCase)(response),
+            clusterId: session && session.clusterId,
+        };
+    }
+
+    shared(
+        params: SharedArguments = {}
+    ): Promise<ListResults<GroupContentsResource>> {
+        return CommonResourceService.defaultResponse(
+            this.serverApi.get(this.resourceType + '/shared', { params }),
+            this.actions
+        );
+    }
 }
 
 export enum GroupContentsResourcePrefix {
-  COLLECTION = 'collections',
-  PROJECT = 'groups',
-  PROCESS = 'container_requests',
-  WORKFLOW = 'workflows',
+    COLLECTION = 'collections',
+    PROJECT = 'groups',
+    PROCESS = 'container_requests',
+    WORKFLOW = 'workflows',
 }