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

View File

@@ -29,14 +29,19 @@ medusaIntegrationTestRunner({
)
expect(response.status).toEqual(200)
expect(response.data.payment_providers).toEqual([
expect.objectContaining({
id: "pp_system_default_2",
}),
expect.objectContaining({
id: "pp_system_default",
}),
])
expect(response.data.payment_providers).toEqual(
expect.arrayContaining([
expect.objectContaining({
id: "pp_system_default_2",
is_enabled: true,
}),
expect.objectContaining({
id: "pp_system_default",
is_enabled: true,
}),
])
)
expect(response.data.count).toEqual(2)
})
})

View File

@@ -7,8 +7,10 @@ import {
} from "@medusajs/types"
import { Lifetime, asFunction, asValue } from "awilix"
import * as providers from "../providers"
import { PaymentProviderService } from "@services"
import * as providers from "../providers"
const PROVIDER_REGISTRATION_KEY = "payment_providers"
const registrationFn = async (klass, container, pluginOptions) => {
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 ({
@@ -48,25 +50,27 @@ export default async ({
const registerProvidersInDb = async ({
container,
}: LoaderOptions): Promise<void> => {
const providersToLoad = container.resolve<string[]>("payment_providers")
const providersToLoad = container.resolve<string[]>(PROVIDER_REGISTRATION_KEY)
const paymentProviderService = container.resolve<PaymentProviderService>(
"paymentProviderService"
)
const providers = await paymentProviderService.list({
id: providersToLoad,
})
const existingProviders = await paymentProviderService.list(
{ id: providersToLoad },
{ take: null }
)
const loadedProvidersMap = new Map(providers.map((p) => [p.id, p]))
const upsertData: CreatePaymentProviderDTO[] = []
const providersToCreate: CreatePaymentProviderDTO[] = []
for (const id of providersToLoad) {
if (loadedProvidersMap.has(id)) {
continue
for (const { id } of existingProviders) {
if (!providersToLoad.includes(id)) {
upsertData.push({ id, is_enabled: false })
}
providersToCreate.push({ id })
}
await paymentProviderService.create(providersToCreate)
for (const id of providersToLoad) {
upsertData.push({ id, is_enabled: true })
}
await paymentProviderService.upsert(upsertData)
}

View File

@@ -1,16 +1,10 @@
import {
BigNumberInput,
Context,
CreatePaymentProviderDTO,
CreatePaymentProviderSession,
DAL,
FilterablePaymentProviderProps,
FindConfig,
InternalModuleDeclaration,
IPaymentProvider,
PaymentProviderAuthorizeResponse,
PaymentProviderDataInput,
PaymentProviderDTO,
PaymentProviderError,
PaymentProviderSessionResponse,
PaymentSessionStatus,
@@ -19,10 +13,7 @@ import {
WebhookActionResult,
} from "@medusajs/types"
import {
InjectManager,
InjectTransactionManager,
isPaymentProviderError,
MedusaContext,
MedusaError,
ModulesSdkUtils,
} from "@medusajs/utils"
@@ -34,64 +25,12 @@ type InjectedDependencies = {
[key: `pp_${string}`]: IPaymentProvider
}
export default class PaymentProviderService {
protected readonly container_: InjectedDependencies
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
)
}
export default class PaymentProviderService extends ModulesSdkUtils.MedusaInternalService<InjectedDependencies>(
PaymentProvider
) {
retrieveProvider(providerId: string): IPaymentProvider {
try {
return this.container_[providerId] as IPaymentProvider
return this.__container__[providerId] as IPaymentProvider
} catch (e) {
throw new MedusaError(
MedusaError.Types.NOT_FOUND,