1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
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";
11 export default class FavoriteService {
13 private linkService: LinkService,
14 private groupsService: GroupsService
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
27 delete(data: { userUuid: string; resourceUuid: string; }) {
28 return this.linkService
30 filters: FilterBuilder
31 .create<LinkResource>()
32 .addEqual('tailUuid', data.userUuid)
33 .addEqual('headUuid', data.resourceUuid)
34 .addEqual('linkClass', LinkClass.STAR)
36 .then(results => Promise.all(
37 results.items.map(item => this.linkService.delete(item.uuid))));
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);
46 return this.linkService
49 filters: args.filters ? args.filters.concat(listFilter) : listFilter
52 const uuids = results.items.map(item => item.headUuid);
53 return this.groupsService.contents(userUuid, {
56 filters: FilterBuilder.create<GroupContentsResource>().addIn('uuid', uuids),