change services
[arvados-workbench2.git] / src / services / project-service / project-service.ts
index 2b1bcffc2bd756db574e5ce66992c2566768003a..d60034711ed8402e654c3fa43494c963952a0a4a 100644 (file)
@@ -2,55 +2,52 @@
 //
 // SPDX-License-Identifier: AGPL-3.0
 
-import { serverApi } from "../../common/api/server-api";
-import { Dispatch } from "redux";
-import actions from "../../store/project/project-action";
-import { Project } from "../../models/project";
-import UrlBuilder from "../../common/api/url-builder";
-import FilterBuilder, { FilterField } from "../../common/api/filter-builder";
+import { GroupsService } from "../groups-service/groups-service";
+import { ProjectResource } from "~/models/project";
+import { GroupClass } from "~/models/group";
+import { ListArguments } from "~/services/common-service/common-resource-service";
+import { FilterBuilder, joinFilters } from "~/services/api/filter-builder";
+import { TrashableResourceService } from '~/services/common-service/trashable-resource-service';
+import { snakeCase } from 'lodash';
+export class ProjectService extends GroupsService<ProjectResource> {
 
-interface GroupsResponse {
-    offset: number;
-    limit: number;
-    items: Array<{
-        href: string;
-        kind: string;
-        etag: string;
-        uuid: string;
-        owner_uuid: string;
-        created_at: string;
-        modified_by_client_uuid: string;
-        modified_by_user_uuid: string;
-        modified_at: string;
-        name: string;
-        group_class: string;
-        description: string;
-        writable_by: string[];
-        delete_at: string;
-        trash_at: string;
-        is_trashed: boolean;
-    }>;
-}
-
-export default class ProjectService {
-    public getProjectList = (parentUuid?: string) => (dispatch: Dispatch) => {
-        dispatch(actions.PROJECTS_REQUEST());
+    create(data: Partial<ProjectResource>) {
+        const projectData = { ...data, groupClass: GroupClass.PROJECT };
+        return super.create(projectData);
+    }
 
-        const ub = new UrlBuilder('/groups');
-        const fb = new FilterBuilder();
-        fb.addEqual(FilterField.UUID, parentUuid);
-        const url = ub.addParam('filter', fb.get()).get();
+    update(uuid: string, data: Partial<ProjectResource>) {
+        if (uuid && data && data.properties) {
+            const { properties } = data;
+            const mappedData = {
+                ...TrashableResourceService.mapKeys(snakeCase)(data),
+                properties,
+            };
+            return TrashableResourceService
+                .defaultResponse(
+                    this.serverApi
+                        .put<ProjectResource>(this.resourceType + uuid, mappedData),
+                    this.actions,
+                    false
+                );
+        }
+        return TrashableResourceService
+            .defaultResponse(
+                this.serverApi
+                    .put<ProjectResource>(this.resourceType + uuid, data && TrashableResourceService.mapKeys(snakeCase)(data)),
+                this.actions
+            );
+    }
 
-        serverApi.get<GroupsResponse>(url).then(groups => {
-            const projects = groups.data.items.map(g => ({
-                name: g.name,
-                createdAt: g.created_at,
-                modifiedAt: g.modified_at,
-                href: g.href,
-                uuid: g.uuid,
-                ownerUuid: g.owner_uuid
-            } as Project));
-            dispatch(actions.PROJECTS_SUCCESS({projects, parentItemId: parentUuid}));
+    list(args: ListArguments = {}) {
+        return super.list({
+            ...args,
+            filters: joinFilters(
+                args.filters,
+                new FilterBuilder()
+                    .addEqual("groupClass", GroupClass.PROJECT)
+                    .getFilters()
+            )
         });
-    };
+    }
 }