added-functionality-for-creating-projects
authorPawel Kowalczyk <pawel.kowalczyk@contractors.roche.com>
Wed, 4 Jul 2018 07:43:29 +0000 (09:43 +0200)
committerPawel Kowalczyk <pawel.kowalczyk@contractors.roche.com>
Wed, 4 Jul 2018 07:55:05 +0000 (09:55 +0200)
Feature #13684

Arvados-DCO-1.1-Signed-off-by: Pawel Kowalczyk <pawel.kowalczyk@contractors.roche.com>

Feature #13684

Arvados-DCO-1.1-Signed-off-by: Pawel Kowalczyk <pawel.kowalczyk@contractors.roche.com>

.gitignore
src/common/api/common-resource-service.test.ts
src/common/api/common-resource-service.ts
src/services/groups-service/groups-service.test.ts
src/services/project-service/project-service.ts [deleted file]
src/services/services.ts
src/store/project/project-action.ts
src/store/project/project-reducer.test.ts

index 280ad3f03d4d094023a94b68ff82a0affb7d400d..c18f27f6572824668327ebd997eafd3f0c77d76d 100644 (file)
@@ -1,8 +1,15 @@
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
 # See https://help.github.com/ignore-files/ for more about ignoring files.
 
 # dependencies
 /node_modules
 
+# vscode
+/.vs
+
 # testing
 /coverage
 
