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
|
package jobs
import (
"lain/models"
"lain/repository"
"lain/types"
"lain/utils/crypto"
"lain/utils/email"
"strings"
)
func SyncFolders(userEmail string, iconMap map[string]types.FolderIconVariant) error {
prefs, err := repository.GetPreferencesByEmail(userEmail)
if err != nil {
return err
}
password, err := crypto.Decrypt(prefs.Authorization)
if err != nil {
return err
}
client, err := email.ConnectIMAP(userEmail, password)
if err != nil {
return err
}
defer email.DisconnectIMAP(client)
imapFolders, err := email.FetchFolders(client)
if err != nil {
return err
}
foldersByName := make(map[string]uint)
for i, imapFolder := range imapFolders {
if email.IsVirtualFolder(imapFolder.Name) {
continue
}
existingFolder, err := repository.GetFolderByIMAPName(userEmail, imapFolder.Name)
sortOrder := email.GetSortOrder(imapFolder.Name, i)
folderType := email.GetFolderType(imapFolder.Name, iconMap)
iconVariant := iconMap[folderType]
if err != nil {
folder := models.Folder{
UserEmail: userEmail,
Name: imapFolder.Name,
IMAPName: imapFolder.Name,
IconOpen: iconVariant.Open,
IconClose: iconVariant.Close,
SortOrder: sortOrder,
}
created, err := repository.CreateFolder(&folder)
if err != nil {
continue
}
foldersByName[strings.ToLower(imapFolder.Name)] = created.ID
} else {
existingFolder.Name = imapFolder.Name
existingFolder.SortOrder = sortOrder
existingFolder.IconOpen = iconVariant.Open
existingFolder.IconClose = iconVariant.Close
repository.UpdateFolder(existingFolder)
foldersByName[strings.ToLower(imapFolder.Name)] = existingFolder.ID
}
}
for _, imapFolder := range imapFolders {
if email.IsVirtualFolder(imapFolder.Name) {
continue
}
if strings.Contains(imapFolder.Name, "/") {
parts := strings.Split(imapFolder.Name, "/")
if len(parts) > 1 {
parentName := strings.Join(parts[:len(parts)-1], "/")
parentNameLower := strings.ToLower(parentName)
if parentID, ok := foldersByName[parentNameLower]; ok {
folder, err := repository.GetFolderByIMAPName(userEmail, imapFolder.Name)
if err == nil {
folder.ParentID = &parentID
repository.UpdateFolder(folder)
}
}
}
}
}
return nil
}
|