1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
|
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
}
|