summaryrefslogtreecommitdiff
path: root/jobs/folders.go
blob: c09b265da677dad910b0e41c58ec617f8617b85c (plain)
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
}