1
0
mirror of https://github.com/bitwarden/browser synced 2025-12-15 15:53:27 +00:00

[AC-1344] Provider users unable to bulk restore vault items for client organizations (#5259)

* [AC-1344] Simplified DeleteMany and SoftDeleteMany request creation

* [AC-1344] Added method putRestoreManyCiphersAdmin to apiService

* [AC-1344] Added method restoreManyWithServer to cipherService

* [AC-1344] Rewrote if statements and changed the method return type
This commit is contained in:
Rui Tomé
2023-08-02 16:22:28 +01:00
committed by GitHub
parent fb74c2d6ee
commit 72a6fa1f7d
7 changed files with 54 additions and 14 deletions

View File

@@ -243,6 +243,9 @@ export abstract class ApiService {
putRestoreManyCiphers: (
request: CipherBulkRestoreRequest
) => Promise<ListResponse<CipherResponse>>;
putRestoreManyCiphersAdmin: (
request: CipherBulkRestoreRequest
) => Promise<ListResponse<CipherResponse>>;
/**
* @deprecated Mar 25 2021: This method has been deprecated in favor of direct uploads.

View File

@@ -133,6 +133,7 @@ import { Utils } from "../platform/misc/utils";
import { AttachmentRequest } from "../vault/models/request/attachment.request";
import { CipherBulkDeleteRequest } from "../vault/models/request/cipher-bulk-delete.request";
import { CipherBulkMoveRequest } from "../vault/models/request/cipher-bulk-move.request";
import { CipherBulkRestoreRequest } from "../vault/models/request/cipher-bulk-restore.request";
import { CipherBulkShareRequest } from "../vault/models/request/cipher-bulk-share.request";
import { CipherCollectionsRequest } from "../vault/models/request/cipher-collections.request";
import { CipherCreateRequest } from "../vault/models/request/cipher-create.request";
@@ -614,12 +615,19 @@ export class ApiService implements ApiServiceAbstraction {
}
async putRestoreManyCiphers(
request: CipherBulkDeleteRequest
request: CipherBulkRestoreRequest
): Promise<ListResponse<CipherResponse>> {
const r = await this.send("PUT", "/ciphers/restore", request, true, true);
return new ListResponse<CipherResponse>(r, CipherResponse);
}
async putRestoreManyCiphersAdmin(
request: CipherBulkRestoreRequest
): Promise<ListResponse<CipherResponse>> {
const r = await this.send("PUT", "/ciphers/restore-admin", request, true, true);
return new ListResponse<CipherResponse>(r, CipherResponse);
}
// Attachments APIs
async getAttachmentData(

View File

@@ -76,5 +76,9 @@ export abstract class CipherService {
cipher: { id: string; revisionDate: string } | { id: string; revisionDate: string }[]
) => Promise<any>;
restoreWithServer: (id: string, asAdmin?: boolean) => Promise<any>;
restoreManyWithServer: (ids: string[]) => Promise<any>;
restoreManyWithServer: (
ids: string[],
organizationId?: string,
asAdmin?: boolean
) => Promise<void>;
}

View File

@@ -1,7 +1,9 @@
export class CipherBulkRestoreRequest {
ids: string[];
organizationId: string;
constructor(ids: string[]) {
constructor(ids: string[], organizationId?: string) {
this.ids = ids == null ? [] : ids;
this.organizationId = organizationId;
}
}

View File

@@ -740,10 +740,11 @@ export class CipherService implements CipherServiceAbstraction {
}
async deleteManyWithServer(ids: string[], asAdmin = false): Promise<any> {
const request = new CipherBulkDeleteRequest(ids);
if (asAdmin) {
await this.apiService.deleteManyCiphersAdmin(new CipherBulkDeleteRequest(ids));
await this.apiService.deleteManyCiphersAdmin(request);
} else {
await this.apiService.deleteManyCiphers(new CipherBulkDeleteRequest(ids));
await this.apiService.deleteManyCiphers(request);
}
await this.delete(ids);
}
@@ -879,10 +880,11 @@ export class CipherService implements CipherServiceAbstraction {
}
async softDeleteManyWithServer(ids: string[], asAdmin = false): Promise<any> {
const request = new CipherBulkDeleteRequest(ids);
if (asAdmin) {
await this.apiService.putDeleteManyCiphersAdmin(new CipherBulkDeleteRequest(ids));
await this.apiService.putDeleteManyCiphersAdmin(request);
} else {
await this.apiService.putDeleteManyCiphers(new CipherBulkDeleteRequest(ids));
await this.apiService.putDeleteManyCiphers(request);
}
await this.softDelete(ids);
@@ -915,14 +917,30 @@ export class CipherService implements CipherServiceAbstraction {
}
async restoreWithServer(id: string, asAdmin = false): Promise<any> {
const response = asAdmin
? await this.apiService.putRestoreCipherAdmin(id)
: await this.apiService.putRestoreCipher(id);
let response;
if (asAdmin) {
response = await this.apiService.putRestoreCipherAdmin(id);
} else {
response = await this.apiService.putRestoreCipher(id);
}
await this.restore({ id: id, revisionDate: response.revisionDate });
}
async restoreManyWithServer(ids: string[]): Promise<any> {
const response = await this.apiService.putRestoreManyCiphers(new CipherBulkRestoreRequest(ids));
async restoreManyWithServer(
ids: string[],
organizationId: string = null,
asAdmin = false
): Promise<void> {
let response;
if (asAdmin) {
const request = new CipherBulkRestoreRequest(ids, organizationId);
response = await this.apiService.putRestoreManyCiphersAdmin(request);
} else {
const request = new CipherBulkRestoreRequest(ids);
response = await this.apiService.putRestoreManyCiphers(request);
}
const restores: { id: string; revisionDate: string }[] = [];
for (const cipher of response.data) {
restores.push({ id: cipher.id, revisionDate: cipher.revisionDate });