From 8c8a3d8d646f99dce6a1cdbf515745d6f84bb814 Mon Sep 17 00:00:00 2001 From: Michal Klobukowski Date: Fri, 6 Jul 2018 16:34:13 +0200 Subject: [PATCH] Create projects service Feature #13747 Arvados-DCO-1.1-Signed-off-by: Michal Klobukowski --- src/models/group.ts | 6 ++- src/models/project.ts | 4 +- src/services/groups-service/groups-service.ts | 4 +- .../project-service/project-service.test.ts | 39 +++++++++++++++++++ .../project-service/project-service.ts | 36 +++++++++++++++++ src/services/services.ts | 2 + 6 files changed, 86 insertions(+), 5 deletions(-) create mode 100644 src/services/project-service/project-service.test.ts create mode 100644 src/services/project-service/project-service.ts diff --git a/src/models/group.ts b/src/models/group.ts index dae516bd..4bb9a7fd 100644 --- a/src/models/group.ts +++ b/src/models/group.ts @@ -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 diff --git a/src/models/project.ts b/src/models/project.ts index beb9810c..c44c8cc7 100644 --- a/src/models/project.ts +++ b/src/models/project.ts @@ -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; } diff --git a/src/services/groups-service/groups-service.ts b/src/services/groups-service/groups-service.ts index ed61297d..1e6dff8e 100644 --- a/src/services/groups-service/groups-service.ts +++ b/src/services/groups-service/groups-service.ts @@ -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 { +export default class GroupsService extends CommonResourceService { 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 index 00000000..68df2450 --- /dev/null +++ b/src/services/project-service/project-service.test.ts @@ -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() + .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 index 00000000..5fac2b28 --- /dev/null +++ b/src/services/project-service/project-service.ts @@ -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 { + + create(data: Partial) { + 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() + .addEqual("groupClass", GroupClass.Project)); + } + +} \ No newline at end of file diff --git a/src/services/services.ts b/src/services/services.ts index 51d2b760..1e9a74dd 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -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); -- 2.30.2