package mail import ( "dove/database" "dove/models/mail" "dove/utils/meta" ) func CreateEmail(email *mail.Email) error { return database.DB.Create(email).Error } func CreateAttachment(attachment *mail.Attachment) error { return database.DB.Create(attachment).Error } func ListEmails(pagination meta.Pagination, sorting meta.Sorting, search string) ([]mail.Email, int64) { var emails []mail.Email var total int64 query := database.DB.Model(&mail.Email{}) if search != "" { like := "%" + search + "%" query = query.Where("from_address LIKE ? OR to_addresses LIKE ? OR subject LIKE ?", like, like, like) } query.Count(&total) pagination.Apply(sorting.Apply(query)).Preload("Tags").Find(&emails) return emails, total } func CountEmails() int64 { var count int64 database.DB.Model(&mail.Email{}).Count(&count) return count } func ListEmailsByMailbox(mailboxID uint, pagination meta.Pagination, sorting meta.Sorting) ([]mail.Email, int64) { var emails []mail.Email var total int64 query := database.DB.Model(&mail.Email{}).Where("mailbox_id = ?", mailboxID) query.Count(&total) pagination.Apply(sorting.Apply(query)).Preload("Tags").Find(&emails) return emails, total } func ListEmailsByFolder(folderID uint, pagination meta.Pagination, sorting meta.Sorting, search string) ([]mail.Email, int64) { var emails []mail.Email var total int64 query := database.DB.Model(&mail.Email{}).Where("folder_id = ?", folderID) if search != "" { like := "%" + search + "%" query = query.Where("from_address LIKE ? OR to_addresses LIKE ? OR subject LIKE ?", like, like, like) } query.Count(&total) pagination.Apply(sorting.Apply(query)).Preload("Tags").Find(&emails) return emails, total } func ListStarredEmails(mailboxID uint, pagination meta.Pagination, sorting meta.Sorting, search string) ([]mail.Email, int64) { var emails []mail.Email var total int64 query := database.DB.Model(&mail.Email{}).Where("mailbox_id = ? AND is_starred = ?", mailboxID, true) if search != "" { like := "%" + search + "%" query = query.Where("from_address LIKE ? OR to_addresses LIKE ? OR subject LIKE ?", like, like, like) } query.Count(&total) pagination.Apply(sorting.Apply(query)).Preload("Tags").Find(&emails) return emails, total } func FindEmailByID(emailID uint) *mail.Email { var email mail.Email result := database.DB.Preload("Tags").First(&email, emailID) if result.Error != nil { return nil } return &email } func FindEmailByIDWithRelations(emailID uint) *mail.Email { var email mail.Email result := database.DB.Preload("Tags").Preload("Mailbox").Preload("Folder").First(&email, emailID) if result.Error != nil { return nil } return &email } func UpdateEmail(email *mail.Email) error { return database.DB.Save(email).Error } func DeleteEmail(email *mail.Email) error { return database.DB.Delete(email).Error } func MarkEmailAsRead(emailID uint) error { return database.DB.Model(&mail.Email{}).Where("id = ?", emailID).Update("is_read", true).Error } func MarkEmailAsUnread(emailID uint) error { return database.DB.Model(&mail.Email{}).Where("id = ?", emailID).Update("is_read", false).Error } func ToggleEmailStar(emailID uint) error { return database.DB.Model(&mail.Email{}).Where("id = ?", emailID).Update("is_starred", database.DB.Raw("NOT is_starred")).Error } func MoveEmailToFolder(emailID uint, folderID uint) error { return database.DB.Model(&mail.Email{}).Where("id = ?", emailID).Update("folder_id", folderID).Error } func BulkMoveEmails(emailIDs []uint, folderID uint) error { return database.DB.Model(&mail.Email{}).Where("id IN ?", emailIDs).Update("folder_id", folderID).Error } func BulkMarkAsRead(emailIDs []uint) error { return database.DB.Model(&mail.Email{}).Where("id IN ?", emailIDs).Update("is_read", true).Error } func BulkMarkAsUnread(emailIDs []uint) error { return database.DB.Model(&mail.Email{}).Where("id IN ?", emailIDs).Update("is_read", false).Error } func BulkDeleteEmails(emailIDs []uint) error { return database.DB.Where("id IN ?", emailIDs).Delete(&mail.Email{}).Error } func CountUnreadByFolderID(folderID uint) int64 { var count int64 database.DB.Model(&mail.Email{}).Where("folder_id = ? AND is_read = ?", folderID, false).Count(&count) return count } func CountEmailsByFolderID(folderID uint) int64 { var count int64 database.DB.Model(&mail.Email{}).Where("folder_id = ?", folderID).Count(&count) return count } func CountStarredByMailboxID(mailboxID uint) int64 { var count int64 database.DB.Model(&mail.Email{}).Where("mailbox_id = ? AND is_starred = ?", mailboxID, true).Count(&count) return count } func AllMailboxes() []mail.Mailbox { var mailboxes []mail.Mailbox database.DB.Preload("User").Preload("Domain").Preload("Domain.TLD").Preload("Aliases").Order("address ASC").Find(&mailboxes) return mailboxes }