summaryrefslogtreecommitdiff
path: root/services
diff options
context:
space:
mode:
authorBobby <[email protected]>2025-12-24 13:50:07 +0530
committerBobby <[email protected]>2025-12-24 13:50:07 +0530
commitb77d75f05fb2059389c05f6c01484e0cd12e796e (patch)
treee3c5521bf9ed3fcffd59960053d651091496a7ea /services
parent81ab367f440d6f85297b2013d0c1aa57fda7e9cd (diff)
downloadlain-b77d75f05fb2059389c05f6c01484e0cd12e796e.tar.xz
lain-b77d75f05fb2059389c05f6c01484e0cd12e796e.zip
feat: introduce email folder synchronization and management, refactor email services, and update UI styles
Diffstat (limited to 'services')
-rw-r--r--services/emails.go58
-rw-r--r--services/folders.go22
2 files changed, 80 insertions, 0 deletions
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)
+}