From 6accaeaed3b965c23c8131cebfe80ce1eb267bd5 Mon Sep 17 00:00:00 2001 From: Shane Melton Date: Mon, 17 Oct 2022 16:24:46 -0700 Subject: [PATCH] [EC-86] Refactor/rename GroupApiService - Re-name GroupApiService to GroupService as there is no need for a separate Api service (no sync or local data for admin services) - Add GroupView for use in the GroupService instead of raw API models - Update views to use GroupView instead of raw GroupResponse models --- .../manage/collection-add-edit.component.ts | 13 ++++++------ .../manage/group-add-edit.component.ts | 4 ++-- .../organizations/manage/groups.component.ts | 17 ++++++---------- .../manage/user-groups.component.ts | 12 +++++------ .../src/services/jslib-services.module.ts | 8 ++++---- .../group/group-api.service.abstraction.ts | 13 ------------ .../group/group.service.abstraction.ts | 9 +++++++++ libs/common/src/abstractions/group/index.ts | 2 +- libs/common/src/models/view/groupView.ts | 17 ++++++++++++++++ ...{group-api.service.ts => group.service.ts} | 20 +++++++++++-------- 10 files changed, 63 insertions(+), 52 deletions(-) delete mode 100644 libs/common/src/abstractions/group/group-api.service.abstraction.ts create mode 100644 libs/common/src/abstractions/group/group.service.abstraction.ts create mode 100644 libs/common/src/models/view/groupView.ts rename libs/common/src/services/group/{group-api.service.ts => group.service.ts} (62%) diff --git a/apps/web/src/app/organizations/manage/collection-add-edit.component.ts b/apps/web/src/app/organizations/manage/collection-add-edit.component.ts index 11fea20e68c..fae6fca435a 100644 --- a/apps/web/src/app/organizations/manage/collection-add-edit.component.ts +++ b/apps/web/src/app/organizations/manage/collection-add-edit.component.ts @@ -2,7 +2,7 @@ import { Component, EventEmitter, Input, OnInit, Output } from "@angular/core"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { CryptoService } from "@bitwarden/common/abstractions/crypto.service"; -import { GroupApiServiceAbstraction, GroupResponse } from "@bitwarden/common/abstractions/group"; +import { GroupServiceAbstraction } from "@bitwarden/common/abstractions/group"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/abstractions/log.service"; import { OrganizationService } from "@bitwarden/common/abstractions/organization/organization.service.abstraction"; @@ -12,6 +12,7 @@ import { EncString } from "@bitwarden/common/models/domain/encString"; import { SymmetricCryptoKey } from "@bitwarden/common/models/domain/symmetricCryptoKey"; import { CollectionRequest } from "@bitwarden/common/models/request/collectionRequest"; import { SelectionReadOnlyRequest } from "@bitwarden/common/models/request/selectionReadOnlyRequest"; +import { GroupView } from "@bitwarden/common/models/view/groupView"; @Component({ selector: "app-collection-add-edit", @@ -31,7 +32,7 @@ export class CollectionAddEditComponent implements OnInit { title: string; name: string; externalId: string; - groups: GroupResponse[] = []; + groups: GroupView[] = []; formPromise: Promise; deletePromise: Promise; @@ -39,7 +40,7 @@ export class CollectionAddEditComponent implements OnInit { constructor( private apiService: ApiService, - private groupApiService: GroupApiServiceAbstraction, + private groupApiService: GroupServiceAbstraction, private i18nService: I18nService, private platformUtilsService: PlatformUtilsService, private cryptoService: CryptoService, @@ -53,9 +54,7 @@ export class CollectionAddEditComponent implements OnInit { this.editMode = this.loading = this.collectionId != null; if (this.accessGroups) { const groupsResponse = await this.groupApiService.getAll(this.organizationId); - this.groups = groupsResponse.data - .map((r) => r) - .sort(Utils.getSortFunction(this.i18nService, "name")); + this.groups = groupsResponse.sort(Utils.getSortFunction(this.i18nService, "name")); } this.orgKey = await this.cryptoService.getOrgKey(this.organizationId); @@ -98,7 +97,7 @@ export class CollectionAddEditComponent implements OnInit { this.loading = false; } - check(g: GroupResponse, select?: boolean) { + check(g: GroupView, select?: boolean) { if (g.accessAll) { return; } diff --git a/apps/web/src/app/organizations/manage/group-add-edit.component.ts b/apps/web/src/app/organizations/manage/group-add-edit.component.ts index e8c18d81a05..1283d6e7d48 100644 --- a/apps/web/src/app/organizations/manage/group-add-edit.component.ts +++ b/apps/web/src/app/organizations/manage/group-add-edit.component.ts @@ -2,7 +2,7 @@ import { Component, EventEmitter, Input, OnInit, Output } from "@angular/core"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { CollectionService } from "@bitwarden/common/abstractions/collection.service"; -import { GroupApiServiceAbstraction } from "@bitwarden/common/abstractions/group"; +import { GroupServiceAbstraction } from "@bitwarden/common/abstractions/group"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; @@ -35,7 +35,7 @@ export class GroupAddEditComponent implements OnInit { constructor( private apiService: ApiService, - private groupApiService: GroupApiServiceAbstraction, + private groupApiService: GroupServiceAbstraction, private i18nService: I18nService, private collectionService: CollectionService, private platformUtilsService: PlatformUtilsService, diff --git a/apps/web/src/app/organizations/manage/groups.component.ts b/apps/web/src/app/organizations/manage/groups.component.ts index 163c6cc6773..ffb2d221afe 100644 --- a/apps/web/src/app/organizations/manage/groups.component.ts +++ b/apps/web/src/app/organizations/manage/groups.component.ts @@ -17,10 +17,7 @@ import { SearchPipe } from "@bitwarden/angular/pipes/search.pipe"; import { ModalService } from "@bitwarden/angular/services/modal.service"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { CollectionService } from "@bitwarden/common/abstractions/collection.service"; -import { - GroupApiServiceAbstraction, - GroupDetailsResponse, -} from "@bitwarden/common/abstractions/group"; +import { GroupServiceAbstraction } from "@bitwarden/common/abstractions/group"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; @@ -34,6 +31,7 @@ import { } from "@bitwarden/common/models/response/collectionResponse"; import { ListResponse } from "@bitwarden/common/models/response/listResponse"; import { CollectionView } from "@bitwarden/common/models/view/collectionView"; +import { GroupView } from "@bitwarden/common/models/view/groupView"; import { GroupAddEditComponent } from "./group-add-edit.component"; @@ -45,7 +43,7 @@ type GroupDetailsRow = { /** * Details used for displaying group information */ - details: GroupDetailsResponse; + details: GroupView; /** * True if the group is selected in the table @@ -108,7 +106,7 @@ export class GroupsComponent implements OnInit, OnDestroy { constructor( private apiService: ApiService, - private groupApiService: GroupApiServiceAbstraction, + private groupApiService: GroupServiceAbstraction, private route: ActivatedRoute, private i18nService: I18nService, private modalService: ModalService, @@ -131,10 +129,7 @@ export class GroupsComponent implements OnInit, OnDestroy { ), // groups this.refreshGroups$.pipe( - switchMap(() => this.groupApiService.getAll(this.organizationId)), - map((response) => - response.data != null && response.data.length > 0 ? response.data : [] - ) + switchMap(() => this.groupApiService.getAll(this.organizationId)) ), ]) ), @@ -267,7 +262,7 @@ export class GroupsComponent implements OnInit, OnDestroy { this.platformUtilsService.showToast( "success", null, - this.i18nService.t("deletedManyGroups", result.data.length.toString()) + this.i18nService.t("deletedManyGroups", result.length.toString()) ); groupsToDelete.forEach((g) => this.removeGroup(g.details.id)); diff --git a/apps/web/src/app/organizations/manage/user-groups.component.ts b/apps/web/src/app/organizations/manage/user-groups.component.ts index eab60767725..a12aeef78fa 100644 --- a/apps/web/src/app/organizations/manage/user-groups.component.ts +++ b/apps/web/src/app/organizations/manage/user-groups.component.ts @@ -1,12 +1,13 @@ import { Component, EventEmitter, Input, OnInit, Output } from "@angular/core"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; -import { GroupApiServiceAbstraction, GroupResponse } from "@bitwarden/common/abstractions/group"; +import { GroupServiceAbstraction } from "@bitwarden/common/abstractions/group"; import { I18nService } from "@bitwarden/common/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service"; import { Utils } from "@bitwarden/common/misc/utils"; import { OrganizationUserUpdateGroupsRequest } from "@bitwarden/common/models/request/organizationUserUpdateGroupsRequest"; +import { GroupView } from "@bitwarden/common/models/view/groupView"; @Component({ selector: "app-user-groups", @@ -19,20 +20,19 @@ export class UserGroupsComponent implements OnInit { @Output() onSavedUser = new EventEmitter(); loading = true; - groups: GroupResponse[] = []; + groups: GroupView[] = []; formPromise: Promise; constructor( private apiService: ApiService, - private groupApiService: GroupApiServiceAbstraction, + private groupApiService: GroupServiceAbstraction, private i18nService: I18nService, private platformUtilsService: PlatformUtilsService, private logService: LogService ) {} async ngOnInit() { - const groupsResponse = await this.groupApiService.getAll(this.organizationId); - const groups = groupsResponse.data.map((r) => r); + const groups = await this.groupApiService.getAll(this.organizationId); groups.sort(Utils.getSortFunction(this.i18nService, "name")); this.groups = groups; @@ -56,7 +56,7 @@ export class UserGroupsComponent implements OnInit { this.loading = false; } - check(g: GroupResponse, select?: boolean) { + check(g: GroupView, select?: boolean) { (g as any).checked = select == null ? !(g as any).checked : select; if (!(g as any).checked) { (g as any).readOnly = false; diff --git a/libs/angular/src/services/jslib-services.module.ts b/libs/angular/src/services/jslib-services.module.ts index cfc6e46d2f2..c733468f777 100644 --- a/libs/angular/src/services/jslib-services.module.ts +++ b/libs/angular/src/services/jslib-services.module.ts @@ -27,7 +27,7 @@ import { InternalFolderService, } from "@bitwarden/common/abstractions/folder/folder.service.abstraction"; import { FormValidationErrorsService as FormValidationErrorsServiceAbstraction } from "@bitwarden/common/abstractions/formValidationErrors.service"; -import { GroupApiServiceAbstraction } from "@bitwarden/common/abstractions/group"; +import { GroupServiceAbstraction } from "@bitwarden/common/abstractions/group"; import { I18nService as I18nServiceAbstraction } from "@bitwarden/common/abstractions/i18n.service"; import { KeyConnectorService as KeyConnectorServiceAbstraction } from "@bitwarden/common/abstractions/keyConnector.service"; import { LogService } from "@bitwarden/common/abstractions/log.service"; @@ -84,7 +84,7 @@ import { FileUploadService } from "@bitwarden/common/services/fileUpload.service import { FolderApiService } from "@bitwarden/common/services/folder/folder-api.service"; import { FolderService } from "@bitwarden/common/services/folder/folder.service"; import { FormValidationErrorsService } from "@bitwarden/common/services/formValidationErrors.service"; -import { GroupApiService } from "@bitwarden/common/services/group/group-api.service"; +import { GroupService } from "@bitwarden/common/services/group/group.service"; import { KeyConnectorService } from "@bitwarden/common/services/keyConnector.service"; import { NotificationsService } from "@bitwarden/common/services/notifications.service"; import { OrganizationApiService } from "@bitwarden/common/services/organization/organization-api.service"; @@ -564,8 +564,8 @@ import { ValidationService } from "./validation.service"; deps: [EnvironmentServiceAbstraction, AuthServiceAbstraction, LogService], }, { - provide: GroupApiServiceAbstraction, - useClass: GroupApiService, + provide: GroupServiceAbstraction, + useClass: GroupService, deps: [ApiServiceAbstraction], }, ], diff --git a/libs/common/src/abstractions/group/group-api.service.abstraction.ts b/libs/common/src/abstractions/group/group-api.service.abstraction.ts deleted file mode 100644 index da5a6ccfff3..00000000000 --- a/libs/common/src/abstractions/group/group-api.service.abstraction.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { - GroupDetailsResponse, - GroupResponse, -} from "@bitwarden/common/abstractions/group/responses/groupResponse"; -import { ListResponse } from "@bitwarden/common/models/response/listResponse"; - -export class GroupApiServiceAbstraction { - delete: (orgId: string, groupId: string) => Promise; - deleteMany: (orgId: string, groupIds: string[]) => Promise>; - - get: (orgId: string, groupId: string) => Promise; - getAll: (orgId: string) => Promise>; -} diff --git a/libs/common/src/abstractions/group/group.service.abstraction.ts b/libs/common/src/abstractions/group/group.service.abstraction.ts new file mode 100644 index 00000000000..3076220000c --- /dev/null +++ b/libs/common/src/abstractions/group/group.service.abstraction.ts @@ -0,0 +1,9 @@ +import { GroupView } from "@bitwarden/common/models/view/groupView"; + +export class GroupServiceAbstraction { + delete: (orgId: string, groupId: string) => Promise; + deleteMany: (orgId: string, groupIds: string[]) => Promise; + + get: (orgId: string, groupId: string) => Promise; + getAll: (orgId: string) => Promise; +} diff --git a/libs/common/src/abstractions/group/index.ts b/libs/common/src/abstractions/group/index.ts index e4e5a86719d..3750c10fc4f 100644 --- a/libs/common/src/abstractions/group/index.ts +++ b/libs/common/src/abstractions/group/index.ts @@ -1,2 +1,2 @@ -export * from "./group-api.service.abstraction"; +export * from "./group.service.abstraction"; export * from "./responses/groupResponse"; diff --git a/libs/common/src/models/view/groupView.ts b/libs/common/src/models/view/groupView.ts new file mode 100644 index 00000000000..7db478ad13a --- /dev/null +++ b/libs/common/src/models/view/groupView.ts @@ -0,0 +1,17 @@ +import { GroupResponse } from "@bitwarden/common/abstractions/group"; +import { SelectionReadOnlyResponse } from "@bitwarden/common/models/response/selectionReadOnlyResponse"; + +import { View } from "./view"; + +export class GroupView implements View { + id: string; + organizationId: string; + name: string; + accessAll: boolean; + externalId: string; + collections: SelectionReadOnlyResponse[] = []; + + static fromResponse(response: GroupResponse) { + return Object.assign(new GroupView(), response); + } +} diff --git a/libs/common/src/services/group/group-api.service.ts b/libs/common/src/services/group/group.service.ts similarity index 62% rename from libs/common/src/services/group/group-api.service.ts rename to libs/common/src/services/group/group.service.ts index 5493f64f3c9..c249e4b9102 100644 --- a/libs/common/src/services/group/group-api.service.ts +++ b/libs/common/src/services/group/group.service.ts @@ -1,13 +1,14 @@ import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { - GroupApiServiceAbstraction, GroupDetailsResponse, GroupResponse, + GroupServiceAbstraction, } from "@bitwarden/common/abstractions/group"; import { OrganizationGroupBulkRequest } from "@bitwarden/common/models/request/OrganizationGroupBulkRequest"; import { ListResponse } from "@bitwarden/common/models/response/listResponse"; +import { GroupView } from "@bitwarden/common/models/view/groupView"; -export class GroupApiService implements GroupApiServiceAbstraction { +export class GroupService implements GroupServiceAbstraction { constructor(private apiService: ApiService) {} async delete(orgId: string, groupId: string): Promise { @@ -20,7 +21,7 @@ export class GroupApiService implements GroupApiServiceAbstraction { ); } - async deleteMany(orgId: string, groupIds: string[]): Promise> { + async deleteMany(orgId: string, groupIds: string[]): Promise { const request = new OrganizationGroupBulkRequest(groupIds); const r = await this.apiService.send( @@ -30,11 +31,12 @@ export class GroupApiService implements GroupApiServiceAbstraction { true, true ); + const listResponse = new ListResponse(r, GroupResponse); - return new ListResponse(r, GroupResponse); + return listResponse.data?.map((gr) => GroupView.fromResponse(gr)) ?? []; } - async get(orgId: string, groupId: string): Promise { + async get(orgId: string, groupId: string): Promise { const r = await this.apiService.send( "GET", "/organizations/" + orgId + "/groups/" + groupId + "/details", @@ -43,10 +45,10 @@ export class GroupApiService implements GroupApiServiceAbstraction { true ); - return new GroupDetailsResponse(r); + return GroupView.fromResponse(new GroupDetailsResponse(r)); } - async getAll(orgId: string): Promise> { + async getAll(orgId: string): Promise { const r = await this.apiService.send( "GET", "/organizations/" + orgId + "/groups", @@ -55,6 +57,8 @@ export class GroupApiService implements GroupApiServiceAbstraction { true ); - return new ListResponse(r, GroupDetailsResponse); + const listResponse = new ListResponse(r, GroupDetailsResponse); + + return listResponse.data?.map((gr) => GroupView.fromResponse(gr)) ?? []; } }