package mail import ( "strconv" mailService "dove/services/mail" "dove/utils/meta" "dove/utils/shortcuts" "github.com/gofiber/fiber/v2" ) func WebMail(context *fiber.Ctx) error { meta.SetPageTitle(context, "WebMail") mailboxIDParam := meta.Request(context).Param("mailbox_id") var mailboxID uint if mailboxIDParam != "" { parsed, _ := strconv.ParseUint(mailboxIDParam, 10, 64) mailboxID = uint(parsed) } folderSlug := context.Query("folder", "inbox") search := context.Query("search") pagination := meta.Paginate(context) sorting := meta.Sort(context, []string{"created_at", "from_address", "subject"}, "created_at") data, serviceError := mailService.WebMailData(mailboxID, folderSlug, search, pagination, sorting) if serviceError != nil { return shortcuts.HandleError(context, serviceError) } return shortcuts.Render(context, "mail/webmail", data) } func WebMailEmails(context *fiber.Ctx) error { folderIDParam := meta.Request(context).Param("folder_id") folderID, parseError := strconv.ParseUint(folderIDParam, 10, 64) if parseError != nil { return shortcuts.BadRequestError(context, parseError) } search := context.Query("search") pagination := meta.Paginate(context) sorting := meta.Sort(context, []string{"created_at", "from_address", "subject"}, "created_at") data := mailService.EmailListData(uint(folderID), search, pagination, sorting) return context.Render("mail/webmail/emails", fiber.Map{ "emails": data.Emails, "total_emails": data.TotalEmails, "search": data.Search, }) } func WebMailStarredEmails(context *fiber.Ctx) error { mailboxIDParam := meta.Request(context).Param("mailbox_id") mailboxID, parseError := strconv.ParseUint(mailboxIDParam, 10, 64) if parseError != nil { return shortcuts.BadRequestError(context, parseError) } search := context.Query("search") pagination := meta.Paginate(context) sorting := meta.Sort(context, []string{"created_at", "from_address", "subject"}, "created_at") data := mailService.StarredEmailListData(uint(mailboxID), search, pagination, sorting) return context.Render("mail/webmail/emails", fiber.Map{ "emails": data.Emails, "total_emails": data.TotalEmails, "search": data.Search, }) } func WebMailPreview(context *fiber.Ctx) error { emailIDParam := meta.Request(context).Param("email_id") emailID, parseError := strconv.ParseUint(emailIDParam, 10, 64) if parseError != nil { return shortcuts.BadRequestError(context, parseError) } mailboxIDParam := meta.Request(context).Param("mailbox_id") mailboxID, _ := strconv.ParseUint(mailboxIDParam, 10, 64) wasUnread := mailService.IsEmailUnread(uint(emailID)) data, serviceError := mailService.EmailPreviewData(uint(emailID), uint(mailboxID)) if serviceError != nil { return shortcuts.HandleError(context, serviceError) } if wasUnread { context.Set("HX-Trigger", "emailReadChanged") } return context.Render("mail/webmail/preview", fiber.Map{ "email": data.Email, "email_body": data.EmailBody, "active_mailbox": data.ActiveMailbox, "folders": data.Folders, "folder_slug": data.Email.Folder.Slug, }) } func WebMailFolders(context *fiber.Ctx) error { mailboxIDParam := meta.Request(context).Param("mailbox_id") mailboxID, parseError := strconv.ParseUint(mailboxIDParam, 10, 64) if parseError != nil { return shortcuts.BadRequestError(context, parseError) } folderSlug := context.Query("folder", "inbox") data, serviceError := mailService.FolderSidebarData(uint(mailboxID), folderSlug) if serviceError != nil { return shortcuts.HandleError(context, serviceError) } return context.Render("mail/webmail/folders", fiber.Map{ "folders": data.Folders, "active_folder": data.ActiveFolder, "active_mailbox": data.ActiveMailbox, "is_starred_view": data.IsStarredView, "starred_count": data.StarredCount, }) } func WebMailCompose(context *fiber.Ctx) error { mailboxIDParam := meta.Request(context).Param("mailbox_id") var mailboxID uint if mailboxIDParam != "" { parsed, _ := strconv.ParseUint(mailboxIDParam, 10, 64) mailboxID = uint(parsed) } replyToParam := context.Query("reply_to") var replyToID uint if replyToParam != "" { parsed, _ := strconv.ParseUint(replyToParam, 10, 64) replyToID = uint(parsed) } data, serviceError := mailService.ComposeData(mailboxID, replyToID) if serviceError != nil { return shortcuts.HandleError(context, serviceError) } return context.Render("mail/webmail/compose", fiber.Map{ "mailboxes": data.Mailboxes, "active_mailbox": data.ActiveMailbox, "from_addresses": data.FromAddresses, "all_recipients": data.AllRecipients, "draft_id": data.DraftID, "reply_to": data.ReplyTo, }) }