feat(payment): Payment providers are upserted upon loading (#9090)
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user