Files
dukang/server/dukang-api/src/integrations/integrations.module.ts
T
2026-07-06 15:29:27 +08:00

89 lines
3.4 KiB
TypeScript

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 { 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,
{
provide: WECHAT_PROVIDER,
useFactory: (api: WechatApiProvider, disabled: WechatDisabledProvider): IWechatProvider => {
const cfg = loadAppConfig();
const enabled =
(cfg.wechatAuthEnabled || cfg.wechatPayEnabled) &&
(!!cfg.wxAppId || !!process.env.WX_MCH_ID);
return enabled ? api : disabled;
},
inject: [WechatApiProvider, WechatDisabledProvider],
},
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 {}