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