Merge branch '21128-toolbar-context-menu'
[arvados-workbench2.git] / src / services / ancestors-service / ancestors-service.ts
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 import { GroupsService } from "services/groups-service/groups-service";
6 import { UserService } from '../user-service/user-service';
7 import { GroupResource } from 'models/group';
8 import { UserResource } from 'models/user';
9 import { extractUuidObjectType, ResourceObjectType } from "models/resource";
10 import { CollectionService } from "services/collection-service/collection-service";
11 import { CollectionResource } from "models/collection";
12
13 export class AncestorService {
14     constructor(
15         private groupsService: GroupsService,
16         private userService: UserService,
17         private collectionService: CollectionService,
18     ) { }
19
20     async ancestors(startUuid: string, endUuid: string): Promise<Array<UserResource | GroupResource | CollectionResource>> {
21         return this._ancestors(startUuid, endUuid);
22     }
23
24     private async _ancestors(startUuid: string, endUuid: string, previousUuid = ''): Promise<Array<UserResource | GroupResource | CollectionResource>> {
25
26         if (startUuid === previousUuid) {
27             return [];
28         }
29
30         const service = this.getService(extractUuidObjectType(startUuid));
31         if (service) {
32             try {
33                 const resource = await service.get(startUuid, false);
34                 if (startUuid === endUuid) {
35                     return [resource];
36                 } else {
37                     return [
38                         ...await this._ancestors(resource.ownerUuid, endUuid, startUuid),
39                         resource
40                     ];
41                 }
42             } catch (e) {
43                 return [];
44             }
45         }
46         return [];
47     }
48
49     private getService = (objectType?: string) => {
50         switch (objectType) {
51             case ResourceObjectType.GROUP:
52                 return this.groupsService;
53             case ResourceObjectType.USER:
54                 return this.userService;
55             case ResourceObjectType.COLLECTION:
56                 return this.collectionService;
57             default:
58                 return undefined;
59         }
60     }
61 }