Merge branch 'main' into 15768-multi-select-operations Arvados-DCO-1.1-Signed-off...
[arvados-workbench2.git] / src / services / groups-service / groups-service.ts
index a36ddba894c84a987f8f672c1a370a627f89b13c..b9f47df0dbb97e01e7f020c84ebf2eb1139c4339 100644 (file)
@@ -6,8 +6,8 @@ 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';
@@ -20,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, cancelToken?: CancelToken): 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';
-    const cfg: AxiosRequestConfig = {
-      params: CommonResourceService.mapKeys(snakeCase)(params),
-    };
+    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),
+        };
 
-    if (session) {
-      cfg.baseURL = session.baseUrl;
-      cfg.headers = { Authorization: 'Bearer ' + session.token };
-    }
+        if (session) {
+            cfg.baseURL = session.baseUrl;
+            cfg.headers = { Authorization: 'Bearer ' + session.token };
+        }
 
-    if (cancelToken) {
-      cfg.cancelToken = cancelToken;
-    }
+        if (cancelToken) {
+            cfg.cancelToken = cancelToken;
+        }
 
-    const response = await CommonResourceService.defaultResponse(
-      this.serverApi.get(this.resourceType + pathUrl, cfg),
-      this.actions,
-      false
-    );
+        const response = await CommonResourceService.defaultResponse(
+            this.serverApi.get(this.resourceType + pathUrl, cfg),
+            this.actions,
+            false
+        );
 
-    return {
-      ...TrashableResourceService.mapKeys(camelCase)(response),
-      clusterId: session && session.clusterId,
-    };
-  }
+        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
-    );
-  }
+    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',
 }