Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,22 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */

import { faker } from '@faker-js/faker';
import { SubPlatPaymentMethodType, type StripePaymentMethod } from '../types';
import {
PaymentProvider,
SubPlatPaymentMethodType,
type StripePaymentMethod,
} from '../types';

export const StripePaymentMethodTypeResponseFactory = (
override?: Partial<StripePaymentMethod>
): StripePaymentMethod => ({
provider: PaymentProvider.Stripe,
rawType: faker.helpers.arrayElement([
'card',
'apple_pay',
'google_pay',
'link',
]),
type: faker.helpers.arrayElement([
SubPlatPaymentMethodType.Card,
SubPlatPaymentMethodType.ApplePay,
Expand Down
27 changes: 26 additions & 1 deletion libs/payments/customer/src/lib/paymentMethod.manager.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,10 @@ import {
PayPalClient,
PaypalCustomerManager,
} from '@fxa/payments/paypal';
import { SubPlatPaymentMethodType } from '@fxa/payments/customer';
import {
PaymentProvider,
SubPlatPaymentMethodType,
} from '@fxa/payments/customer';
import {
StripeClient,
MockStripeConfigProvider,
Expand Down Expand Up @@ -99,6 +102,8 @@ describe('PaymentMethodManager', () => {
const mockUid = faker.string.uuid();

jest.spyOn(paymentMethodManager, 'determineType').mockResolvedValue({
provider: PaymentProvider.Stripe,
rawType: 'card',
type: SubPlatPaymentMethodType.Card,
paymentMethodId: 'pm_id',
});
Expand Down Expand Up @@ -128,6 +133,8 @@ describe('PaymentMethodManager', () => {
const mockUid = faker.string.uuid();

jest.spyOn(paymentMethodManager, 'determineType').mockResolvedValue({
provider: PaymentProvider.PayPal,
rawType: 'external_paypal',
type: SubPlatPaymentMethodType.PayPal,
});
jest
Expand Down Expand Up @@ -155,6 +162,8 @@ describe('PaymentMethodManager', () => {
const mockUid = faker.string.uuid();

jest.spyOn(paymentMethodManager, 'determineType').mockResolvedValue({
provider: PaymentProvider.Stripe,
rawType: 'apple_pay',
type: SubPlatPaymentMethodType.ApplePay,
paymentMethodId: 'pm_id',
});
Expand Down Expand Up @@ -215,6 +224,8 @@ describe('PaymentMethodManager', () => {
const mockUid = faker.string.uuid();

jest.spyOn(paymentMethodManager, 'determineType').mockResolvedValue({
provider: PaymentProvider.Stripe,
rawType: 'card',
type: SubPlatPaymentMethodType.Card,
paymentMethodId: 'pm_id',
});
Expand Down Expand Up @@ -289,6 +300,8 @@ describe('PaymentMethodManager', () => {
const mockUid = faker.string.uuid();

jest.spyOn(paymentMethodManager, 'determineType').mockResolvedValue({
provider: PaymentProvider.Stripe,
rawType: 'apple_pay',
type: SubPlatPaymentMethodType.ApplePay,
paymentMethodId: 'pm_id',
});
Expand Down Expand Up @@ -331,6 +344,8 @@ describe('PaymentMethodManager', () => {
const mockUid = faker.string.uuid();

jest.spyOn(paymentMethodManager, 'determineType').mockResolvedValue({
provider: PaymentProvider.PayPal,
rawType: 'external_paypal',
type: SubPlatPaymentMethodType.PayPal,
});
jest
Expand Down Expand Up @@ -385,6 +400,8 @@ describe('PaymentMethodManager', () => {
await expect(
paymentMethodManager.determineType(mockCustomer)
).resolves.toEqual({
provider: PaymentProvider.Stripe,
rawType: 'card',
type: SubPlatPaymentMethodType.Card,
paymentMethodId: expect.any(String),
});
Expand All @@ -398,6 +415,8 @@ describe('PaymentMethodManager', () => {
await expect(
paymentMethodManager.determineType(undefined, [mockSubscription])
).resolves.toEqual({
provider: PaymentProvider.PayPal,
rawType: 'external_paypal',
type: SubPlatPaymentMethodType.PayPal,
});
});
Expand All @@ -424,6 +443,8 @@ describe('PaymentMethodManager', () => {
await expect(
paymentMethodManager.determineType(mockCustomer)
).resolves.toEqual({
provider: PaymentProvider.Stripe,
rawType: 'link',
type: SubPlatPaymentMethodType.Link,
paymentMethodId: expect.any(String),
});
Expand Down Expand Up @@ -451,6 +472,8 @@ describe('PaymentMethodManager', () => {
await expect(
paymentMethodManager.determineType(mockCustomer)
).resolves.toEqual({
provider: PaymentProvider.Stripe,
rawType: 'apple_pay',
type: SubPlatPaymentMethodType.ApplePay,
paymentMethodId: expect.any(String),
});
Expand Down Expand Up @@ -478,6 +501,8 @@ describe('PaymentMethodManager', () => {
await expect(
paymentMethodManager.determineType(mockCustomer)
).resolves.toEqual({
provider: PaymentProvider.Stripe,
rawType: 'google_pay',
type: SubPlatPaymentMethodType.GooglePay,
paymentMethodId: expect.any(String),
});
Expand Down
18 changes: 17 additions & 1 deletion libs/payments/customer/src/lib/paymentMethod.manager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import {
DefaultPaymentMethod,
DefaultPaymentMethodError,
PaymentMethodErrorType,
PaymentProvider,
SubPlatPaymentMethodType,
type PaymentMethodTypeResponse,
} from './types';
Expand Down Expand Up @@ -124,7 +125,9 @@ export class PaymentMethodManager {
subscriptions[0].collection_method === 'send_invoice'
) {
return {
provider: PaymentProvider.PayPal,
type: SubPlatPaymentMethodType.PayPal,
rawType: 'external_paypal',
};
}

Expand All @@ -134,26 +137,39 @@ export class PaymentMethodManager {
);
if (paymentMethod.card?.wallet?.type === 'apple_pay') {
return {
provider: PaymentProvider.Stripe,
rawType: 'apple_pay',
type: SubPlatPaymentMethodType.ApplePay,
paymentMethodId: customer.invoice_settings.default_payment_method,
};
} else if (paymentMethod.card?.wallet?.type === 'google_pay') {
return {
provider: PaymentProvider.Stripe,
rawType: 'google_pay',
type: SubPlatPaymentMethodType.GooglePay,
paymentMethodId: customer.invoice_settings.default_payment_method,
};
} else if (paymentMethod.type === 'link' || paymentMethod.card?.wallet?.type === 'link') {
} else if (
paymentMethod.type === 'link' ||
paymentMethod.card?.wallet?.type === 'link'
) {
return {
provider: PaymentProvider.Stripe,
rawType: 'link',
type: SubPlatPaymentMethodType.Link,
paymentMethodId: customer.invoice_settings.default_payment_method,
};
} else if (paymentMethod.type === 'card') {
return {
provider: PaymentProvider.Stripe,
rawType: 'card',
type: SubPlatPaymentMethodType.Card,
paymentMethodId: customer.invoice_settings.default_payment_method,
};
} else {
return {
provider: PaymentProvider.Stripe,
rawType: paymentMethod.type,
type: SubPlatPaymentMethodType.Stripe,
paymentMethodId: customer.invoice_settings.default_payment_method,
};
Expand Down
25 changes: 25 additions & 0 deletions libs/payments/customer/src/lib/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,13 @@ export type InvoicePreview = {
subsequentTax?: TaxAmount[];
};

export enum PaymentProvider {
AppleIap = 'apple_iap',
GoogleIap = 'google_iap',
PayPal = 'paypal',
Stripe = 'stripe',
}

export enum SubPlatPaymentMethodType {
PayPal = 'external_paypal',
Stripe = 'stripe',
Expand All @@ -39,18 +46,36 @@ export enum SubPlatPaymentMethodType {
Link = 'link',
}

export const SubPlatPaymentMethodTypePartial = [
'external_paypal',
'card',
'apple_pay',
'google_pay',
'link',
] as const;

export type SubPlatPaymentMethod =
| Stripe.PaymentMethod.Type
| 'apple_pay'
| 'external_paypal'
| 'google_pay';

export interface StripePaymentMethod {
provider: PaymentProvider.Stripe;
type:
| SubPlatPaymentMethodType.Card
| SubPlatPaymentMethodType.ApplePay
| SubPlatPaymentMethodType.GooglePay
| SubPlatPaymentMethodType.Link
| SubPlatPaymentMethodType.Stripe;
rawType: SubPlatPaymentMethod;
paymentMethodId: string;
}

export interface PayPalPaymentMethod {
provider: PaymentProvider.PayPal;
type: SubPlatPaymentMethodType.PayPal;
rawType: SubPlatPaymentMethod;
}

export type PaymentMethodTypeResponse =
Expand Down
8 changes: 5 additions & 3 deletions libs/payments/events/src/lib/emitter.service.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,14 +32,14 @@ import {
PaymentMethodManager,
SubPlatPaymentMethodType,
StripePaymentMethodTypeResponseFactory,
PaymentProvider,
} from '@fxa/payments/customer';
import { MockFirestoreProvider } from '@fxa/shared/db/firestore';
import {
CheckoutParamsFactory,
CommonMetricsFactory,
MockPaymentsGleanConfigProvider,
MockPaymentsGleanFactory,
PaymentProvidersType,
PaymentsGleanManager,
} from '@fxa/payments/metrics';
import { CartManager } from '@fxa/payments/cart';
Expand Down Expand Up @@ -105,7 +105,8 @@ describe('PaymentsEmitterService', () => {
});
const mockCheckoutPaymentEvents = {
...mockCommonMetricsData,
paymentProvider: 'stripe' as PaymentProvidersType,
paymentMethod: SubPlatPaymentMethodType.Link,
paymentProvider: PaymentProvider.Stripe,
};
let retrieveOptOutMock: jest.SpyInstance<any, unknown[], any>;
const mockLogger = {
Expand Down Expand Up @@ -511,7 +512,8 @@ describe('PaymentsEmitterService', () => {
priceId: additionalMetricsData.cmsMetricsData.priceId,
priceInterval: mockInterval,
priceIntervalCount: 1,
paymentProvider: SubPlatPaymentMethodType.Card,
paymentProvider: PaymentProvider.Stripe,
paymentMethod: SubPlatPaymentMethodType.Card,
});

const mockPrice = StripeResponseFactory(
Expand Down
10 changes: 6 additions & 4 deletions libs/payments/events/src/lib/emitter.types.ts
Original file line number Diff line number Diff line change
@@ -1,28 +1,30 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */

import { PaymentProvider, SubPlatPaymentMethod } from '@fxa/payments/customer';
import {
CancellationReason,
CartMetrics,
CmsMetricsData,
CommonMetrics,
PaymentProvidersType,
} from '@fxa/payments/metrics';
import { LocationStatus } from '@fxa/payments/eligibility';
import { TaxChangeAllowedStatus } from '@fxa/payments/cart';
import { SubPlatPaymentMethodType } from '@fxa/payments/customer';

export type CheckoutEvents = CommonMetrics;
export type CheckoutPaymentEvents = CommonMetrics & {
paymentProvider?: PaymentProvidersType;
paymentMethod?: SubPlatPaymentMethod;
paymentProvider?: PaymentProvider;
};

export type SubscriptionEndedEvents = {
productId: string;
priceId: string;
priceInterval?: string;
priceIntervalCount?: number;
paymentProvider?: SubPlatPaymentMethodType;
paymentMethod?: SubPlatPaymentMethod;
paymentProvider?: PaymentProvider;
providerEventId: string;
cancellationReason: CancellationReason;
uid?: string;
Expand Down
25 changes: 15 additions & 10 deletions libs/payments/metrics/src/lib/glean/glean.types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,21 +11,26 @@ export const CheckoutTypes = [
'unknown',
] as const;
export type CheckoutTypesType = (typeof CheckoutTypes)[number];
import { SubPlatPaymentMethodType } from '@fxa/payments/customer';

export const PaymentProvidersTypePartial = [
'card',
'google_iap',
'apple_iap',
export type PaymentProvidersType =
| 'stripe'
| 'google_iap'
| 'apple_iap'
| 'paypal';

export const SubPlatPaymentMethodTypePartial = [
'external_paypal',
'card',
'apple_pay',
'google_pay',
'link',
] as const;
export type PaymentProvidersType =

export type SubPlatPaymentMethod =
| Stripe.PaymentMethod.Type
| SubPlatPaymentMethodType
| 'google_iap'
| 'apple_iap'
| 'external_paypal';
| 'apple_pay'
| 'external_paypal'
| 'google_pay';

export type CommonMetrics = {
ipAddress: string;
Expand Down
Loading
Loading