gcx/backend/services/notification-service/src/notification.module.ts

130 lines
5.6 KiB
TypeScript

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { PassportModule } from '@nestjs/passport';
import { JwtModule } from '@nestjs/jwt';
import { JwtStrategy } from './infrastructure/strategies/jwt.strategy';
// Domain entities
import { Notification } from './domain/entities/notification.entity';
import { Announcement } from './domain/entities/announcement.entity';
import { AnnouncementRead } from './domain/entities/announcement-read.entity';
import { AnnouncementTagTarget } from './domain/entities/announcement-tag-target.entity';
import { AnnouncementUserTarget } from './domain/entities/announcement-user-target.entity';
import { UserTag } from './domain/entities/user-tag.entity';
import { DeviceToken } from './domain/entities/device-token.entity';
// Domain repository interfaces
import { NOTIFICATION_REPOSITORY } from './domain/repositories/notification.repository.interface';
import { ANNOUNCEMENT_REPOSITORY } from './domain/repositories/announcement.repository.interface';
import { USER_TAG_REPOSITORY } from './domain/repositories/user-tag.repository.interface';
import { DEVICE_TOKEN_REPOSITORY } from './domain/repositories/device-token.repository.interface';
// Infrastructure implementations
import { NotificationRepository } from './infrastructure/persistence/notification.repository';
import { AnnouncementRepositoryImpl } from './infrastructure/persistence/announcement.repository';
import { UserTagRepositoryImpl } from './infrastructure/persistence/user-tag.repository';
import { DeviceTokenRepositoryImpl } from './infrastructure/persistence/device-token.repository';
// Domain ports — notification channel providers
import {
PUSH_NOTIFICATION_PROVIDER,
SMS_NOTIFICATION_PROVIDER,
EMAIL_NOTIFICATION_PROVIDER,
} from './domain/ports/notification-provider.interface';
import { PushNotificationProvider } from './infrastructure/providers/push-notification.provider';
import { SmsNotificationProvider } from './infrastructure/providers/sms-notification.provider';
import { EmailNotificationProvider } from './infrastructure/providers/email-notification.provider';
// Domain ports — push channel providers (FCM/APNs/HMS/Xiaomi/OPPO/vivo)
import {
FCM_PUSH_PROVIDER,
APNS_PUSH_PROVIDER,
HMS_PUSH_PROVIDER,
XIAOMI_PUSH_PROVIDER,
OPPO_PUSH_PROVIDER,
VIVO_PUSH_PROVIDER,
} from './domain/ports/push-channel-provider.interface';
import {
FcmPushProvider,
ApnsPushProvider,
HmsPushProvider,
XiaomiPushProvider,
OppoPushProvider,
VivoPushProvider,
} from './infrastructure/providers/push-channels';
// Application services
import { NotificationService } from './application/services/notification.service';
import { EventConsumerService } from './application/services/event-consumer.service';
import { AdminNotificationService } from './application/services/admin-notification.service';
import { AnnouncementService } from './application/services/announcement.service';
import { UserTagService } from './application/services/user-tag.service';
import { PushDispatcherService } from './application/services/push-dispatcher.service';
import { DeviceTokenService } from './application/services/device-token.service';
// Interface controllers
import { NotificationController } from './interface/http/controllers/notification.controller';
import { AdminNotificationController } from './interface/http/controllers/admin-notification.controller';
import {
AdminAnnouncementController,
AdminUserTagController,
UserAnnouncementController,
} from './interface/http/controllers/announcement.controller';
import { DeviceTokenController } from './interface/http/controllers/device-token.controller';
@Module({
imports: [
TypeOrmModule.forFeature([
Notification,
Announcement,
AnnouncementRead,
AnnouncementTagTarget,
AnnouncementUserTarget,
UserTag,
DeviceToken,
]),
PassportModule.register({ defaultStrategy: 'jwt' }),
JwtModule.register({ secret: process.env.JWT_ACCESS_SECRET || 'dev-access-secret' }),
],
controllers: [
NotificationController,
AdminNotificationController,
AdminAnnouncementController,
AdminUserTagController,
UserAnnouncementController,
DeviceTokenController,
],
providers: [
JwtStrategy,
// Infrastructure -> Domain repository binding
{ provide: NOTIFICATION_REPOSITORY, useClass: NotificationRepository },
{ provide: ANNOUNCEMENT_REPOSITORY, useClass: AnnouncementRepositoryImpl },
{ provide: USER_TAG_REPOSITORY, useClass: UserTagRepositoryImpl },
{ provide: DEVICE_TOKEN_REPOSITORY, useClass: DeviceTokenRepositoryImpl },
// Infrastructure -> Notification channel providers
{ provide: PUSH_NOTIFICATION_PROVIDER, useClass: PushNotificationProvider },
{ provide: SMS_NOTIFICATION_PROVIDER, useClass: SmsNotificationProvider },
{ provide: EMAIL_NOTIFICATION_PROVIDER, useClass: EmailNotificationProvider },
// Infrastructure -> Push channel providers (multi-vendor)
{ provide: FCM_PUSH_PROVIDER, useClass: FcmPushProvider },
{ provide: APNS_PUSH_PROVIDER, useClass: ApnsPushProvider },
{ provide: HMS_PUSH_PROVIDER, useClass: HmsPushProvider },
{ provide: XIAOMI_PUSH_PROVIDER, useClass: XiaomiPushProvider },
{ provide: OPPO_PUSH_PROVIDER, useClass: OppoPushProvider },
{ provide: VIVO_PUSH_PROVIDER, useClass: VivoPushProvider },
// Application services
NotificationService,
EventConsumerService,
AdminNotificationService,
AnnouncementService,
UserTagService,
PushDispatcherService,
DeviceTokenService,
],
exports: [NotificationService, AnnouncementService, PushDispatcherService],
})
export class NotificationModule {}