package mail import ( "strings" "dove/database" "dove/models/mail" "dove/utils/meta" "gorm.io/gorm" ) func FindMailboxByAddress(address string) *mail.Mailbox { var mailbox mail.Mailbox result := database.DB.Where("address = ?", address).First(&mailbox) if result.Error == gorm.ErrRecordNotFound { return nil } return &mailbox } func FindMailboxByAlias(aliasAddress string) *mail.Mailbox { var alias mail.Alias result := database.DB.Where("source_address = ?", aliasAddress).Preload("Mailbox").First(&alias) if result.Error != nil { return nil } return &alias.Mailbox } func CreateMailbox(mailbox *mail.Mailbox) error { return database.DB.Create(mailbox).Error } func ListMailboxes(pagination meta.Pagination, sorting meta.Sorting, search string) ([]mail.Mailbox, int64) { var mailboxes []mail.Mailbox var total int64 query := database.DB.Model(&mail.Mailbox{}) if search != "" { like := "%" + search + "%" query = query.Where("address LIKE ?", like) } query.Count(&total) pagination.Apply(sorting.Apply(query)).Preload("User").Preload("Domain").Preload("Domain.TLD").Find(&mailboxes) return mailboxes, total } func FindMailboxByID(mailboxID uint) *mail.Mailbox { var mailbox mail.Mailbox result := database.DB.First(&mailbox, mailboxID) if result.Error == gorm.ErrRecordNotFound { return nil } return &mailbox } func UpdateMailbox(mailbox *mail.Mailbox) error { return database.DB.Save(mailbox).Error } func DeleteMailbox(mailbox *mail.Mailbox) error { return database.DB.Delete(mailbox).Error } func FindMailboxByIDWithRelations(mailboxID uint) *mail.Mailbox { var mailbox mail.Mailbox result := database.DB.Preload("User").Preload("Domain").Preload("Domain.TLD").First(&mailbox, mailboxID) if result.Error == gorm.ErrRecordNotFound { return nil } return &mailbox } func RebuildMailboxAddressesByDomainID(domainID uint) error { var mailboxes []mail.Mailbox database.DB.Where("domain_id = ?", domainID).Preload("Domain").Preload("Domain.TLD").Find(&mailboxes) for index := range mailboxes { localPart := strings.Split(mailboxes[index].Address, "@")[0] mailboxes[index].Address = localPart + "@" + mailboxes[index].Domain.Name + "." + mailboxes[index].Domain.TLD.Name database.DB.Save(&mailboxes[index]) } return nil } func CountMailboxesByDomainID(domainID uint) int64 { var count int64 database.DB.Model(&mail.Mailbox{}).Where("domain_id = ?", domainID).Count(&count) return count } func CountMailboxes() int64 { var count int64 database.DB.Model(&mail.Mailbox{}).Count(&count) return count }