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) }