mirror of
https://github.com/bitwarden/browser
synced 2026-01-21 11:53:34 +00:00
[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
This commit is contained in:
@@ -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<any>;
|
||||
deletePromise: Promise<any>;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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<any>;
|
||||
|
||||
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;
|
||||
|
||||
@@ -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],
|
||||
},
|
||||
],
|
||||
|
||||
@@ -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<void>;
|
||||
deleteMany: (orgId: string, groupIds: string[]) => Promise<ListResponse<GroupResponse>>;
|
||||
|
||||
get: (orgId: string, groupId: string) => Promise<GroupDetailsResponse>;
|
||||
getAll: (orgId: string) => Promise<ListResponse<GroupDetailsResponse>>;
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
import { GroupView } from "@bitwarden/common/models/view/groupView";
|
||||
|
||||
export class GroupServiceAbstraction {
|
||||
delete: (orgId: string, groupId: string) => Promise<void>;
|
||||
deleteMany: (orgId: string, groupIds: string[]) => Promise<GroupView[]>;
|
||||
|
||||
get: (orgId: string, groupId: string) => Promise<GroupView>;
|
||||
getAll: (orgId: string) => Promise<GroupView[]>;
|
||||
}
|
||||
@@ -1,2 +1,2 @@
|
||||
export * from "./group-api.service.abstraction";
|
||||
export * from "./group.service.abstraction";
|
||||
export * from "./responses/groupResponse";
|
||||
|
||||
17
libs/common/src/models/view/groupView.ts
Normal file
17
libs/common/src/models/view/groupView.ts
Normal file
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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<void> {
|
||||
@@ -20,7 +21,7 @@ export class GroupApiService implements GroupApiServiceAbstraction {
|
||||
);
|
||||
}
|
||||
|
||||
async deleteMany(orgId: string, groupIds: string[]): Promise<ListResponse<GroupResponse>> {
|
||||
async deleteMany(orgId: string, groupIds: string[]): Promise<GroupView[]> {
|
||||
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<GroupDetailsResponse> {
|
||||
async get(orgId: string, groupId: string): Promise<GroupView> {
|
||||
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<ListResponse<GroupDetailsResponse>> {
|
||||
async getAll(orgId: string): Promise<GroupView[]> {
|
||||
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)) ?? [];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user