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 {
15 filters?: FilterBuilder<LinkResource>;
16 order?: OrderBuilder<LinkResource>;
19 export class FavoriteService {
21 private linkService: LinkService,
22 private groupsService: GroupsService
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
35 delete(data: { userUuid: string; resourceUuid: string; }) {
36 return this.linkService
38 filters: FilterBuilder
39 .create<LinkResource>()
40 .addEqual('tailUuid', data.userUuid)
41 .addEqual('headUuid', data.resourceUuid)
42 .addEqual('linkClass', LinkClass.STAR)
44 .then(results => Promise.all(
45 results.items.map(item => this.linkService.delete(item.uuid))));
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);
54 return this.linkService
57 filters: args.filters ? args.filters.concat(listFilter) : listFilter
60 const uuids = results.items.map(item => item.headUuid);
61 return this.groupsService.contents(userUuid, {
64 filters: FilterBuilder.create<GroupContentsResource>().addIn('uuid', uuids),