diff --git a/angular/src/modules/vault-filter/vault-filter.service.ts b/angular/src/modules/vault-filter/vault-filter.service.ts index b05cce17..fe62d5e9 100644 --- a/angular/src/modules/vault-filter/vault-filter.service.ts +++ b/angular/src/modules/vault-filter/vault-filter.service.ts @@ -15,6 +15,8 @@ import { DynamicTreeNode } from "./models/dynamic-tree-node.model"; @Injectable() export class VaultFilterService { + getAllCollectionsFromServer = false; + constructor( protected stateService: StateService, protected organizationService: OrganizationService, @@ -58,13 +60,10 @@ export class VaultFilterService { } async buildCollections(organizationId?: string): Promise> { - const storedCollections = await this.collectionService.getAllDecrypted(); - let collections: CollectionView[]; - if (organizationId != null) { - collections = storedCollections.filter((c) => c.organizationId === organizationId); - } else { - collections = storedCollections; - } + const collections = this.getAllCollectionsFromServer + ? await this.collectionService.getOrgCollectionsFromServer(organizationId) + : await this.getUserCollections(organizationId); + const nestedCollections = await this.collectionService.getAllNested(collections); return new DynamicTreeNode({ fullList: collections, @@ -72,6 +71,13 @@ export class VaultFilterService { }); } + private async getUserCollections(organizationId?: string): Promise { + const storedCollections = await this.collectionService.getAllDecrypted(); + return organizationId != null + ? storedCollections.filter((c) => c.organizationId === organizationId) + : storedCollections; + } + async checkForSingleOrganizationPolicy(): Promise { return await this.policyService.policyAppliesToUser(PolicyType.SingleOrg); } diff --git a/angular/src/services/jslib-services.module.ts b/angular/src/services/jslib-services.module.ts index 900a38c0..4e96931e 100644 --- a/angular/src/services/jslib-services.module.ts +++ b/angular/src/services/jslib-services.module.ts @@ -213,7 +213,12 @@ export const SYSTEM_LANGUAGE = new InjectionToken("SYSTEM_LANGUAGE"); { provide: CollectionServiceAbstraction, useClass: CollectionService, - deps: [CryptoServiceAbstraction, I18nServiceAbstraction, StateServiceAbstraction], + deps: [ + CryptoServiceAbstraction, + I18nServiceAbstraction, + StateServiceAbstraction, + ApiServiceAbstraction, + ], }, { provide: EnvironmentServiceAbstraction, diff --git a/common/src/abstractions/collection.service.ts b/common/src/abstractions/collection.service.ts index 0673e906..a4af81eb 100644 --- a/common/src/abstractions/collection.service.ts +++ b/common/src/abstractions/collection.service.ts @@ -10,6 +10,7 @@ export abstract class CollectionService { get: (id: string) => Promise; getAll: () => Promise; getAllDecrypted: () => Promise; + getOrgCollectionsFromServer: (organizationId: string) => Promise; getAllNested: (collections?: CollectionView[]) => Promise[]>; getNested: (id: string) => Promise>; upsert: (collection: CollectionData | CollectionData[]) => Promise; diff --git a/common/src/services/collection.service.ts b/common/src/services/collection.service.ts index 4d3563d7..e2ecc3a8 100644 --- a/common/src/services/collection.service.ts +++ b/common/src/services/collection.service.ts @@ -1,3 +1,6 @@ +import { ApiService } from "jslib-common/abstractions/api.service"; +import { CollectionDetailsResponse } from "jslib-common/models/response/collectionResponse"; + import { CollectionService as CollectionServiceAbstraction } from "../abstractions/collection.service"; import { CryptoService } from "../abstractions/crypto.service"; import { I18nService } from "../abstractions/i18n.service"; @@ -15,7 +18,8 @@ export class CollectionService implements CollectionServiceAbstraction { constructor( private cryptoService: CryptoService, private i18nService: I18nService, - private stateService: StateService + private stateService: StateService, + private apiService: ApiService ) {} async clearCache(userId?: string): Promise { @@ -154,4 +158,18 @@ export class CollectionService implements CollectionServiceAbstraction { await this.replace(collections); } + + async getOrgCollectionsFromServer(organizationId: string) { + let result: CollectionView[] = []; + + const collectionResponse = await this.apiService.getCollections(organizationId); + if (collectionResponse?.data != null && collectionResponse.data.length) { + const collectionDomains = collectionResponse.data.map( + (r) => new Collection(new CollectionData(r as CollectionDetailsResponse)) + ); + result = await this.decryptMany(collectionDomains); + } + + return result; + } }