From 935cc50cb150a436520d6531a9f7aa8a89cedda0 Mon Sep 17 00:00:00 2001 From: mahyargdz Date: Thu, 10 Jul 2025 12:16:55 +0330 Subject: [PATCH] chore: add new route to get favorinte and archive mailboxx messsage --- src/modules/email/email.controller.ts | 24 ++++++++ src/modules/email/services/email.service.ts | 57 +++++++++++++++++++ .../services/mailbox-resolver.service.ts | 21 ++++++- .../mailboxes-response.interface.ts | 1 + 4 files changed, 100 insertions(+), 3 deletions(-) diff --git a/src/modules/email/email.controller.ts b/src/modules/email/email.controller.ts index 4f0d331..70697de 100644 --- a/src/modules/email/email.controller.ts +++ b/src/modules/email/email.controller.ts @@ -86,6 +86,30 @@ export class EmailController { return this.emailService.getTrashMessages(userId, query); } + @Get("messages/junk") + @ApiOperation({ summary: "List messages in junk mailbox" }) + @ApiResponse({ status: 200, description: "List of junk messages" }) + @ApiResponse({ status: 404, description: "junk mailbox not found" }) + getJunkMessages(@UserDec("wildduckUserId") userId: string, @Query() query: MessageListQueryDto) { + return this.emailService.getJunkMessages(userId, query); + } + + @Get("messages/archive") + @ApiOperation({ summary: "List messages in archive mailbox" }) + @ApiResponse({ status: 200, description: "List of archive messages" }) + @ApiResponse({ status: 404, description: "archive mailbox not found" }) + getArchiveMessages(@UserDec("wildduckUserId") userId: string, @Query() query: MessageListQueryDto) { + return this.emailService.getArchivedMessages(userId, query); + } + + @Get("messages/favorite") + @ApiOperation({ summary: "List messages in favorite mailbox" }) + @ApiResponse({ status: 200, description: "List of favorite messages" }) + @ApiResponse({ status: 404, description: "favorite mailbox not found" }) + getFavoriteMessages(@UserDec("wildduckUserId") userId: string, @Query() query: MessageListQueryDto) { + return this.emailService.getFavoriteMessages(userId, query); + } + @Get("messages/drafts") @ApiOperation({ summary: "List messages in drafts mailbox" }) @ApiResponse({ status: 200, description: "List of drafts messages" }) diff --git a/src/modules/email/services/email.service.ts b/src/modules/email/services/email.service.ts index 9a3ec46..1f21487 100644 --- a/src/modules/email/services/email.service.ts +++ b/src/modules/email/services/email.service.ts @@ -193,6 +193,63 @@ export class EmailService { throw error; } } + //============================================== + + async getJunkMessages(userId: string, query: MessageListQueryDto) { + try { + const junkMailboxId = await this.mailboxResolverService.getJunkMailboxId(userId); + const { results: junkMails, total: count } = await firstValueFrom(this.mailServerService.messages.listMessages(userId, junkMailboxId, query)); + + return { + junkMails, + count, + paginate: true, + }; + } catch (error) { + this.logger.error(`Failed to get junk messages for user ${userId}: ${error instanceof Error ? error.message : "Unknown error"}`); + throw error; + } + } + //============================================== + + async getArchivedMessages(userId: string, query: MessageListQueryDto) { + try { + const archiveMailboxId = await this.mailboxResolverService.getArchiveMailboxId(userId); + const { results: archiveMails, total: count } = await firstValueFrom( + this.mailServerService.messages.listMessages(userId, archiveMailboxId, query), + ); + + return { + archiveMails, + count, + paginate: true, + }; + } catch (error) { + this.logger.error(`Failed to get archive messages for user ${userId}: ${error instanceof Error ? error.message : "Unknown error"}`); + throw error; + } + } + //============================================== + + async getFavoriteMessages(userId: string, query: MessageListQueryDto) { + try { + const favoriteMailboxId = await this.mailboxResolverService.getFavoriteMailboxId(userId); + const { results: favoriteMails, total: count } = await firstValueFrom( + this.mailServerService.messages.listMessages(userId, favoriteMailboxId, query), + ); + + return { + favoriteMails, + count, + paginate: true, + }; + } catch (error) { + this.logger.error(`Failed to get junk messages for user ${userId}: ${error instanceof Error ? error.message : "Unknown error"}`); + throw error; + } + } + + //============================================== async getDraftsMessages(userId: string, query: MessageListQueryDto) { try { diff --git a/src/modules/email/services/mailbox-resolver.service.ts b/src/modules/email/services/mailbox-resolver.service.ts index 3d28862..78c89b9 100644 --- a/src/modules/email/services/mailbox-resolver.service.ts +++ b/src/modules/email/services/mailbox-resolver.service.ts @@ -1,6 +1,7 @@ import { Injectable, Logger, NotFoundException } from "@nestjs/common"; import { firstValueFrom } from "rxjs"; +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"; @@ -9,8 +10,9 @@ export interface UserMailboxIds { sent: string; drafts: string; trash: string; - junk?: string; - archive?: string; + junk: string; + archive: string; + favorite: string; } @Injectable() @@ -43,6 +45,7 @@ export class MailboxResolverService { trash: this.findMailboxId(mailboxes.results, MailboxEnum.TRASH), junk: this.findMailboxId(mailboxes.results, MailboxEnum.Junk, false), archive: this.findMailboxId(mailboxes.results, MailboxEnum.ARCHIVE, false), + favorite: this.findMailboxId(mailboxes.results, MailboxEnum.FAVORITE, false), }; this.cacheMailboxIds(userId, mailboxIds); @@ -97,6 +100,18 @@ export class MailboxResolverService { return this.getMailboxId(userId, "trash"); } + async getJunkMailboxId(userId: string): Promise { + return this.getMailboxId(userId, "junk"); + } + + async getArchiveMailboxId(userId: string): Promise { + return this.getMailboxId(userId, "archive"); + } + + async getFavoriteMailboxId(userId: string): Promise { + return this.getMailboxId(userId, "favorite"); + } + /** * Clear cache for a specific user */ @@ -146,7 +161,7 @@ export class MailboxResolverService { /** * Find mailbox ID by name */ - private findMailboxId(mailboxes: any[], mailboxName: string, required: boolean = true): string { + private findMailboxId(mailboxes: MailboxInfo[], mailboxName: string, required: boolean = true): string { const mailbox = mailboxes.find((mb) => mb.name === mailboxName || mb.path === mailboxName || mb.specialUse === mailboxName); if (!mailbox && required) { diff --git a/src/modules/mail-server/interfaces/mailboxes-response.interface.ts b/src/modules/mail-server/interfaces/mailboxes-response.interface.ts index 96d79db..a3bb48f 100644 --- a/src/modules/mail-server/interfaces/mailboxes-response.interface.ts +++ b/src/modules/mail-server/interfaces/mailboxes-response.interface.ts @@ -10,6 +10,7 @@ export interface MailboxInfo { size?: number; retention?: number; hidden?: boolean; + encryptMessages?: boolean; } export interface MailboxListResponse {