index a07655e5a3eefacbae9bbb2b91b5fc48918fcfc6..d28abc459448ce033d2d51580989f473da73d7b5 100644 (file)
@@ -36,7 +36,7 @@ describe("CommonResourceService", () => {
 
     it("#list", async () => {
         axiosMock
-            .onGet("/resource")
+            .onGet("/resource/")
             .reply(200, {
                 kind: "kind",
                 offset: 2,
index 93fc000e19cf2d1edb8ad9057dd70d6dc1f52f68..3e147b224772257b75967d33e4ccf9286037399a 100644 (file)
@@ -20,8 +20,8 @@ export interface Resource {
 }
 
 export interface ListArguments {
-    limit: number;
-    offset: number;
+    limit?: number;
+    offset?: number;
     filters?: FilterBuilder;
     order?: OrderBuilder;
     select?: string[];
@@ -68,8 +68,10 @@ export default class CommonResourceService<T extends Resource> {
         this.resourceType = '/' + resourceType + '/';
     }
 
-    create() {
-        throw new Error("Not implemented");
+    create(data: Partial<T>) {
+        return this.serverApi
+            .post<T>(this.resourceType, data)
+            .then(CommonResourceService.mapResponseKeys);
     }
 
     delete(uuid: string): Promise<T> {
@@ -84,7 +86,7 @@ export default class CommonResourceService<T extends Resource> {
             .then(CommonResourceService.mapResponseKeys);
     }
 
-    list(args: ListArguments): Promise<ListResults<T>> {
+    list(args: ListArguments = {}): Promise<ListResults<T>> {
         const { filters, order, ...other } = args;
         const params = {
             ...other,
index 2ace2f50d270aec41f17891daa7f129818093afa..2562a595d02ff52b0c0af4954d10f5fb20e67e06 100644 (file)
@@ -16,7 +16,7 @@ describe("GroupsService", () => {
 
     it("#contents", async () => {
         axiosMock
-            .onGet("/groups/1/contents")
+            .onGet("/groups/1/contents/")
             .reply(200, {
                 kind: "kind",
                 offset: 2,
diff --git a/src/services/project-service/project-service.ts b/src/services/project-service/project-service.ts
deleted file mode 100644 (file)
index 5bfa544..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright (C) The Arvados Authors. All rights reserved.
-//
-// SPDX-License-Identifier: AGPL-3.0
-
-import { serverApi } from "../../common/api/server-api";
-import { Dispatch } from "redux";
-import { Project } from "../../models/project";
-import FilterBuilder, { FilterField } from "../../common/api/filter-builder";
-import { ArvadosResource } from "../response";
-import { getResourceKind } from "../../models/resource";
-
-interface GroupResource extends ArvadosResource {
-    name: string;
-    group_class: string;
-    description: string;
-    writable_by: string[];
-    delete_at: string;
-    trash_at: string;
-    is_trashed: boolean;
-}
-
-interface GroupsResponse {
-    offset: number;
-    limit: number;
-    items: GroupResource[];
-}
-
-export default class ProjectService {
-    public getProjectList = (parentUuid?: string): Promise<Project[]> => {
-        if (parentUuid) {
-            const fb = new FilterBuilder();
-            fb.addLike(FilterField.OWNER_UUID, parentUuid);
-            return serverApi.get<GroupsResponse>('/groups', { params: {
-                filters: fb.get()
-            }}).then(resp => {
-                const projects = resp.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,
-                    kind: getResourceKind(g.kind)
-                } as Project));
-                return projects;
-            });
-        } else {
-            return Promise.resolve([]);
-        }
-    }
-}
index 7ad2ff7d855dcbc45c64836c8a8b7d7fbfeb96be..51d2b760e39d1f006772aab5a453dff1dfbb6e63 100644 (file)
@@ -3,12 +3,10 @@
 // SPDX-License-Identifier: AGPL-3.0
 
 import AuthService from "./auth-service/auth-service";
-import ProjectService from "./project-service/project-service";
 import CollectionService from "./collection-service/collection-service";
 import GroupsService from "./groups-service/groups-service";
 import { serverApi } from "../common/api/server-api";
 
 export const authService = new AuthService();
-export const projectService = new ProjectService();
 export const collectionService = new CollectionService();
 export const groupsService = new GroupsService(serverApi);
index 35ff445e43d0d09c660c8ea22f68e2d3cc9d6030..4cc219799e8cfcb371f14927925faf00555ddffb 100644 (file)
@@ -4,8 +4,9 @@
 import { default as unionize, ofType, UnionOf } from "unionize";
 
 import { Project } from "../../models/project";
-import { projectService } from "../../services/services";
+import { groupsService } from "../../services/services";
 import { Dispatch } from "redux";
+import { getResourceKind } from "../../models/resource";
 
 const actions = unionize({
     CREATE_PROJECT: ofType<Project>(),
@@ -19,15 +20,17 @@ const actions = unionize({
         tag: 'type',
         value: 'payload'
     });
-
-export const getProjectList = (parentUuid?: string) => (dispatch: Dispatch): Promise<Project[]> => {
-    if (parentUuid) {
+export const getProjectList = (parentUuid: string = '') => (dispatch: Dispatch) => {
         dispatch(actions.PROJECTS_REQUEST(parentUuid));
-        return projectService.getProjectList(parentUuid).then(projects => {
+        return groupsService.list().then(listResults => {
+            const projects = listResults.items.map(item => ({
+                ...item,
+                kind: getResourceKind(item.kind)
+            }));
             dispatch(actions.PROJECTS_SUCCESS({ projects, parentItemId: parentUuid }));
             return projects;
         });
-    } return Promise.resolve([]);
 };
 
 export type ProjectAction = UnionOf<typeof actions>;
index f4301040d5b165b709092892873245e9c6c3ca1c..c80f18c82f1ef92a6032cbd60ce46687d0b7cd8f 100644 (file)
@@ -129,12 +129,13 @@ describe('project-reducer', () => {
                     modifiedAt: '2018-01-01',
                     ownerUuid: 'owner-test123',
                     uuid: 'test123',
-                    kind: ResourceKind.PROJECT
+                    kind: ResourceKind.PROJECT,
                 },
                 id: "1",
                 open: true,
                 active: true,
-                status: 1
+                status: 1,
+                toggled: true
             }],
             currentItemId: "1"
         };