From b77d75f05fb2059389c05f6c01484e0cd12e796e Mon Sep 17 00:00:00 2001 From: Bobby <30593201+luciferreeves@users.noreply.github.com> Date: Wed, 24 Dec 2025 13:50:07 +0530 Subject: feat: introduce email folder synchronization and management, refactor email services, and update UI styles --- services/emails.go | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++ services/folders.go | 22 ++++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 services/emails.go create mode 100644 services/folders.go (limited to 'services') diff --git a/services/emails.go b/services/emails.go new file mode 100644 index 0000000..e007f87 --- /dev/null +++ b/services/emails.go @@ -0,0 +1,58 @@ +package services + +import ( + "lain/jobs" + "lain/models" + "lain/repository" + "lain/utils/format" + "net/url" + "strings" + + "github.com/gofiber/fiber/v2" +) + +func GetEmails(userEmail, folderPath string, prefs *models.Preferences, page int) ([]fiber.Map, error) { + decodedPath, _ := url.QueryUnescape(folderPath) + + folder, err := repository.GetFolderByIMAPName(userEmail, strings.ToLower(decodedPath)) + if err != nil { + return nil, err + } + + emailCount, _ := repository.CountEmailsInFolder(userEmail, folder.ID) + if emailCount == 0 { + jobs.SyncEmails(userEmail, folder.ID, folder.IMAPName) + } + + limit := prefs.EmailsPerPage + offset := (page - 1) * limit + + messages, err := repository.GetEmailsByFolder(userEmail, folder.ID, limit, offset) + if err != nil { + return []fiber.Map{}, err + } + + var emails []fiber.Map + for _, message := range messages { + fromName := message.FromName + if fromName == "" { + fromName = message.From + } + + emails = append(emails, fiber.Map{ + "ID": message.ID, + "UID": message.UID, + "From": format.DecodeHTML(message.From), + "FromName": format.DecodeHTML(fromName), + "Subject": format.DecodeHTML(message.Subject), + "Date": message.Date, + "DateFormatted": format.FormatEmailDate(message.Date, prefs.DateFormat, prefs.TimeFormat, prefs.PrettyDates, prefs.TimeZone), + "Snippet": format.DecodeHTML(message.Snippet), + "IsRead": message.IsRead, + "IsFlagged": message.IsFlagged, + "HasAttachment": message.HasAttachment, + }) + } + + return emails, nil +} diff --git a/services/folders.go b/services/folders.go new file mode 100644 index 0000000..9555172 --- /dev/null +++ b/services/folders.go @@ -0,0 +1,22 @@ +package services + +import ( + "lain/data" + "lain/jobs" + "lain/repository" + + "github.com/gofiber/fiber/v2" +) + +func GetFolders(userEmail, activeFolder string) []fiber.Map { + count, _ := repository.CountFolders(userEmail) + if count == 0 { + jobs.SyncFolders(userEmail, data.FolderIcons) + } + + return repository.BuildFolderTree(userEmail, activeFolder) +} + +func GetFolderDisplayName(userEmail, folderPath string) string { + return repository.GetFolderDisplayName(userEmail, folderPath) +} -- cgit v1.2.3