feat(payment): Payment providers are upserted upon loading (#9090)

This commit is contained in:
Riqwan Thamir
2024-09-11 09:01:24 +02:00
committed by GitHub
parent 1466ca73e0
commit d398009d3f
3 changed files with 35 additions and 87 deletions
@@ -29,14 +29,19 @@ medusaIntegrationTestRunner({
) )
expect(response.status).toEqual(200) expect(response.status).toEqual(200)
expect(response.data.payment_providers).toEqual([ expect(response.data.payment_providers).toEqual(
expect.objectContaining({ expect.arrayContaining([
id: "pp_system_default_2", expect.objectContaining({
}), id: "pp_system_default_2",
expect.objectContaining({ is_enabled: true,
id: "pp_system_default", }),
}), expect.objectContaining({
]) id: "pp_system_default",
is_enabled: true,
}),
])
)
expect(response.data.count).toEqual(2) expect(response.data.count).toEqual(2)
}) })
}) })
@@ -7,8 +7,10 @@ import {
} from "@medusajs/types" } from "@medusajs/types"
import { Lifetime, asFunction, asValue } from "awilix" import { Lifetime, asFunction, asValue } from "awilix"
import * as providers from "../providers"
import { PaymentProviderService } from "@services" import { PaymentProviderService } from "@services"
import * as providers from "../providers"
const PROVIDER_REGISTRATION_KEY = "payment_providers"
const registrationFn = async (klass, container, pluginOptions) => { const registrationFn = async (klass, container, pluginOptions) => {
const key = `pp_${klass.PROVIDER}_${pluginOptions.id}` const key = `pp_${klass.PROVIDER}_${pluginOptions.id}`
@@ -19,7 +21,7 @@ const registrationFn = async (klass, container, pluginOptions) => {
}), }),
}) })
container.registerAdd("payment_providers", asValue(key)) container.registerAdd(PROVIDER_REGISTRATION_KEY, asValue(key))
} }
export default async ({ export default async ({
@@ -48,25 +50,27 @@ export default async ({
const registerProvidersInDb = async ({ const registerProvidersInDb = async ({
container, container,
}: LoaderOptions): Promise<void> => { }: LoaderOptions): Promise<void> => {
const providersToLoad = container.resolve<string[]>("payment_providers") const providersToLoad = container.resolve<string[]>(PROVIDER_REGISTRATION_KEY)
const paymentProviderService = container.resolve<PaymentProviderService>( const paymentProviderService = container.resolve<PaymentProviderService>(
"paymentProviderService" "paymentProviderService"
) )
const providers = await paymentProviderService.list({ const existingProviders = await paymentProviderService.list(
id: providersToLoad, { id: providersToLoad },
}) { take: null }
)
const loadedProvidersMap = new Map(providers.map((p) => [p.id, p])) const upsertData: CreatePaymentProviderDTO[] = []
const providersToCreate: CreatePaymentProviderDTO[] = [] for (const { id } of existingProviders) {
for (const id of providersToLoad) { if (!providersToLoad.includes(id)) {
if (loadedProvidersMap.has(id)) { upsertData.push({ id, is_enabled: false })
continue
} }
providersToCreate.push({ id })
} }
await paymentProviderService.create(providersToCreate) for (const id of providersToLoad) {
upsertData.push({ id, is_enabled: true })
}
await paymentProviderService.upsert(upsertData)
} }
@@ -1,16 +1,10 @@
import { import {
BigNumberInput, BigNumberInput,
Context,
CreatePaymentProviderDTO,
CreatePaymentProviderSession, CreatePaymentProviderSession,
DAL, DAL,
FilterablePaymentProviderProps,
FindConfig,
InternalModuleDeclaration,
IPaymentProvider, IPaymentProvider,
PaymentProviderAuthorizeResponse, PaymentProviderAuthorizeResponse,
PaymentProviderDataInput, PaymentProviderDataInput,
PaymentProviderDTO,
PaymentProviderError, PaymentProviderError,
PaymentProviderSessionResponse, PaymentProviderSessionResponse,
PaymentSessionStatus, PaymentSessionStatus,
@@ -19,10 +13,7 @@ import {
WebhookActionResult, WebhookActionResult,
} from "@medusajs/types" } from "@medusajs/types"
import { import {
InjectManager,
InjectTransactionManager,
isPaymentProviderError, isPaymentProviderError,
MedusaContext,
MedusaError, MedusaError,
ModulesSdkUtils, ModulesSdkUtils,
} from "@medusajs/utils" } from "@medusajs/utils"
@@ -34,64 +25,12 @@ type InjectedDependencies = {
[key: `pp_${string}`]: IPaymentProvider [key: `pp_${string}`]: IPaymentProvider
} }
export default class PaymentProviderService { export default class PaymentProviderService extends ModulesSdkUtils.MedusaInternalService<InjectedDependencies>(
protected readonly container_: InjectedDependencies PaymentProvider
protected readonly paymentProviderRepository_: DAL.RepositoryService ) {
constructor(
container: InjectedDependencies,
protected readonly moduleDeclaration: InternalModuleDeclaration
) {
this.container_ = container
this.paymentProviderRepository_ = container.paymentProviderRepository
}
@InjectTransactionManager("paymentProviderRepository_")
async create(
data: CreatePaymentProviderDTO[],
@MedusaContext() sharedContext?: Context
): Promise<PaymentProvider[]> {
return await this.paymentProviderRepository_.create(data, sharedContext)
}
@InjectManager("paymentProviderRepository_")
async list(
filters?: FilterablePaymentProviderProps,
config?: FindConfig<PaymentProviderDTO>,
@MedusaContext() sharedContext?: Context
): Promise<PaymentProvider[]> {
const queryOptions = ModulesSdkUtils.buildQuery<PaymentProvider>(
filters,
config
)
return await this.paymentProviderRepository_.find(
queryOptions,
sharedContext
)
}
@InjectManager("paymentProviderRepository_")
async listAndCount(
filters: FilterablePaymentProviderProps,
config: FindConfig<PaymentProviderDTO>,
@MedusaContext() sharedContext?: Context
): Promise<[PaymentProvider[], number]> {
const queryOptions = ModulesSdkUtils.buildQuery<PaymentProvider>(
filters,
config
)
return await this.paymentProviderRepository_.findAndCount(
queryOptions,
sharedContext
)
}
retrieveProvider(providerId: string): IPaymentProvider { retrieveProvider(providerId: string): IPaymentProvider {
try { try {
return this.container_[providerId] as IPaymentProvider return this.__container__[providerId] as IPaymentProvider
} catch (e) { } catch (e) {
throw new MedusaError( throw new MedusaError(
MedusaError.Types.NOT_FOUND, MedusaError.Types.NOT_FOUND,