bulk move/delete apis
This commit is contained in:
parent
1021f23277
commit
7a5a4e654a
|
@ -1,5 +1,7 @@
|
||||||
import { EnvironmentUrls } from '../models/domain/environmentUrls';
|
import { EnvironmentUrls } from '../models/domain/environmentUrls';
|
||||||
|
|
||||||
|
import { CipherBulkDeleteRequest } from '../models/request/cipherBulkDeleteRequest';
|
||||||
|
import { CipherBulkMoveRequest } from '../models/request/cipherBulkMoveRequest';
|
||||||
import { CipherCollectionsRequest } from '../models/request/cipherCollectionsRequest';
|
import { CipherCollectionsRequest } from '../models/request/cipherCollectionsRequest';
|
||||||
import { CipherRequest } from '../models/request/cipherRequest';
|
import { CipherRequest } from '../models/request/cipherRequest';
|
||||||
import { CipherShareRequest } from '../models/request/cipherShareRequest';
|
import { CipherShareRequest } from '../models/request/cipherShareRequest';
|
||||||
|
@ -39,6 +41,8 @@ export abstract class ApiService {
|
||||||
postCipher: (request: CipherRequest) => Promise<CipherResponse>;
|
postCipher: (request: CipherRequest) => Promise<CipherResponse>;
|
||||||
putCipher: (id: string, request: CipherRequest) => Promise<CipherResponse>;
|
putCipher: (id: string, request: CipherRequest) => Promise<CipherResponse>;
|
||||||
deleteCipher: (id: string) => Promise<any>;
|
deleteCipher: (id: string) => Promise<any>;
|
||||||
|
deleteManyCiphers: (request: CipherBulkDeleteRequest) => Promise<any>;
|
||||||
|
putMoveCiphers: (request: CipherBulkMoveRequest) => Promise<any>;
|
||||||
putShareCipher: (id: string, request: CipherShareRequest) => Promise<any>;
|
putShareCipher: (id: string, request: CipherShareRequest) => Promise<any>;
|
||||||
putCipherCollections: (id: string, request: CipherCollectionsRequest) => Promise<any>;
|
putCipherCollections: (id: string, request: CipherCollectionsRequest) => Promise<any>;
|
||||||
postCipherAttachment: (id: string, data: FormData) => Promise<CipherResponse>;
|
postCipherAttachment: (id: string, data: FormData) => Promise<CipherResponse>;
|
||||||
|
|
|
@ -35,8 +35,10 @@ export abstract class CipherService {
|
||||||
upsert: (cipher: CipherData | CipherData[]) => Promise<any>;
|
upsert: (cipher: CipherData | CipherData[]) => Promise<any>;
|
||||||
replace: (ciphers: { [id: string]: CipherData; }) => Promise<any>;
|
replace: (ciphers: { [id: string]: CipherData; }) => Promise<any>;
|
||||||
clear: (userId: string) => Promise<any>;
|
clear: (userId: string) => Promise<any>;
|
||||||
|
moveManyWithServer: (ids: string[], folderId: string) => Promise<any>;
|
||||||
delete: (id: string | string[]) => Promise<any>;
|
delete: (id: string | string[]) => Promise<any>;
|
||||||
deleteWithServer: (id: string) => Promise<any>;
|
deleteWithServer: (id: string) => Promise<any>;
|
||||||
|
deleteManyWithServer: (ids: string[]) => Promise<any>;
|
||||||
deleteAttachment: (id: string, attachmentId: string) => Promise<void>;
|
deleteAttachment: (id: string, attachmentId: string) => Promise<void>;
|
||||||
deleteAttachmentWithServer: (id: string, attachmentId: string) => Promise<void>;
|
deleteAttachmentWithServer: (id: string, attachmentId: string) => Promise<void>;
|
||||||
sortCiphersByLastUsed: (a: any, b: any) => number;
|
sortCiphersByLastUsed: (a: any, b: any) => number;
|
||||||
|
|
|
@ -2,6 +2,6 @@ export class CipherBulkDeleteRequest {
|
||||||
ids: string[];
|
ids: string[];
|
||||||
|
|
||||||
constructor(ids: string[]) {
|
constructor(ids: string[]) {
|
||||||
this.ids = ids;
|
this.ids = ids == null ? [] : ids;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,7 @@ export class CipherBulkMoveRequest {
|
||||||
folderId: string;
|
folderId: string;
|
||||||
|
|
||||||
constructor(ids: string[], folderId: string) {
|
constructor(ids: string[], folderId: string) {
|
||||||
this.ids = ids;
|
this.ids = ids == null ? [] : ids;
|
||||||
this.folderId = folderId;
|
this.folderId = folderId;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,8 @@ import { TokenService } from '../abstractions/token.service';
|
||||||
|
|
||||||
import { EnvironmentUrls } from '../models/domain/environmentUrls';
|
import { EnvironmentUrls } from '../models/domain/environmentUrls';
|
||||||
|
|
||||||
|
import { CipherBulkDeleteRequest } from '../models/request/cipherBulkDeleteRequest';
|
||||||
|
import { CipherBulkMoveRequest } from '../models/request/cipherBulkMoveRequest';
|
||||||
import { CipherCollectionsRequest } from '../models/request/cipherCollectionsRequest';
|
import { CipherCollectionsRequest } from '../models/request/cipherCollectionsRequest';
|
||||||
import { CipherRequest } from '../models/request/cipherRequest';
|
import { CipherRequest } from '../models/request/cipherRequest';
|
||||||
import { CipherShareRequest } from '../models/request/cipherShareRequest';
|
import { CipherShareRequest } from '../models/request/cipherShareRequest';
|
||||||
|
@ -354,6 +356,48 @@ export class ApiService implements ApiServiceAbstraction {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async deleteManyCiphers(request: CipherBulkDeleteRequest): Promise<any> {
|
||||||
|
const authHeader = await this.handleTokenState();
|
||||||
|
const response = await fetch(new Request(this.baseUrl + '/ciphers', {
|
||||||
|
body: JSON.stringify(request),
|
||||||
|
cache: 'no-cache',
|
||||||
|
credentials: this.getCredentials(),
|
||||||
|
headers: new Headers({
|
||||||
|
'Accept': 'application/json',
|
||||||
|
'Authorization': authHeader,
|
||||||
|
'Content-Type': 'application/json; charset=utf-8',
|
||||||
|
'Device-Type': this.deviceType,
|
||||||
|
}),
|
||||||
|
method: 'DELETE',
|
||||||
|
}));
|
||||||
|
|
||||||
|
if (response.status !== 200) {
|
||||||
|
const error = await this.handleError(response, false);
|
||||||
|
return Promise.reject(error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async putMoveCiphers(request: CipherBulkMoveRequest): Promise<any> {
|
||||||
|
const authHeader = await this.handleTokenState();
|
||||||
|
const response = await fetch(new Request(this.baseUrl + '/ciphers/move', {
|
||||||
|
body: JSON.stringify(request),
|
||||||
|
cache: 'no-cache',
|
||||||
|
credentials: this.getCredentials(),
|
||||||
|
headers: new Headers({
|
||||||
|
'Accept': 'application/json',
|
||||||
|
'Authorization': authHeader,
|
||||||
|
'Content-Type': 'application/json; charset=utf-8',
|
||||||
|
'Device-Type': this.deviceType,
|
||||||
|
}),
|
||||||
|
method: 'PUT',
|
||||||
|
}));
|
||||||
|
|
||||||
|
if (response.status !== 200) {
|
||||||
|
const error = await this.handleError(response, false);
|
||||||
|
return Promise.reject(error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async putShareCipher(id: string, request: CipherShareRequest): Promise<any> {
|
async putShareCipher(id: string, request: CipherShareRequest): Promise<any> {
|
||||||
const authHeader = await this.handleTokenState();
|
const authHeader = await this.handleTokenState();
|
||||||
const response = await fetch(new Request(this.baseUrl + '/ciphers/' + id + '/share', {
|
const response = await fetch(new Request(this.baseUrl + '/ciphers/' + id + '/share', {
|
||||||
|
|
|
@ -15,8 +15,11 @@ import { LoginUri } from '../models/domain/loginUri';
|
||||||
import { SecureNote } from '../models/domain/secureNote';
|
import { SecureNote } from '../models/domain/secureNote';
|
||||||
import { SymmetricCryptoKey } from '../models/domain/symmetricCryptoKey';
|
import { SymmetricCryptoKey } from '../models/domain/symmetricCryptoKey';
|
||||||
|
|
||||||
|
import { CipherBulkDeleteRequest } from '../models/request/cipherBulkDeleteRequest';
|
||||||
|
import { CipherBulkMoveRequest } from '../models/request/cipherBulkMoveRequest';
|
||||||
import { CipherCollectionsRequest } from '../models/request/cipherCollectionsRequest';
|
import { CipherCollectionsRequest } from '../models/request/cipherCollectionsRequest';
|
||||||
import { CipherRequest } from '../models/request/cipherRequest';
|
import { CipherRequest } from '../models/request/cipherRequest';
|
||||||
|
import { CipherShareRequest } from '../models/request/cipherShareRequest';
|
||||||
|
|
||||||
import { CipherResponse } from '../models/response/cipherResponse';
|
import { CipherResponse } from '../models/response/cipherResponse';
|
||||||
import { ErrorResponse } from '../models/response/errorResponse';
|
import { ErrorResponse } from '../models/response/errorResponse';
|
||||||
|
@ -41,7 +44,6 @@ import { StorageService } from '../abstractions/storage.service';
|
||||||
import { UserService } from '../abstractions/user.service';
|
import { UserService } from '../abstractions/user.service';
|
||||||
|
|
||||||
import { Utils } from '../misc/utils';
|
import { Utils } from '../misc/utils';
|
||||||
import { CipherShareRequest } from '../models/request/cipherShareRequest';
|
|
||||||
|
|
||||||
const Keys = {
|
const Keys = {
|
||||||
ciphersPrefix: 'ciphers_',
|
ciphersPrefix: 'ciphers_',
|
||||||
|
@ -492,6 +494,26 @@ export class CipherService implements CipherServiceAbstraction {
|
||||||
this.decryptedCipherCache = null;
|
this.decryptedCipherCache = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async moveManyWithServer(ids: string[], folderId: string): Promise<any> {
|
||||||
|
await this.apiService.putMoveCiphers(new CipherBulkMoveRequest(ids, folderId));
|
||||||
|
|
||||||
|
const userId = await this.userService.getUserId();
|
||||||
|
let ciphers = await this.storageService.get<{ [id: string]: CipherData; }>(
|
||||||
|
Keys.ciphersPrefix + userId);
|
||||||
|
if (ciphers == null) {
|
||||||
|
ciphers = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
ids.forEach((id) => {
|
||||||
|
if (ciphers.hasOwnProperty(id)) {
|
||||||
|
ciphers[id].folderId = folderId;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
await this.storageService.save(Keys.ciphersPrefix + userId, ciphers);
|
||||||
|
this.decryptedCipherCache = null;
|
||||||
|
}
|
||||||
|
|
||||||
async delete(id: string | string[]): Promise<any> {
|
async delete(id: string | string[]): Promise<any> {
|
||||||
const userId = await this.userService.getUserId();
|
const userId = await this.userService.getUserId();
|
||||||
const ciphers = await this.storageService.get<{ [id: string]: CipherData; }>(
|
const ciphers = await this.storageService.get<{ [id: string]: CipherData; }>(
|
||||||
|
@ -518,6 +540,11 @@ export class CipherService implements CipherServiceAbstraction {
|
||||||
await this.delete(id);
|
await this.delete(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async deleteManyWithServer(ids: string[]): Promise<any> {
|
||||||
|
await this.apiService.deleteManyCiphers(new CipherBulkDeleteRequest(ids));
|
||||||
|
await this.delete(ids);
|
||||||
|
}
|
||||||
|
|
||||||
async deleteAttachment(id: string, attachmentId: string): Promise<void> {
|
async deleteAttachment(id: string, attachmentId: string): Promise<void> {
|
||||||
const userId = await this.userService.getUserId();
|
const userId = await this.userService.getUserId();
|
||||||
const ciphers = await this.storageService.get<{ [id: string]: CipherData; }>(
|
const ciphers = await this.storageService.get<{ [id: string]: CipherData; }>(
|
||||||
|
|
Loading…
Reference in New Issue