Create FavoriteService
[arvados-workbench2.git] / src / services / favorite-service / favorite-service.ts
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 import LinkService from "../link-service/link-service";
6 import GroupsService, { GroupContentsResource } from "../groups-service/groups-service";
7 import { LinkResource, LinkClass } from "../../models/link";
8 import FilterBuilder from "../../common/api/filter-builder";
9 import { ListArguments, ListResults } from "../../common/api/common-resource-service";
10
11 export default class FavoriteService {
12     constructor(
13         private linkService: LinkService,
14         private groupsService: GroupsService
15     ) { }
16
17     create(data: { userUuid: string; resourceUuid: string; }) {
18         return this.linkService.create({
19             ownerUuid: data.userUuid,
20             tailUuid: data.userUuid,
21             headUuid: data.resourceUuid,
22             linkClass: LinkClass.STAR,
23             name: data.resourceUuid
24         });
25     }
26
27     delete(data: { userUuid: string; resourceUuid: string; }) {
28         return this.linkService
29             .list({
30                 filters: FilterBuilder
31                     .create<LinkResource>()
32                     .addEqual('tailUuid', data.userUuid)
33                     .addEqual('headUuid', data.resourceUuid)
34                     .addEqual('linkClass', LinkClass.STAR)
35             })
36             .then(results => Promise.all(
37                 results.items.map(item => this.linkService.delete(item.uuid))));
38     }
39
40     list(userUuid: string, args: ListArguments = {}): Promise<ListResults<GroupContentsResource>> {
41         const listFilter = FilterBuilder
42             .create<LinkResource>()
43             .addEqual('tailUuid', userUuid)
44             .addEqual('linkClass', LinkClass.STAR);
45
46         return this.linkService
47             .list({
48                 ...args,
49                 filters: args.filters ? args.filters.concat(listFilter) : listFilter
50             })
51             .then(results => {
52                 const uuids = results.items.map(item => item.headUuid);
53                 return this.groupsService.contents(userUuid, {
54                     limit: args.limit,
55                     offset: args.offset,
56                     filters: FilterBuilder.create<GroupContentsResource>().addIn('uuid', uuids)
57                 });
58             });
59     }
60
61
62 }