Merge branch 'master'
authorMichal Klobukowski <michal.klobukowski@contractors.roche.com>
Mon, 23 Jul 2018 13:20:35 +0000 (15:20 +0200)
committerMichal Klobukowski <michal.klobukowski@contractors.roche.com>
Mon, 23 Jul 2018 13:20:35 +0000 (15:20 +0200)
Feature #13840

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

src/models/link.ts [new file with mode: 0644]
src/services/favorite-service/favorite-service.ts [new file with mode: 0644]
src/services/link-service/link-service.ts [new file with mode: 0644]
src/services/services.ts

diff --git a/src/models/link.ts b/src/models/link.ts
new file mode 100644 (file)
index 0000000..8686528
--- /dev/null
@@ -0,0 +1,17 @@
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
+import { Resource } from "./resource";
+
+export interface LinkResource extends Resource {
+    headUuid: string;
+    tailUuid: string;
+    linkClass: string;
+    name: string;
+    properties: {};
+}
+
+export enum LinkClass {
+    STAR = 'star'
+}
\ No newline at end of file
diff --git a/src/services/favorite-service/favorite-service.ts b/src/services/favorite-service/favorite-service.ts
new file mode 100644 (file)
index 0000000..d075b79
--- /dev/null
@@ -0,0 +1,68 @@
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
+import { LinkService } from "../link-service/link-service";
+import { GroupsService, GroupContentsResource } from "../groups-service/groups-service";
+import { LinkResource, LinkClass } from "../../models/link";
+import { FilterBuilder } from "../../common/api/filter-builder";
+import { ListArguments, ListResults } from "../../common/api/common-resource-service";
+import { OrderBuilder } from "../../common/api/order-builder";
+
+export interface FavoriteListArguments extends ListArguments {
+    filters?: FilterBuilder<LinkResource>;
+    order?: OrderBuilder<LinkResource>;
+}
+export class FavoriteService {
+    constructor(
+        private linkService: LinkService,
+        private groupsService: GroupsService
+    ) { }
+
+    create(data: { userUuid: string; resourceUuid: string; }) {
+        return this.linkService.create({
+            ownerUuid: data.userUuid,
+            tailUuid: data.userUuid,
+            headUuid: data.resourceUuid,
+            linkClass: LinkClass.STAR,
+            name: data.resourceUuid
+        });
+    }
+
+    delete(data: { userUuid: string; resourceUuid: string; }) {
+        return this.linkService
+            .list({
+                filters: FilterBuilder
+                    .create<LinkResource>()
+                    .addEqual('tailUuid', data.userUuid)
+                    .addEqual('headUuid', data.resourceUuid)
+                    .addEqual('linkClass', LinkClass.STAR)
+            })
+            .then(results => Promise.all(
+                results.items.map(item => this.linkService.delete(item.uuid))));
+    }
+
+    list(userUuid: string, args: FavoriteListArguments = {}): Promise<ListResults<GroupContentsResource>> {
+        const listFilter = FilterBuilder
+            .create<LinkResource>()
+            .addEqual('tailUuid', userUuid)
+            .addEqual('linkClass', LinkClass.STAR);
+
+        return this.linkService
+            .list({
+                ...args,
+                filters: args.filters ? args.filters.concat(listFilter) : listFilter
+            })
+            .then(results => {
+                const uuids = results.items.map(item => item.headUuid);
+                return this.groupsService.contents(userUuid, {
+                    limit: args.limit,
+                    offset: args.offset,
+                    filters: FilterBuilder.create<GroupContentsResource>().addIn('uuid', uuids),
+                    recursive: true
+                });
+            });
+    }
+
+
+}
\ No newline at end of file
diff --git a/src/services/link-service/link-service.ts b/src/services/link-service/link-service.ts
new file mode 100644 (file)
index 0000000..4c12cd0
--- /dev/null
@@ -0,0 +1,13 @@
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
+import { CommonResourceService } from "../../common/api/common-resource-service";
+import { LinkResource } from "../../models/link";
+import { AxiosInstance } from "axios";
+
+export class LinkService extends CommonResourceService<LinkResource> {
+    constructor(serverApi: AxiosInstance) {
+        super(serverApi, "links");
+    }
+}
\ No newline at end of file
index 57f07d6c6a579550de2ab141fdbace8e0afebe03..f0afd76fc82f7158f3e85aa9ddcb95b0d1c2df65 100644 (file)
@@ -6,7 +6,11 @@ import { AuthService } from "./auth-service/auth-service";
 import { GroupsService } from "./groups-service/groups-service";
 import { serverApi } from "../common/api/server-api";
 import { ProjectService } from "./project-service/project-service";
+import { LinkService } from "./link-service/link-service";
+import { FavoriteService } from "./favorite-service/favorite-service";
 
 export const authService = new AuthService(serverApi);
 export const groupsService = new GroupsService(serverApi);
 export const projectService = new ProjectService(serverApi);
+export const linkService = new LinkService(serverApi);
+export const favoriteService = new FavoriteService(linkService, groupsService);