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";
10 import { OrderBuilder } from "../../common/api/order-builder";
12 export interface FavoriteListArguments extends ListArguments {
13 filters?: FilterBuilder<LinkResource>;
14 order?: OrderBuilder<LinkResource>;
16 export class FavoriteService {
18 private linkService: LinkService,
19 private groupsService: GroupsService
22 create(data: { userUuid: string; resourceUuid: string; }) {
23 return this.linkService.create({
24 ownerUuid: data.userUuid,
25 tailUuid: data.userUuid,
26 headUuid: data.resourceUuid,
27 linkClass: LinkClass.STAR,
28 name: data.resourceUuid
32 delete(data: { userUuid: string; resourceUuid: string; }) {
33 return this.linkService
35 filters: FilterBuilder
36 .create<LinkResource>()
37 .addEqual('tailUuid', data.userUuid)
38 .addEqual('headUuid', data.resourceUuid)
39 .addEqual('linkClass', LinkClass.STAR)
41 .then(results => Promise.all(
42 results.items.map(item => this.linkService.delete(item.uuid))));
45 list(userUuid: string, args: FavoriteListArguments = {}): Promise<ListResults<GroupContentsResource>> {
46 const listFilter = FilterBuilder
47 .create<LinkResource>()
48 .addEqual('tailUuid', userUuid)
49 .addEqual('linkClass', LinkClass.STAR);
51 return this.linkService
54 filters: args.filters ? args.filters.concat(listFilter) : listFilter
57 const uuids = results.items.map(item => item.headUuid);
58 return this.groupsService.contents(userUuid, {
61 filters: FilterBuilder.create<GroupContentsResource>().addIn('uuid', uuids),