aboutsummaryrefslogtreecommitdiff
path: root/controllers
diff options
context:
space:
mode:
authorBobby <[email protected]>2026-03-08 08:11:41 +0530
committerBobby <[email protected]>2026-03-08 08:11:41 +0530
commitb2a231280ce3265d20cdc5f317ae1bcc5eb59924 (patch)
tree90eb1a5f5409025db47097e2e083361f8fa52555 /controllers
parent662dd2069dc8590e8b54823a33726464cf10c4e7 (diff)
downloaddove-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.go187
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)
+}