feat: change the email structure into seprate module

This commit is contained in:
mahyargdz
2025-07-26 10:11:17 +03:30
parent 7b7167ab7d
commit 61e3be9f4a
15 changed files with 1226 additions and 71 deletions
+4
View File
@@ -18,6 +18,8 @@ import { AiAssistantModule } from "./modules/ai-assistant/ai-assistant.module";
import { AuthModule } from "./modules/auth/auth.module";
import { DomainsModule } from "./modules/domains/domains.module";
import { EmailModule } from "./modules/email/email.module";
import { EmailGatewayModule } from "./modules/email-gateway/email-gateway.module";
import { EmailUtilsModule } from "./modules/email-utils/email-utils.module";
import { MailServerModule } from "./modules/mail-server/mail-server.module";
import { MailboxModule } from "./modules/mailbox/mailbox.module";
import { NotificationModule } from "./modules/notifications/notifications.module";
@@ -52,6 +54,8 @@ import { UtilsModule } from "./modules/utils/utils.module";
SettingModule,
NotificationModule,
UploaderModule,
EmailUtilsModule,
EmailGatewayModule,
],
})
export class AppModule implements NestModule {
@@ -0,0 +1,13 @@
import { Module } from "@nestjs/common";
import { JwtModule } from "@nestjs/jwt";
import { EmailGateway } from "./email.gateway";
import { WebSocketAuthService } from "./services/websocket-auth.service";
import { jwtConfig } from "../../configs/jwt.config";
@Module({
imports: [JwtModule.registerAsync(jwtConfig())],
providers: [EmailGateway, WebSocketAuthService],
exports: [EmailGateway],
})
export class EmailGatewayModule {}
@@ -10,10 +10,11 @@ import {
} from "@nestjs/websockets";
import { Server, Socket } from "socket.io";
import { WebSocketMessage } from "../../../common/enums/message.enum";
import { WsExceptionFilter } from "../../../core/filters/ws-exception.filter";
import { WEBSOCKET_EVENTS, WEBSOCKET_NAMESPACES, WEBSOCKET_ROOMS, WebSocketEvent } from "../constants/email-events.constant";
import { WebSocketAuthGuard } from "../guards/websocket-auth.guard";
import { WebSocketAuthService } from "./services/websocket-auth.service";
import { WebSocketMessage } from "../../common/enums/message.enum";
import { WsExceptionFilter } from "../../core/filters/ws-exception.filter";
import { WEBSOCKET_EVENTS, WEBSOCKET_NAMESPACES, WEBSOCKET_ROOMS, WebSocketEvent } from "../email/constants/email-events.constant";
import { WebSocketAuthGuard } from "../email/guards/websocket-auth.guard";
import {
EmailDeletePayload,
EmailPayload,
@@ -21,9 +22,8 @@ import {
EmailStatusPayload,
MailboxUpdatePayload,
UnreadCountPayload,
} from "../interfaces/email-events.interface";
import { ConnectedUserInfo } from "../interfaces/websocket.interface";
import { WebSocketAuthService } from "../services/websocket-auth.service";
} from "../email/interfaces/email-events.interface";
import { ConnectedUserInfo } from "../email/interfaces/websocket.interface";
@UsePipes(new ValidationPipe({ transform: true }))
@UseFilters(WsExceptionFilter)
@@ -4,9 +4,9 @@ import { Socket } from "socket.io";
import { WebSocketMessage } from "../../../common/enums/message.enum";
import { ITokenPayload } from "../../auth/interfaces/IToken-payload";
import { WEBSOCKET_EVENTS, WebSocketEvent } from "../../email/constants/email-events.constant";
import { AuthenticationResult, WebSocketErrorContext } from "../../email/interfaces/websocket.interface";
import { extractTokenFromClient } from "../../utils/services/extract-token.utils";
import { WEBSOCKET_EVENTS, WebSocketEvent } from "../constants/email-events.constant";
import { AuthenticationResult, WebSocketErrorContext } from "../interfaces/websocket.interface";
@Injectable()
export class WebSocketAuthService {
@@ -0,0 +1,25 @@
import { BullModule } from "@nestjs/bullmq";
import { Module } from "@nestjs/common";
import { EmailMonitoringProcessor } from "./queue/email-monitoring.processor";
import { EmailMonitoringService } from "./services/email-monitoring.service";
import { EmailNotificationService } from "./services/email-notification.service";
import { MailboxResolverService } from "./services/mailbox-resolver.service";
import { EMAIL_QUEUE_CONSTANTS } from "../email/constants/email-events.constant";
import { EmailGatewayModule } from "../email-gateway/email-gateway.module";
import { MailServerModule } from "../mail-server/mail-server.module";
import { NotificationModule } from "../notifications/notifications.module";
@Module({
imports: [
NotificationModule,
MailServerModule,
EmailGatewayModule,
BullModule.registerQueue({
name: EMAIL_QUEUE_CONSTANTS.EMAIL_QUEUE,
}),
],
providers: [EmailMonitoringService, EmailNotificationService, MailboxResolverService, EmailMonitoringProcessor],
exports: [EmailMonitoringService, EmailNotificationService, MailboxResolverService],
})
export class EmailUtilsModule {}
@@ -2,9 +2,9 @@ import { Processor, WorkerHost } from "@nestjs/bullmq";
import { Logger } from "@nestjs/common";
import { Job } from "bullmq";
import { EMAIL_QUEUE_CONSTANTS } from "../constants/email-events.constant";
import { EmailMonitoringJob, EmailSchedulerJob } from "../interfaces/email-events.interface";
import { EmailMonitoringService } from "../services/email-monitoring.service";
import { EMAIL_QUEUE_CONSTANTS } from "../../email/constants/email-events.constant";
import { EmailMonitoringJob, EmailSchedulerJob } from "../../email/interfaces/email-events.interface";
import { EmailMonitoringService } from "../../email-utils/services/email-monitoring.service";
@Processor(EMAIL_QUEUE_CONSTANTS.EMAIL_QUEUE)
export class EmailMonitoringProcessor extends WorkerHost {
@@ -5,13 +5,13 @@ import { Queue } from "bullmq";
import { firstValueFrom } from "rxjs";
import { MailboxResolverService } from "./mailbox-resolver.service";
import { EMAIL_QUEUE_CONSTANTS } from "../../email/constants/email-events.constant";
import { EmailMonitoringJob, EmailPayload, EmailSchedulerJob } from "../../email/interfaces/email-events.interface";
import { EmailGateway } from "../../email-gateway/email.gateway";
import { MailServerService } from "../../mail-server/services/mail-server.service";
import { MailboxEnum } from "../../mailbox/enums/mailbox.enum";
import { NotificationQueue } from "../../notifications/queue/notification.queue";
import { User } from "../../users/entities/user.entity";
import { EMAIL_QUEUE_CONSTANTS } from "../constants/email-events.constant";
import { EmailGateway } from "../gateways/email.gateway";
import { EmailMonitoringJob, EmailPayload, EmailSchedulerJob } from "../interfaces/email-events.interface";
@Injectable()
export class EmailMonitoringService implements OnModuleInit {
@@ -224,6 +224,7 @@ export class EmailMonitoringService implements OnModuleInit {
await this.notificationQueue.addNewEmailNotification(userId, {
fromEmail: message.from[0].address,
fromName: message.from[0].name,
subject: message.subject,
});
await this.emailGateway.notifyNewEmail(userId, emailPayload);
@@ -3,11 +3,7 @@ import { Injectable, Logger } from "@nestjs/common";
import { firstValueFrom } from "rxjs";
import { MailboxResolverService } from "./mailbox-resolver.service";
import { MailServerService } from "../../mail-server/services/mail-server.service";
import { MailboxEnum } from "../../mailbox/enums/mailbox.enum";
import { User } from "../../users/entities/user.entity";
import { WebSocketEvent } from "../constants/email-events.constant";
import { EmailGateway } from "../gateways/email.gateway";
import { WebSocketEvent } from "../../email/constants/email-events.constant";
import {
EmailDeletePayload,
EmailSentNotificationParams,
@@ -17,7 +13,11 @@ import {
MailboxUpdateNotificationParams,
MailboxUpdatePayload,
UnreadCountPayload,
} from "../interfaces/email-events.interface";
} from "../../email/interfaces/email-events.interface";
import { EmailGateway } from "../../email-gateway/email.gateway";
import { MailServerService } from "../../mail-server/services/mail-server.service";
import { MailboxEnum } from "../../mailbox/enums/mailbox.enum";
import { User } from "../../users/entities/user.entity";
@Injectable()
export class EmailNotificationService {
@@ -1,10 +1,10 @@
import { Injectable, Logger, NotFoundException } from "@nestjs/common";
import { firstValueFrom } from "rxjs";
import { UserMailboxIds } from "../../email/interfaces/user-mailbox.interface";
import { MailboxInfo } from "../../mail-server/interfaces/mailboxes-response.interface";
import { MailServerService } from "../../mail-server/services/mail-server.service";
import { MailboxEnum } from "../../mailbox/enums/mailbox.enum";
import { UserMailboxIds } from "../interfaces/user-mailbox.interface";
@Injectable()
export class MailboxResolverService {
+4 -42
View File
@@ -1,57 +1,19 @@
import { MikroOrmModule } from "@mikro-orm/nestjs";
import { BullModule } from "@nestjs/bullmq";
import { Module } from "@nestjs/common";
import { JwtModule } from "@nestjs/jwt";
// import { EmailGatewayController } from "./controllers/email-gateway.controller";
import { EMAIL_QUEUE_CONSTANTS } from "./constants/email-events.constant";
import { EmailController } from "./email.controller";
import { EmailGateway } from "./gateways/email.gateway";
import { EmailMonitoringProcessor } from "./queue/email-monitoring.processor";
import { EmailHeadersService } from "./services/email-headers.service";
import { EmailMonitoringService } from "./services/email-monitoring.service";
import { EmailNotificationService } from "./services/email-notification.service";
import { EmailSpamService } from "./services/email-spam.service";
import { EmailService } from "./services/email.service";
import { MailboxResolverService } from "./services/mailbox-resolver.service";
import { jwtConfig } from "../../configs/jwt.config";
import { EmailUtilsModule } from "../email-utils/email-utils.module";
import { MailServerModule } from "../mail-server/mail-server.module";
import { TemplatesModule } from "../templates/templates.module";
import { WebSocketAuthService } from "./services/websocket-auth.service";
import { User } from "../users/entities/user.entity";
import { UsersModule } from "../users/users.module";
@Module({
imports: [
MailServerModule,
UsersModule,
TemplatesModule,
JwtModule.registerAsync(jwtConfig()),
MikroOrmModule.forFeature([User]),
BullModule.registerQueue({
name: EMAIL_QUEUE_CONSTANTS.EMAIL_QUEUE,
}),
],
imports: [MailServerModule, TemplatesModule, EmailUtilsModule, MikroOrmModule.forFeature([User])],
controllers: [EmailController],
providers: [
EmailService,
EmailSpamService,
MailboxResolverService,
EmailHeadersService,
EmailGateway,
EmailMonitoringService,
EmailNotificationService,
EmailMonitoringProcessor,
WebSocketAuthService,
],
exports: [
EmailService,
EmailSpamService,
MailboxResolverService,
EmailHeadersService,
EmailGateway,
EmailMonitoringService,
EmailNotificationService,
],
providers: [EmailService, EmailSpamService, EmailHeadersService],
exports: [EmailService, EmailSpamService, EmailHeadersService],
})
export class EmailModule {}
+2 -2
View File
@@ -3,10 +3,10 @@ import { FastifyReply } from "fastify";
import { firstValueFrom } from "rxjs";
import { EmailHeadersService } from "./email-headers.service";
import { EmailNotificationService } from "./email-notification.service";
import { EmailSpamService } from "./email-spam.service";
import { MailboxResolverService } from "./mailbox-resolver.service";
import { EmailMessage } from "../../../common/enums/message.enum";
import { EmailNotificationService } from "../../email-utils/services/email-notification.service";
import { MailboxResolverService } from "../../email-utils/services/mailbox-resolver.service";
import { SearchMessagesMailServerQueryDto } from "../../mail-server/DTO/message.dto";
import { MailServerService } from "../../mail-server/services/mail-server.service";
import { TemplateProcessorService } from "../../templates/services/template-processor.service";
@@ -15,4 +15,5 @@ export interface IGenericNotificationData extends IBaseNotificationData {
export interface INewEmailNotificationData extends IBaseNotificationData {
fromEmail: string;
fromName: string;
subject: string;
}
@@ -124,7 +124,7 @@ export class NotificationsService {
//************************ */
async createNewEmailNotification(recipientId: string, data: INewEmailNotificationData, em: EntityManager) {
const message = NotificationMessage.NEW_EMAIL_MESSAGE.replace("[subject]", data.newEmail);
const message = NotificationMessage.NEW_EMAIL_MESSAGE.replace("[subject]", data.subject);
const { isActive } = await this.userSettingsService.getUserNotificationSettingWithType(NotifType.NEW_EMAIL, recipientId);
if (isActive) {
return this.createNotification({ title: NotificationMessage.NEW_EMAIL, type: NotifType.NEW_EMAIL, message, recipientId }, em);
@@ -16,10 +16,8 @@ import { Business } from "../../businesses/entities/business.entity";
import { DomainStatus } from "../../domains/enums/domain-status.enum";
import { DomainAutomationService } from "../../domains/services/domain-automation.service";
import { DomainsService } from "../../domains/services/domains.service";
import { MailboxResolverService } from "../../email/services/mailbox-resolver.service";
import { UpdateUserDto } from "../../mail-server/DTO/update-user.dto";
import { MailServerService } from "../../mail-server/services/mail-server.service";
import { NotificationQueue } from "../../notifications/queue/notification.queue";
import { PushNotificationService } from "../../notifications/services/push-notification.service";
import { QuotaSyncService } from "../../quota-sync/services/quota-sync.service";
import { UserSettingsService } from "../../settings/services/user-settings.service";
@@ -53,8 +51,6 @@ export class UsersService {
private readonly domainAutomationService: DomainAutomationService,
private readonly quotaSyncService: QuotaSyncService,
private readonly userSettingsService: UserSettingsService,
private readonly mailboxResolver: MailboxResolverService,
private readonly notificationQueue: NotificationQueue,
private readonly pushNotificationService: PushNotificationService,
) {}