diff --git a/src/common/enums/message.enum.ts b/src/common/enums/message.enum.ts index 7455de2..13b5745 100755 --- a/src/common/enums/message.enum.ts +++ b/src/common/enums/message.enum.ts @@ -203,6 +203,7 @@ export const enum EmailMessage { MESSAGE_MOVED_TO_TRASH_SUCCESSFULLY = "پیام با موفقیت به سطل زباله منتقل شد", MESSAGE_MOVED_TO_INBOX_FROM_ARCHIVE_SUCCESSFULLY = "پیام با موفقیت از آرشیو به صندوق ورودی منتقل شد", MESSAGE_MOVED_TO_INBOX_FROM_FAVORITE_SUCCESSFULLY = "پیام با موفقیت از علاقه مندی ها به صندوق ورودی منتقل شد", + MESSAGE_MOVED_TO_INBOX_FROM_TRASH_SUCCESSFULLY = "پیام با موفقیت از سطل زباله به صندوق ورودی منتقل شد", MESSAGE_NOT_FOUND = "پیام یافت نشد", } diff --git a/src/modules/email/email.controller.ts b/src/modules/email/email.controller.ts index dfbb2cc..0e4cc6f 100644 --- a/src/modules/email/email.controller.ts +++ b/src/modules/email/email.controller.ts @@ -190,4 +190,13 @@ export class EmailController { moveMessageToInboxFromFavorite(@UserDec("wildduckUserId") userId: string, @Param() params: MessageParamDto) { return this.emailService.moveMessageToInboxFromFavorite(userId, Number(params.messageId)); } + + @Patch("messages/:messageId/restore") + @ApiOperation({ summary: "Restore a message from trash back to inbox" }) + @ApiResponse({ status: 200, description: "Message restored from trash to inbox successfully" }) + @ApiResponse({ status: 404, description: "Message not found in trash" }) + @ApiResponse({ status: 403, description: "Not authorized to restore message" }) + moveMessageToInboxFromTrash(@UserDec("wildduckUserId") userId: string, @Param() params: MessageParamDto) { + return this.emailService.moveMessageToInboxFromTrash(userId, Number(params.messageId)); + } } diff --git a/src/modules/email/services/email.service.ts b/src/modules/email/services/email.service.ts index 6dfae53..e65c67c 100644 --- a/src/modules/email/services/email.service.ts +++ b/src/modules/email/services/email.service.ts @@ -663,4 +663,45 @@ export class EmailService { throw error; } } + + //============================================== + async moveMessageToInboxFromTrash(userId: string, messageId: number) { + this.logger.log(`Moving message ${messageId} from trash to inbox for user: ${userId}`); + + try { + const inboxMailboxId = await this.mailboxResolverService.getInboxMailboxId(userId); + const trashMailboxId = await this.mailboxResolverService.getTrashMailboxId(userId); + + const result = await firstValueFrom( + this.mailServerService.messages.updateMessage(userId, trashMailboxId, messageId, { + moveTo: inboxMailboxId, + }), + ); + + // Emit WebSocket notification + const payload: EmailMovePayload = { + messageId, + userId, + fromMailboxId: trashMailboxId, + toMailboxId: inboxMailboxId, + fromMailboxName: "Trash", + toMailboxName: "Inbox", + timestamp: new Date().toISOString(), + }; + await this.emailGateway.notifyMessageMoved(payload); + + this.logger.log(`Message ${messageId} moved from trash to inbox successfully`); + + return { + success: true, + message: EmailMessage.MESSAGE_MOVED_TO_INBOX_FROM_TRASH_SUCCESSFULLY, + result, + }; + } catch (error) { + this.logger.error( + `Failed to move message ${messageId} from trash to inbox for user ${userId}: ${error instanceof Error ? error.message : "Unknown error"}`, + ); + throw error; + } + } }