import { Module } from '@nestjs/common'; import { BullModule } from '@nestjs/bullmq'; import { loadAppConfig } from '@dukang/shared-types'; import { SmsCodeStore } from './sms/sms-code.store'; import { SmsMockProvider } from './sms/sms.mock.provider'; import { SmsAliyunProvider } from './sms/sms.aliyun.provider'; import { PayMockProvider } from './pay/pay.mock.provider'; import { PayWechatProvider } from './pay/pay.wechat.provider'; import { DeliveryMockProvider } from './delivery/delivery.mock.provider'; import { WechatApiProvider } from './wechat/wechat.api.provider'; import { WechatDisabledProvider } from './wechat/wechat.disabled.provider'; import { WechatMockProvider } from './wechat/wechat.mock.provider'; import { OssMockProvider } from './oss/oss.mock.provider'; import { OssAliyunProvider } from './oss/oss.aliyun.provider'; import { TencentLbsProvider } from './map/tencent-lbs.provider'; import { SMS_PROVIDER, PAY_PROVIDER, DELIVERY_PROVIDER, WECHAT_PROVIDER, OSS_PROVIDER, MAP_PROVIDER, } from './integrations.constants'; import { CourierModule } from './courier/courier.module'; import { DELIVERY_QUEUE } from '../jobs/jobs.constants'; import type { IWechatProvider } from './wechat/wechat.interface'; import type { IPayProvider } from './pay/pay.interface'; import type { IOssProvider } from './oss/oss.interface'; import type { ISmsProvider } from './sms/sms.interface'; @Module({ imports: [BullModule.registerQueue({ name: DELIVERY_QUEUE }), CourierModule], providers: [ SmsCodeStore, SmsMockProvider, SmsAliyunProvider, { provide: SMS_PROVIDER, useFactory: (mock: SmsMockProvider, aliyun: SmsAliyunProvider): ISmsProvider => { const cfg = loadAppConfig(); if (cfg.mockSms) return mock; if (!aliyun.isEnabled()) { throw new Error('MOCK_SMS=false but Aliyun SMS credentials are missing'); } return aliyun; }, inject: [SmsMockProvider, SmsAliyunProvider], }, WechatApiProvider, WechatDisabledProvider, WechatMockProvider, { provide: WECHAT_PROVIDER, useFactory: ( api: WechatApiProvider, disabled: WechatDisabledProvider, mock: WechatMockProvider, ): IWechatProvider => { const cfg = loadAppConfig(); const enabled = (cfg.wechatAuthEnabled || cfg.wechatPayEnabled) && (!!cfg.wxAppId || !!process.env.WX_MCH_ID); if (enabled) return api; // preV1:真实微信未配置但开启 Mock 授权登录 if (cfg.mockWechat) return mock; return disabled; }, inject: [WechatApiProvider, WechatDisabledProvider, WechatMockProvider], }, PayMockProvider, PayWechatProvider, { provide: PAY_PROVIDER, useFactory: (mock: PayMockProvider, wechat: PayWechatProvider): IPayProvider => { const cfg = loadAppConfig(); return cfg.mockPay ? mock : wechat; }, inject: [PayMockProvider, PayWechatProvider], }, { provide: DELIVERY_PROVIDER, useClass: DeliveryMockProvider }, OssMockProvider, OssAliyunProvider, { provide: OSS_PROVIDER, useFactory: (mock: OssMockProvider, aliyun: OssAliyunProvider): IOssProvider => { const cfg = loadAppConfig(); return cfg.ossEnabled && aliyun.isEnabled() ? aliyun : mock; }, inject: [OssMockProvider, OssAliyunProvider], }, DeliveryMockProvider, TencentLbsProvider, { provide: MAP_PROVIDER, useExisting: TencentLbsProvider }, ], exports: [SMS_PROVIDER, SmsCodeStore, PAY_PROVIDER, DELIVERY_PROVIDER, WECHAT_PROVIDER, OSS_PROVIDER, MAP_PROVIDER, TencentLbsProvider, CourierModule], }) export class IntegrationsModule {}