diff --git a/src/abstractions/api.service.ts b/src/abstractions/api.service.ts index 955041f281..ffb676102f 100644 --- a/src/abstractions/api.service.ts +++ b/src/abstractions/api.service.ts @@ -206,9 +206,9 @@ export abstract class ApiService { putDeleteCipherAdmin: (id: string) => Promise; putDeleteManyCiphers: (request: CipherBulkDeleteRequest) => Promise; putDeleteManyCiphersAdmin: (request: CipherBulkDeleteRequest) => Promise; - putRestoreCipher: (id: string) => Promise; - putRestoreCipherAdmin: (id: string) => Promise; - putRestoreManyCiphers: (request: CipherBulkRestoreRequest) => Promise; + putRestoreCipher: (id: string) => Promise; + putRestoreCipherAdmin: (id: string) => Promise; + putRestoreManyCiphers: (request: CipherBulkRestoreRequest) => Promise>; postCipherAttachment: (id: string, data: FormData) => Promise; postCipherAttachmentAdmin: (id: string, data: FormData) => Promise; diff --git a/src/abstractions/cipher.service.ts b/src/abstractions/cipher.service.ts index cab7a972b3..0fbd115ded 100644 --- a/src/abstractions/cipher.service.ts +++ b/src/abstractions/cipher.service.ts @@ -53,7 +53,7 @@ export abstract class CipherService { softDelete: (id: string | string[]) => Promise; softDeleteWithServer: (id: string) => Promise; softDeleteManyWithServer: (ids: string[]) => Promise; - restore: (id: string | string[]) => Promise; + restore: (cipher: { id: string, revisionDate: string; } | { id: string, revisionDate: string; }[]) => Promise; restoreWithServer: (id: string) => Promise; restoreManyWithServer: (ids: string[]) => Promise; } diff --git a/src/services/api.service.ts b/src/services/api.service.ts index e396839108..ab0c1c54eb 100644 --- a/src/services/api.service.ts +++ b/src/services/api.service.ts @@ -556,16 +556,19 @@ export class ApiService implements ApiServiceAbstraction { return this.send('PUT', '/ciphers/delete-admin', request, true, false); } - putRestoreCipher(id: string): Promise { - return this.send('PUT', '/ciphers/' + id + '/restore', null, true, false); + async putRestoreCipher(id: string): Promise { + const r = await this.send('PUT', '/ciphers/' + id + '/restore', null, true, true); + return new CipherResponse(r); } - putRestoreCipherAdmin(id: string): Promise { - return this.send('PUT', '/ciphers/' + id + '/restore-admin', null, true, false); + async putRestoreCipherAdmin(id: string): Promise { + const r = await this.send('PUT', '/ciphers/' + id + '/restore-admin', null, true, true); + return new CipherResponse(r); } - putRestoreManyCiphers(request: CipherBulkDeleteRequest): Promise { - return this.send('PUT', '/ciphers/restore', request, true, false); + async putRestoreManyCiphers(request: CipherBulkDeleteRequest): Promise> { + const r = await this.send('PUT', '/ciphers/restore', request, true, true); + return new ListResponse(r, CipherResponse); } // Attachments APIs diff --git a/src/services/cipher.service.ts b/src/services/cipher.service.ts index c45965367d..539321f5db 100644 --- a/src/services/cipher.service.ts +++ b/src/services/cipher.service.ts @@ -876,7 +876,7 @@ export class CipherService implements CipherServiceAbstraction { await this.softDelete(ids); } - async restore(id: string | string[]): Promise { + async restore(cipher: { id: string, revisionDate: string; } | { id: string, revisionDate: string; }[]) { const userId = await this.userService.getUserId(); const ciphers = await this.storageService.get<{ [id: string]: CipherData; }>( Keys.ciphersPrefix + userId); @@ -884,17 +884,19 @@ export class CipherService implements CipherServiceAbstraction { return; } - const clearDeletedDate = (cipherId: string) => { - if (ciphers[cipherId] == null) { + const clearDeletedDate = (c: { id: string, revisionDate: string; }) => { + if (ciphers[c.id] == null) { return; } - ciphers[cipherId].deletedDate = null; + ciphers[c.id].deletedDate = null; + ciphers[c.id].revisionDate = c.revisionDate; }; - if (typeof id === 'string') { - clearDeletedDate(id); + + if (cipher.constructor.name === 'Array') { + (cipher as { id: string, revisionDate: string; }[]).forEach(clearDeletedDate); } else { - (id as string[]).forEach(clearDeletedDate); + clearDeletedDate(cipher as { id: string, revisionDate: string; }); } await this.storageService.save(Keys.ciphersPrefix + userId, ciphers); @@ -902,13 +904,17 @@ export class CipherService implements CipherServiceAbstraction { } async restoreWithServer(id: string): Promise { - await this.apiService.putRestoreCipher(id); - await this.restore(id); + const response = await this.apiService.putRestoreCipher(id); + await this.restore({ id: id, revisionDate: response.revisionDate }); } async restoreManyWithServer(ids: string[]): Promise { - await this.apiService.putRestoreManyCiphers(new CipherBulkRestoreRequest(ids)); - await this.restore(ids); + const response = await this.apiService.putRestoreManyCiphers(new CipherBulkRestoreRequest(ids)); + const restores: { id: string, revisionDate: string; }[] = []; + for (const cipher of response.data) { + restores.push({ id: cipher.id, revisionDate: cipher.revisionDate }); + } + await this.restore(restores); } // Helpers