Create projects service
authorMichal Klobukowski <michal.klobukowski@contractors.roche.com>
Fri, 6 Jul 2018 14:34:13 +0000 (16:34 +0200)
committerMichal Klobukowski <michal.klobukowski@contractors.roche.com>
Fri, 6 Jul 2018 14:34:13 +0000 (16:34 +0200)
Feature #13747

Arvados-DCO-1.1-Signed-off-by: Michal Klobukowski <michal.klobukowski@contractors.roche.com>

src/models/group.ts
src/models/project.ts
src/services/groups-service/groups-service.ts
src/services/project-service/project-service.test.ts [new file with mode: 0644]
src/services/project-service/project-service.ts [new file with mode: 0644]
src/services/services.ts

index dae516bddb0f19548b0417bef78f33632aa53648..4bb9a7fd661eba4c836f7a735f0b8674ec6ff5af 100644 (file)
@@ -8,11 +8,15 @@ import { ResourceKind } from "./kinds";
 export interface GroupResource extends Resource {
     kind: ResourceKind.Group;
     name: string;
-    groupClass: string;
+    groupClass: GroupClass | null;
     description: string;
     properties: string;
     writeableBy: string[];
     trashAt: string;
     deleteAt: string;
     isTrashed: boolean;
+}
+
+export enum GroupClass {
+    Project = "project"
 }
\ No newline at end of file
index beb9810cc0282a8830719887194bb90de259cab8..c44c8cc7974a9162583ef6b01cfbb3e81281734d 100644 (file)
@@ -3,11 +3,11 @@
 // SPDX-License-Identifier: AGPL-3.0
 
 import { Resource as R } from "./resource";
-import { GroupResource } from "./group";
+import { GroupResource, GroupClass } from "./group";
 
 export interface Project extends R {
 }
 
 export interface ProjectResource extends GroupResource {
-    groupClass: "project";
+    groupClass: GroupClass.Project;
 }
index ed61297dabe1fb82f78a50a08d6df05917f070a4..1e6dff8e82b786ac31e765a436503fcb56bd6356 100644 (file)
@@ -12,7 +12,7 @@ import { CollectionResource } from "../../models/collection";
 import { ProjectResource } from "../../models/project";
 import { ProcessResource } from "../../models/process";
 
-interface ContensArguments {
+export interface ContensArguments {
     limit?: number;
     offset?: number;
     order?: OrderBuilder;
@@ -25,7 +25,7 @@ export type GroupContentsResource =
     ProjectResource |
     ProcessResource;
 
-export default class GroupsService extends CommonResourceService<GroupResource> {
+export default class GroupsService<T extends GroupResource = GroupResource> extends CommonResourceService<T> {
 
     constructor(serverApi: AxiosInstance) {
         super(serverApi, "groups");
diff --git a/src/services/project-service/project-service.test.ts b/src/services/project-service/project-service.test.ts
new file mode 100644 (file)
index 0000000..68df245
--- /dev/null
@@ -0,0 +1,39 @@
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
+import axios from "axios";
+import MockAdapter from "axios-mock-adapter";
+import ProjectService from "./project-service";
+import FilterBuilder from "../../common/api/filter-builder";
+import { ProjectResource } from "../../models/project";
+
+describe("CommonResourceService", () => {
+    const axiosInstance = axios.create();
+
+    it(`#create has groupClass set to "project"`, async () => {
+        axiosInstance.post = jest.fn(() => Promise.resolve({ data: {} }));
+        const projectService = new ProjectService(axiosInstance);
+        const resource = await projectService.create({ name: "nameValue" });
+        expect(axiosInstance.post).toHaveBeenCalledWith("/groups/", {
+            name: "nameValue",
+            group_class: "project"
+        });
+    });
+
+
+    it("#list has groupClass filter set by default", async () => {
+        axiosInstance.get = jest.fn(() => Promise.resolve({ data: {} }));
+        const projectService = new ProjectService(axiosInstance);
+        const resource = await projectService.list();
+        expect(axiosInstance.get).toHaveBeenCalledWith("/groups/", {
+            params: {
+                filters: FilterBuilder
+                    .create<ProjectResource>()
+                    .addEqual("groupClass", "project")
+                    .serialize()
+            }
+        });
+    });
+    
+});
diff --git a/src/services/project-service/project-service.ts b/src/services/project-service/project-service.ts
new file mode 100644 (file)
index 0000000..5fac2b2
--- /dev/null
@@ -0,0 +1,36 @@
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
+import GroupsService, { ContensArguments } from "../groups-service/groups-service";
+import { ProjectResource } from "../../models/project";
+import { GroupClass } from "../../models/group";
+import { ListArguments } from "../../common/api/common-resource-service";
+import FilterBuilder from "../../common/api/filter-builder";
+
+export default class ProjectService extends GroupsService<ProjectResource> {
+
+    create(data: Partial<ProjectResource>) {
+        const projectData = { ...data, groupClass: GroupClass.Project };
+        return super.create(projectData);
+    }
+
+    list(args: ListArguments = {}) {
+        return super.list({
+            ...args,
+            filters: this.addProjectFilter(args.filters)
+        });
+    }
+
+    private addProjectFilter(filters?: FilterBuilder) {
+        return FilterBuilder
+            .create()
+            .concat(filters
+                ? filters
+                : FilterBuilder.create())
+            .concat(FilterBuilder
+                .create<ProjectResource>()
+                .addEqual("groupClass", GroupClass.Project));
+    }
+
+}
\ No newline at end of file
index 51d2b760e39d1f006772aab5a453dff1dfbb6e63..1e9a74dd3fbf3b22d50c4ea8faec96f5a8452cff 100644 (file)
@@ -6,7 +6,9 @@ import AuthService from "./auth-service/auth-service";
 import CollectionService from "./collection-service/collection-service";
 import GroupsService from "./groups-service/groups-service";
 import { serverApi } from "../common/api/server-api";
+import ProjectService from "./project-service/project-service";
 
 export const authService = new AuthService();
 export const collectionService = new CollectionService();
 export const groupsService = new GroupsService(serverApi);
+export const projectService = new ProjectService(serverApi);