mirror of
https://github.com/bitwarden/browser
synced 2025-12-19 01:33:33 +00:00
Extract API logic from FolderService to FolderApiService (#3011)
This commit is contained in:
@@ -30,7 +30,6 @@ import { EmergencyAccessInviteRequest } from "../models/request/emergencyAccessI
|
||||
import { EmergencyAccessPasswordRequest } from "../models/request/emergencyAccessPasswordRequest";
|
||||
import { EmergencyAccessUpdateRequest } from "../models/request/emergencyAccessUpdateRequest";
|
||||
import { EventRequest } from "../models/request/eventRequest";
|
||||
import { FolderRequest } from "../models/request/folderRequest";
|
||||
import { GroupRequest } from "../models/request/groupRequest";
|
||||
import { IapCheckRequest } from "../models/request/iapCheckRequest";
|
||||
import { ApiTokenRequest } from "../models/request/identityToken/apiTokenRequest";
|
||||
@@ -126,7 +125,6 @@ import {
|
||||
} from "../models/response/emergencyAccessResponse";
|
||||
import { ErrorResponse } from "../models/response/errorResponse";
|
||||
import { EventResponse } from "../models/response/eventResponse";
|
||||
import { FolderResponse } from "../models/response/folderResponse";
|
||||
import { GroupDetailsResponse, GroupResponse } from "../models/response/groupResponse";
|
||||
import { IdentityCaptchaResponse } from "../models/response/identityCaptchaResponse";
|
||||
import { IdentityTokenResponse } from "../models/response/identityTokenResponse";
|
||||
@@ -487,27 +485,6 @@ export class ApiService implements ApiServiceAbstraction {
|
||||
return new BillingPaymentResponse(r);
|
||||
}
|
||||
|
||||
// Folder APIs
|
||||
|
||||
async getFolder(id: string): Promise<FolderResponse> {
|
||||
const r = await this.send("GET", "/folders/" + id, null, true, true);
|
||||
return new FolderResponse(r);
|
||||
}
|
||||
|
||||
async postFolder(request: FolderRequest): Promise<FolderResponse> {
|
||||
const r = await this.send("POST", "/folders", request, true, true);
|
||||
return new FolderResponse(r);
|
||||
}
|
||||
|
||||
async putFolder(id: string, request: FolderRequest): Promise<FolderResponse> {
|
||||
const r = await this.send("PUT", "/folders/" + id, request, true, true);
|
||||
return new FolderResponse(r);
|
||||
}
|
||||
|
||||
deleteFolder(id: string): Promise<any> {
|
||||
return this.send("DELETE", "/folders/" + id, null, true, false);
|
||||
}
|
||||
|
||||
// Send APIs
|
||||
|
||||
async getSend(id: string): Promise<SendResponse> {
|
||||
@@ -2566,7 +2543,7 @@ export class ApiService implements ApiServiceAbstraction {
|
||||
await this.tokenService.setToken(response.accessToken);
|
||||
}
|
||||
|
||||
private async send(
|
||||
async send(
|
||||
method: "GET" | "POST" | "PUT" | "DELETE",
|
||||
path: string,
|
||||
body: any,
|
||||
|
||||
@@ -8,7 +8,7 @@ import {
|
||||
ExportFormat,
|
||||
ExportService as ExportServiceAbstraction,
|
||||
} from "../abstractions/export.service";
|
||||
import { FolderService } from "../abstractions/folder.service";
|
||||
import { FolderService } from "../abstractions/folder/folder.service.abstraction";
|
||||
import { CipherType } from "../enums/cipherType";
|
||||
import { DEFAULT_KDF_ITERATIONS, KdfType } from "../enums/kdfType";
|
||||
import { Utils } from "../misc/utils";
|
||||
|
||||
50
libs/common/src/services/folder/folder-api.service.ts
Normal file
50
libs/common/src/services/folder/folder-api.service.ts
Normal file
@@ -0,0 +1,50 @@
|
||||
import { ApiService } from "@bitwarden/common/abstractions/api.service";
|
||||
import { FolderApiServiceAbstraction } from "@bitwarden/common/abstractions/folder/folder-api.service.abstraction";
|
||||
import { InternalFolderService } from "@bitwarden/common/abstractions/folder/folder.service.abstraction";
|
||||
import { FolderData } from "@bitwarden/common/models/data/folderData";
|
||||
import { Folder } from "@bitwarden/common/models/domain/folder";
|
||||
import { FolderRequest } from "@bitwarden/common/models/request/folderRequest";
|
||||
import { FolderResponse } from "@bitwarden/common/models/response/folderResponse";
|
||||
|
||||
export class FolderApiService implements FolderApiServiceAbstraction {
|
||||
constructor(private folderService: InternalFolderService, private apiService: ApiService) {}
|
||||
|
||||
async save(folder: Folder): Promise<any> {
|
||||
const request = new FolderRequest(folder);
|
||||
|
||||
let response: FolderResponse;
|
||||
if (folder.id == null) {
|
||||
response = await this.postFolder(request);
|
||||
folder.id = response.id;
|
||||
} else {
|
||||
response = await this.putFolder(folder.id, request);
|
||||
}
|
||||
|
||||
const data = new FolderData(response);
|
||||
await this.folderService.upsert(data);
|
||||
}
|
||||
|
||||
async delete(id: string): Promise<any> {
|
||||
await this.deleteFolder(id);
|
||||
await this.folderService.delete(id);
|
||||
}
|
||||
|
||||
async get(id: string): Promise<FolderResponse> {
|
||||
const r = await this.apiService.send("GET", "/folders/" + id, null, true, true);
|
||||
return new FolderResponse(r);
|
||||
}
|
||||
|
||||
private async postFolder(request: FolderRequest): Promise<FolderResponse> {
|
||||
const r = await this.apiService.send("POST", "/folders", request, true, true);
|
||||
return new FolderResponse(r);
|
||||
}
|
||||
|
||||
async putFolder(id: string, request: FolderRequest): Promise<FolderResponse> {
|
||||
const r = await this.apiService.send("PUT", "/folders/" + id, request, true, true);
|
||||
return new FolderResponse(r);
|
||||
}
|
||||
|
||||
private deleteFolder(id: string): Promise<any> {
|
||||
return this.apiService.send("DELETE", "/folders/" + id, null, true, false);
|
||||
}
|
||||
}
|
||||
@@ -1,26 +1,22 @@
|
||||
import { ApiService } from "../abstractions/api.service";
|
||||
import { CipherService } from "../abstractions/cipher.service";
|
||||
import { CryptoService } from "../abstractions/crypto.service";
|
||||
import { FolderService as FolderServiceAbstraction } from "../abstractions/folder.service";
|
||||
import { I18nService } from "../abstractions/i18n.service";
|
||||
import { StateService } from "../abstractions/state.service";
|
||||
import { ServiceUtils } from "../misc/serviceUtils";
|
||||
import { Utils } from "../misc/utils";
|
||||
import { CipherData } from "../models/data/cipherData";
|
||||
import { FolderData } from "../models/data/folderData";
|
||||
import { Folder } from "../models/domain/folder";
|
||||
import { SymmetricCryptoKey } from "../models/domain/symmetricCryptoKey";
|
||||
import { TreeNode } from "../models/domain/treeNode";
|
||||
import { FolderRequest } from "../models/request/folderRequest";
|
||||
import { FolderResponse } from "../models/response/folderResponse";
|
||||
import { FolderView } from "../models/view/folderView";
|
||||
import { CipherService } from "../../abstractions/cipher.service";
|
||||
import { CryptoService } from "../../abstractions/crypto.service";
|
||||
import { FolderService as FolderServiceAbstraction } from "../../abstractions/folder/folder.service.abstraction";
|
||||
import { I18nService } from "../../abstractions/i18n.service";
|
||||
import { StateService } from "../../abstractions/state.service";
|
||||
import { ServiceUtils } from "../../misc/serviceUtils";
|
||||
import { Utils } from "../../misc/utils";
|
||||
import { CipherData } from "../../models/data/cipherData";
|
||||
import { FolderData } from "../../models/data/folderData";
|
||||
import { Folder } from "../../models/domain/folder";
|
||||
import { SymmetricCryptoKey } from "../../models/domain/symmetricCryptoKey";
|
||||
import { TreeNode } from "../../models/domain/treeNode";
|
||||
import { FolderView } from "../../models/view/folderView";
|
||||
|
||||
const NestingDelimiter = "/";
|
||||
|
||||
export class FolderService implements FolderServiceAbstraction {
|
||||
constructor(
|
||||
private cryptoService: CryptoService,
|
||||
private apiService: ApiService,
|
||||
private i18nService: I18nService,
|
||||
private cipherService: CipherService,
|
||||
private stateService: StateService
|
||||
@@ -106,21 +102,6 @@ export class FolderService implements FolderServiceAbstraction {
|
||||
return ServiceUtils.getTreeNodeObject(folders, id) as TreeNode<FolderView>;
|
||||
}
|
||||
|
||||
async saveWithServer(folder: Folder): Promise<any> {
|
||||
const request = new FolderRequest(folder);
|
||||
|
||||
let response: FolderResponse;
|
||||
if (folder.id == null) {
|
||||
response = await this.apiService.postFolder(request);
|
||||
folder.id = response.id;
|
||||
} else {
|
||||
response = await this.apiService.putFolder(folder.id, request);
|
||||
}
|
||||
|
||||
const data = new FolderData(response);
|
||||
await this.upsert(data);
|
||||
}
|
||||
|
||||
async upsert(folder: FolderData | FolderData[]): Promise<any> {
|
||||
let folders = await this.stateService.getEncryptedFolders();
|
||||
if (folders == null) {
|
||||
@@ -185,9 +166,4 @@ export class FolderService implements FolderServiceAbstraction {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async deleteWithServer(id: string): Promise<any> {
|
||||
await this.apiService.deleteFolder(id);
|
||||
await this.delete(id);
|
||||
}
|
||||
}
|
||||
@@ -2,7 +2,7 @@ import { ApiService } from "../abstractions/api.service";
|
||||
import { CipherService } from "../abstractions/cipher.service";
|
||||
import { CollectionService } from "../abstractions/collection.service";
|
||||
import { CryptoService } from "../abstractions/crypto.service";
|
||||
import { FolderService } from "../abstractions/folder.service";
|
||||
import { FolderService } from "../abstractions/folder/folder.service.abstraction";
|
||||
import { I18nService } from "../abstractions/i18n.service";
|
||||
import { ImportService as ImportServiceAbstraction } from "../abstractions/import.service";
|
||||
import { PlatformUtilsService } from "../abstractions/platformUtils.service";
|
||||
|
||||
@@ -2,7 +2,8 @@ import { ApiService } from "../abstractions/api.service";
|
||||
import { CipherService } from "../abstractions/cipher.service";
|
||||
import { CollectionService } from "../abstractions/collection.service";
|
||||
import { CryptoService } from "../abstractions/crypto.service";
|
||||
import { FolderService } from "../abstractions/folder.service";
|
||||
import { FolderApiServiceAbstraction } from "../abstractions/folder/folder-api.service.abstraction";
|
||||
import { InternalFolderService } from "../abstractions/folder/folder.service.abstraction";
|
||||
import { KeyConnectorService } from "../abstractions/keyConnector.service";
|
||||
import { LogService } from "../abstractions/log.service";
|
||||
import { MessagingService } from "../abstractions/messaging.service";
|
||||
@@ -40,7 +41,7 @@ export class SyncService implements SyncServiceAbstraction {
|
||||
constructor(
|
||||
private apiService: ApiService,
|
||||
private settingsService: SettingsService,
|
||||
private folderService: FolderService,
|
||||
private folderService: InternalFolderService,
|
||||
private cipherService: CipherService,
|
||||
private cryptoService: CryptoService,
|
||||
private collectionService: CollectionService,
|
||||
@@ -52,6 +53,7 @@ export class SyncService implements SyncServiceAbstraction {
|
||||
private stateService: StateService,
|
||||
private organizationService: OrganizationService,
|
||||
private providerService: ProviderService,
|
||||
private folderApiService: FolderApiServiceAbstraction,
|
||||
private logoutCallback: (expired: boolean) => Promise<void>
|
||||
) {}
|
||||
|
||||
@@ -127,7 +129,7 @@ export class SyncService implements SyncServiceAbstraction {
|
||||
(!isEdit && localFolder == null) ||
|
||||
(isEdit && localFolder != null && localFolder.revisionDate < notification.revisionDate)
|
||||
) {
|
||||
const remoteFolder = await this.apiService.getFolder(notification.id);
|
||||
const remoteFolder = await this.folderApiService.get(notification.id);
|
||||
if (remoteFolder != null) {
|
||||
await this.folderService.upsert(new FolderData(remoteFolder));
|
||||
this.messagingService.send("syncedUpsertedFolder", { folderId: notification.id });
|
||||
|
||||
@@ -2,7 +2,7 @@ import { AuthService } from "../abstractions/auth.service";
|
||||
import { CipherService } from "../abstractions/cipher.service";
|
||||
import { CollectionService } from "../abstractions/collection.service";
|
||||
import { CryptoService } from "../abstractions/crypto.service";
|
||||
import { FolderService } from "../abstractions/folder.service";
|
||||
import { FolderService } from "../abstractions/folder/folder.service.abstraction";
|
||||
import { KeyConnectorService } from "../abstractions/keyConnector.service";
|
||||
import { MessagingService } from "../abstractions/messaging.service";
|
||||
import { PlatformUtilsService } from "../abstractions/platformUtils.service";
|
||||
|
||||
Reference in New Issue
Block a user