Merge branch 'master'
[arvados-workbench2.git] / src / services / project-service / project-service.ts
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 import { serverApi } from "../../common/api/server-api";
6 import { Dispatch } from "redux";
7 import actions from "../../store/project/project-action";
8 import { Project } from "../../models/project";
9 import UrlBuilder from "../../common/api/url-builder";
10 import FilterBuilder, { FilterField } from "../../common/api/filter-builder";
11
12 interface GroupsResponse {
13     offset: number;
14     limit: number;
15     items: Array<{
16         href: string;
17         kind: string;
18         etag: string;
19         uuid: string;
20         owner_uuid: string;
21         created_at: string;
22         modified_by_client_uuid: string;
23         modified_by_user_uuid: string;
24         modified_at: string;
25         name: string;
26         group_class: string;
27         description: string;
28         writable_by: string[];
29         delete_at: string;
30         trash_at: string;
31         is_trashed: boolean;
32     }>;
33 }
34
35 export default class ProjectService {
36     public getProjectList = (parentUuid?: string) => (dispatch: Dispatch): Promise<Project[]> => {
37         dispatch(actions.PROJECTS_REQUEST(parentUuid));
38         if (parentUuid) {
39             const fb = new FilterBuilder();
40             fb.addLike(FilterField.OWNER_UUID, parentUuid);
41             return serverApi.get<GroupsResponse>('/groups', { params: {
42                 filters: fb.get()
43             }}).then(groups => {
44                 const projects = groups.data.items.map(g => ({
45                     name: g.name,
46                     createdAt: g.created_at,
47                     modifiedAt: g.modified_at,
48                     href: g.href,
49                     uuid: g.uuid,
50                     ownerUuid: g.owner_uuid,
51                     kind: g.kind
52                 } as Project));
53                 dispatch(actions.PROJECTS_SUCCESS({projects, parentItemId: parentUuid}));
54                 return projects;
55             });
56         } else {
57             dispatch(actions.PROJECTS_SUCCESS({projects: [], parentItemId: parentUuid}));
58             return Promise.resolve([]);
59         }
60     }
61 }