Add favorite panel
[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 import { OrderBuilder } from "../../common/api/order-builder";
11
12 export interface FavoriteListArguments extends ListArguments {
13     limit?: number;
14     offset?: number;
15     filters?: FilterBuilder<LinkResource>;
16     order?: OrderBuilder<LinkResource>;
17 }
18
19 export class FavoriteService {
20     constructor(
21         private linkService: LinkService,
22         private groupsService: GroupsService
23     ) { }
24
25     create(data: { userUuid: string; resourceUuid: string; }) {
26         return this.linkService.create({
27             ownerUuid: data.userUuid,
28             tailUuid: data.userUuid,
29             headUuid: data.resourceUuid,
30             linkClass: LinkClass.STAR,
31             name: data.resourceUuid
32         });
33     }
34
35     delete(data: { userUuid: string; resourceUuid: string; }) {
36         return this.linkService
37             .list({
38                 filters: FilterBuilder
39                     .create<LinkResource>()
40                     .addEqual('tailUuid', data.userUuid)
41                     .addEqual('headUuid', data.resourceUuid)
42                     .addEqual('linkClass', LinkClass.STAR)
43             })
44             .then(results => Promise.all(
45                 results.items.map(item => this.linkService.delete(item.uuid))));
46     }
47
48     list(userUuid: string, args: FavoriteListArguments = {}): Promise<ListResults<GroupContentsResource>> {
49         const listFilter = FilterBuilder
50             .create<LinkResource>()
51             .addEqual('tailUuid', userUuid)
52             .addEqual('linkClass', LinkClass.STAR);
53
54         return this.linkService
55             .list({
56                 ...args,
57                 filters: args.filters ? args.filters.concat(listFilter) : listFilter
58             })
59             .then(results => {
60                 const uuids = results.items.map(item => item.headUuid);
61                 return this.groupsService.contents(userUuid, {
62                     limit: args.limit,
63                     offset: args.offset,
64                     filters: FilterBuilder.create<GroupContentsResource>().addIn('uuid', uuids),
65                     recursive: true
66                 });
67             });
68     }
69 }