diff options
| author | Bobby <[email protected]> | 2026-03-08 08:11:41 +0530 |
|---|---|---|
| committer | Bobby <[email protected]> | 2026-03-08 08:11:41 +0530 |
| commit | b2a231280ce3265d20cdc5f317ae1bcc5eb59924 (patch) | |
| tree | 90eb1a5f5409025db47097e2e083361f8fa52555 /controllers | |
| parent | 662dd2069dc8590e8b54823a33726464cf10c4e7 (diff) | |
| download | dove-b2a231280ce3265d20cdc5f317ae1bcc5eb59924.tar.xz dove-b2a231280ce3265d20cdc5f317ae1bcc5eb59924.zip | |
Add webmail email management templates and storage utilities
- Implemented email listing template with read/unread and star functionality.
- Created empty state template for webmail when no emails are present.
- Developed folder navigation template for managing email folders.
- Added email preview template for displaying selected email details.
- Introduced storage utilities for managing email files, including creation, reading, moving, and deletion.
- Defined constants for storage paths and error messages related to file operations.
Diffstat (limited to 'controllers')
| -rw-r--r-- | controllers/mail/webmail.go | 187 |
1 files changed, 187 insertions, 0 deletions
diff --git a/controllers/mail/webmail.go b/controllers/mail/webmail.go new file mode 100644 index 0000000..4524375 --- /dev/null +++ b/controllers/mail/webmail.go @@ -0,0 +1,187 @@ +package mail + +import ( + "fmt" + "strconv" + + mailService "dove/services/mail" + "dove/utils/meta" + "dove/utils/shortcuts" + + "github.com/gofiber/fiber/v2" +) + +func triggerEvent(context *fiber.Ctx, eventName string) error { + context.Set("HX-Trigger", eventName) + return context.SendStatus(fiber.StatusNoContent) +} + +func SendEmail(context *fiber.Ctx) error { + body, parseError := meta.Body[mailService.SendEmailRequest](context) + if parseError != nil { + return shortcuts.BadRequestError(context, parseError) + } + + serviceError := mailService.SendEmail(body) + if serviceError != nil { + return shortcuts.HandleError(context, serviceError) + } + + redirectPath := fmt.Sprintf("/mail/webmail/%d?folder=sent", body.FromMailboxID) + return shortcuts.RedirectToPath(context, redirectPath) +} + +func SaveDraft(context *fiber.Ctx) error { + body, parseError := meta.Body[mailService.SendEmailRequest](context) + if parseError != nil { + return shortcuts.BadRequestError(context, parseError) + } + + draft, serviceError := mailService.SaveDraft(body) + if serviceError != nil { + return shortcuts.HandleError(context, serviceError) + } + + return context.JSON(fiber.Map{ + "draft_id": draft.ID, + "message": "Draft saved.", + }) +} + +func ToggleStar(context *fiber.Ctx) error { + emailID, parseError := strconv.ParseUint(meta.Request(context).Param("email_id"), 10, 64) + if parseError != nil { + return shortcuts.BadRequestError(context, parseError) + } + + serviceError := mailService.ToggleStar(uint(emailID)) + if serviceError != nil { + return shortcuts.HandleError(context, serviceError) + } + + return triggerEvent(context, "emailStarred") +} + +func MarkReadEmail(context *fiber.Ctx) error { + emailID, parseError := strconv.ParseUint(meta.Request(context).Param("email_id"), 10, 64) + if parseError != nil { + return shortcuts.BadRequestError(context, parseError) + } + + serviceError := mailService.MarkRead(uint(emailID)) + if serviceError != nil { + return shortcuts.HandleError(context, serviceError) + } + + return triggerEvent(context, "emailReadChanged") +} + +func MarkUnreadEmail(context *fiber.Ctx) error { + emailID, parseError := strconv.ParseUint(meta.Request(context).Param("email_id"), 10, 64) + if parseError != nil { + return shortcuts.BadRequestError(context, parseError) + } + + serviceError := mailService.MarkUnread(uint(emailID)) + if serviceError != nil { + return shortcuts.HandleError(context, serviceError) + } + + return triggerEvent(context, "emailReadChanged") +} + +func MoveEmailToFolder(context *fiber.Ctx) error { + emailID, parseError := strconv.ParseUint(meta.Request(context).Param("email_id"), 10, 64) + if parseError != nil { + return shortcuts.BadRequestError(context, parseError) + } + + body, bodyError := meta.Body[mailService.MoveEmailRequest](context) + if bodyError != nil { + return shortcuts.BadRequestError(context, bodyError) + } + + serviceError := mailService.MoveEmail(uint(emailID), body) + if serviceError != nil { + return shortcuts.HandleError(context, serviceError) + } + + return triggerEvent(context, "emailMoved") +} + +func TrashEmailAction(context *fiber.Ctx) error { + emailID, parseError := strconv.ParseUint(meta.Request(context).Param("email_id"), 10, 64) + if parseError != nil { + return shortcuts.BadRequestError(context, parseError) + } + + mailboxID, mailboxParseError := strconv.ParseUint(meta.Request(context).Param("mailbox_id"), 10, 64) + if mailboxParseError != nil { + return shortcuts.BadRequestError(context, mailboxParseError) + } + + serviceError := mailService.TrashEmail(uint(emailID), uint(mailboxID)) + if serviceError != nil { + return shortcuts.HandleError(context, serviceError) + } + + return triggerEvent(context, "emailDeleted") +} + +func BulkEmailAction(context *fiber.Ctx) error { + mailboxID, parseError := strconv.ParseUint(meta.Request(context).Param("mailbox_id"), 10, 64) + if parseError != nil { + return shortcuts.BadRequestError(context, parseError) + } + + body, bodyError := meta.Body[mailService.BulkActionRequest](context) + if bodyError != nil { + return shortcuts.BadRequestError(context, bodyError) + } + + serviceError := mailService.BulkAction(body, uint(mailboxID)) + if serviceError != nil { + return shortcuts.HandleError(context, serviceError) + } + + return triggerEvent(context, "emailMoved") +} + +func CreateWebMailFolder(context *fiber.Ctx) error { + mailboxID, parseError := strconv.ParseUint(meta.Request(context).Param("mailbox_id"), 10, 64) + if parseError != nil { + return shortcuts.BadRequestError(context, parseError) + } + + body, bodyError := meta.Body[mailService.CreateFolderRequest](context) + if bodyError != nil { + return shortcuts.BadRequestError(context, bodyError) + } + + body.MailboxID = uint(mailboxID) + + serviceError := mailService.CreateFolder(body) + if serviceError != nil { + return shortcuts.HandleError(context, serviceError) + } + + redirectPath := fmt.Sprintf("/mail/webmail/%d", mailboxID) + return shortcuts.RedirectToPath(context, redirectPath) +} + +func DeleteWebMailFolder(context *fiber.Ctx) error { + folderID, parseError := strconv.ParseUint(meta.Request(context).Param("folder_id"), 10, 64) + if parseError != nil { + return shortcuts.BadRequestError(context, parseError) + } + + mailboxID, _ := strconv.ParseUint(meta.Request(context).Param("mailbox_id"), 10, 64) + + serviceError := mailService.DeleteFolder(uint(folderID)) + if serviceError != nil { + return shortcuts.HandleError(context, serviceError) + } + + redirectPath := fmt.Sprintf("/mail/webmail/%d", mailboxID) + return shortcuts.RedirectToPath(context, redirectPath) +} |
