1
0
mirror of https://github.com/bitwarden/browser synced 2025-12-10 21:33:27 +00:00

[AC-2568] Split billing history calls to separately call for invoices and transactions. Added paging buttons (#10697)

* Split billing history calls to separately call for invoices and transactions. Added paging button

* Added missing button types
This commit is contained in:
Conner Turnbull
2024-09-09 09:39:02 -04:00
committed by GitHub
parent 9e45e32c7d
commit 60e9969017
11 changed files with 202 additions and 49 deletions

View File

@@ -125,9 +125,13 @@ import {
BillingApiServiceAbstraction,
OrganizationBillingServiceAbstraction,
} from "@bitwarden/common/billing/abstractions";
import { AccountBillingApiServiceAbstraction } from "@bitwarden/common/billing/abstractions/account/account-billing-api.service.abstraction";
import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service";
import { OrganizationBillingApiServiceAbstraction } from "@bitwarden/common/billing/abstractions/organizations/organization-billing-api.service.abstraction";
import { AccountBillingApiService } from "@bitwarden/common/billing/services/account/account-billing-api.service";
import { DefaultBillingAccountProfileStateService } from "@bitwarden/common/billing/services/account/billing-account-profile-state.service";
import { BillingApiService } from "@bitwarden/common/billing/services/billing-api.service";
import { OrganizationBillingApiService } from "@bitwarden/common/billing/services/organization/organization-billing-api.service";
import { OrganizationBillingService } from "@bitwarden/common/billing/services/organization-billing.service";
import { AppIdService as AppIdServiceAbstraction } from "@bitwarden/common/platform/abstractions/app-id.service";
import { BroadcasterService } from "@bitwarden/common/platform/abstractions/broadcaster.service";
@@ -985,6 +989,16 @@ const safeProviders: SafeProvider[] = [
// subscribes to sync notifications and will update itself based on that.
deps: [ApiServiceAbstraction, SyncService],
}),
safeProvider({
provide: OrganizationBillingApiServiceAbstraction,
useClass: OrganizationBillingApiService,
deps: [ApiServiceAbstraction],
}),
safeProvider({
provide: AccountBillingApiServiceAbstraction,
useClass: AccountBillingApiService,
deps: [ApiServiceAbstraction],
}),
safeProvider({
provide: DefaultConfigService,
useClass: DefaultConfigService,

View File

@@ -0,0 +1,12 @@
import {
BillingInvoiceResponse,
BillingTransactionResponse,
} from "@bitwarden/common/billing/models/response/billing.response";
export class AccountBillingApiServiceAbstraction {
getBillingInvoices: (id: string, startAfter?: string) => Promise<BillingInvoiceResponse[]>;
getBillingTransactions: (
id: string,
startAfter?: string,
) => Promise<BillingTransactionResponse[]>;
}

View File

@@ -0,0 +1,12 @@
import {
BillingInvoiceResponse,
BillingTransactionResponse,
} from "@bitwarden/common/billing/models/response/billing.response";
export class OrganizationBillingApiServiceAbstraction {
getBillingInvoices: (id: string, startAfter?: string) => Promise<BillingInvoiceResponse[]>;
getBillingTransactions: (
id: string,
startAfter?: string,
) => Promise<BillingTransactionResponse[]>;
}

View File

@@ -29,6 +29,7 @@ export class BillingSourceResponse extends BaseResponse {
}
export class BillingInvoiceResponse extends BaseResponse {
id: string;
url: string;
pdfUrl: string;
number: string;
@@ -38,6 +39,7 @@ export class BillingInvoiceResponse extends BaseResponse {
constructor(response: any) {
super(response);
this.id = this.getResponseProperty("Id");
this.url = this.getResponseProperty("Url");
this.pdfUrl = this.getResponseProperty("PdfUrl");
this.number = this.getResponseProperty("Number");

View File

@@ -0,0 +1,34 @@
import { ApiService } from "../../../abstractions/api.service";
import { AccountBillingApiServiceAbstraction } from "../../abstractions/account/account-billing-api.service.abstraction";
import {
BillingInvoiceResponse,
BillingTransactionResponse,
} from "../../models/response/billing.response";
export class AccountBillingApiService implements AccountBillingApiServiceAbstraction {
constructor(private apiService: ApiService) {}
async getBillingInvoices(startAfter?: string): Promise<BillingInvoiceResponse[]> {
const queryParams = startAfter ? `?startAfter=${startAfter}` : "";
const r = await this.apiService.send(
"GET",
`/accounts/billing/invoices${queryParams}`,
null,
true,
true,
);
return r?.map((i: any) => new BillingInvoiceResponse(i)) || [];
}
async getBillingTransactions(startAfter?: string): Promise<BillingTransactionResponse[]> {
const queryParams = startAfter ? `?startAfter=${startAfter}` : "";
const r = await this.apiService.send(
"GET",
`/accounts/billing/transactions${queryParams}`,
null,
true,
true,
);
return r?.map((i: any) => new BillingTransactionResponse(i)) || [];
}
}

View File

@@ -0,0 +1,37 @@
import { ApiService } from "../../../abstractions/api.service";
import { OrganizationBillingApiServiceAbstraction } from "../../abstractions/organizations/organization-billing-api.service.abstraction";
import {
BillingInvoiceResponse,
BillingTransactionResponse,
} from "../../models/response/billing.response";
export class OrganizationBillingApiService implements OrganizationBillingApiServiceAbstraction {
constructor(private apiService: ApiService) {}
async getBillingInvoices(id: string, startAfter?: string): Promise<BillingInvoiceResponse[]> {
const queryParams = startAfter ? `?startAfter=${startAfter}` : "";
const r = await this.apiService.send(
"GET",
`/organizations/${id}/billing/invoices${queryParams}`,
null,
true,
true,
);
return r?.map((i: any) => new BillingInvoiceResponse(i)) || [];
}
async getBillingTransactions(
id: string,
startAfter?: string,
): Promise<BillingTransactionResponse[]> {
const queryParams = startAfter ? `?startAfter=${startAfter}` : "";
const r = await this.apiService.send(
"GET",
`/organizations/${id}/billing/transactions${queryParams}`,
null,
true,
true,
);
return r?.map((i: any) => new BillingTransactionResponse(i)) || [];
}
}