diff --git a/integration-tests/modules/__tests__/payment/payment-providers.spec.ts b/integration-tests/modules/__tests__/payment/payment-providers.spec.ts index 76cc55a1bb..24429d38e4 100644 --- a/integration-tests/modules/__tests__/payment/payment-providers.spec.ts +++ b/integration-tests/modules/__tests__/payment/payment-providers.spec.ts @@ -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) }) }) diff --git a/packages/modules/payment/src/loaders/providers.ts b/packages/modules/payment/src/loaders/providers.ts index 313804f221..0fb1dd9621 100644 --- a/packages/modules/payment/src/loaders/providers.ts +++ b/packages/modules/payment/src/loaders/providers.ts @@ -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 => { - const providersToLoad = container.resolve("payment_providers") + const providersToLoad = container.resolve(PROVIDER_REGISTRATION_KEY) const paymentProviderService = container.resolve( "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) } diff --git a/packages/modules/payment/src/services/payment-provider.ts b/packages/modules/payment/src/services/payment-provider.ts index 1abdfd8629..6cd1dd6477 100644 --- a/packages/modules/payment/src/services/payment-provider.ts +++ b/packages/modules/payment/src/services/payment-provider.ts @@ -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 { - return await this.paymentProviderRepository_.create(data, sharedContext) - } - - @InjectManager("paymentProviderRepository_") - async list( - filters?: FilterablePaymentProviderProps, - config?: FindConfig, - @MedusaContext() sharedContext?: Context - ): Promise { - const queryOptions = ModulesSdkUtils.buildQuery( - filters, - config - ) - - return await this.paymentProviderRepository_.find( - queryOptions, - sharedContext - ) - } - - @InjectManager("paymentProviderRepository_") - async listAndCount( - filters: FilterablePaymentProviderProps, - config: FindConfig, - @MedusaContext() sharedContext?: Context - ): Promise<[PaymentProvider[], number]> { - const queryOptions = ModulesSdkUtils.buildQuery( - filters, - config - ) - - return await this.paymentProviderRepository_.findAndCount( - queryOptions, - sharedContext - ) - } - +export default class PaymentProviderService extends ModulesSdkUtils.MedusaInternalService( + 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,