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
// 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;
}
import { ProjectResource } from "../../models/project";
import { ProcessResource } from "../../models/process";
-interface ContensArguments {
+export interface ContensArguments {
limit?: number;
offset?: number;
order?: OrderBuilder;
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");
--- /dev/null
+// 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()
+ }
+ });
+ });
+
+});
--- /dev/null
+// 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
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);