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
|
package domain
import (
"strings"
domainModel "dove/models/domain"
domainRepo "dove/repositories/domain"
mailRepo "dove/repositories/mail"
"dove/utils/shortcuts"
"dove/utils/validate"
)
type CreateTLDRequest struct {
Name string `form:"name"`
}
type UpdateTLDRequest struct {
Name string `form:"name"`
}
type EditTLDFormResponse struct {
TLD domainModel.TLD `json:"tld"`
}
func AllTLDs() []domainModel.TLD {
return domainRepo.AllTLDs()
}
func CreateTLD(request CreateTLDRequest) *shortcuts.Error {
name := strings.TrimSpace(strings.ToLower(request.Name))
switch {
case name == "":
return shortcuts.ServiceError(shortcuts.BadRequest, TLDNameRequired)
case !validate.DNSLabel(name):
return shortcuts.ServiceError(shortcuts.BadRequest, TLDNameInvalid)
case domainRepo.FindTLDByName(name) != nil:
return shortcuts.ServiceError(shortcuts.Unprocessable, TLDAlreadyExists)
}
tld := &domainModel.TLD{
Name: name,
IsDefault: false,
}
if createError := domainRepo.CreateTLD(tld); createError != nil {
return shortcuts.ServiceError(shortcuts.Internal, TLDCreationFailed)
}
return nil
}
func EditTLDFormData(tldID uint) (*EditTLDFormResponse, *shortcuts.Error) {
tld := domainRepo.FindTLDByID(tldID)
if tld == nil {
return nil, shortcuts.ServiceError(shortcuts.NotFound, TLDNotFound)
}
if tld.IsDefault {
return nil, shortcuts.ServiceError(shortcuts.Forbidden, TLDProtected)
}
return &EditTLDFormResponse{TLD: *tld}, nil
}
func UpdateTLD(tldID uint, request UpdateTLDRequest) *shortcuts.Error {
tld := domainRepo.FindTLDByID(tldID)
if tld == nil {
return shortcuts.ServiceError(shortcuts.NotFound, TLDNotFound)
}
if tld.IsDefault {
return shortcuts.ServiceError(shortcuts.Forbidden, TLDProtected)
}
newName := strings.TrimSpace(strings.ToLower(request.Name))
switch {
case newName == "":
return shortcuts.ServiceError(shortcuts.BadRequest, TLDNameRequired)
case !validate.DNSLabel(newName):
return shortcuts.ServiceError(shortcuts.BadRequest, TLDNameInvalid)
}
if newName != tld.Name {
if domainRepo.FindTLDByName(newName) != nil {
return shortcuts.ServiceError(shortcuts.Unprocessable, TLDAlreadyExists)
}
}
tld.Name = newName
if updateError := domainRepo.UpdateTLD(tld); updateError != nil {
return shortcuts.ServiceError(shortcuts.Internal, TLDUpdateFailed)
}
domains := domainRepo.FindDomainsByTLDID(tld.ID)
for _, domain := range domains {
mailRepo.RebuildMailboxAddressesByDomainID(domain.ID)
}
return nil
}
func DeleteTLD(name string) *shortcuts.Error {
tld := domainRepo.FindTLDByName(name)
switch {
case tld == nil:
return shortcuts.ServiceError(shortcuts.NotFound, TLDNotFound)
case tld.IsDefault:
return shortcuts.ServiceError(shortcuts.Forbidden, TLDProtected)
case domainRepo.CountDomainsByTLDID(tld.ID) > 0:
return shortcuts.ServiceError(shortcuts.Unprocessable, TLDHasDomains)
}
if deleteError := domainRepo.DeleteTLD(tld); deleteError != nil {
return shortcuts.ServiceError(shortcuts.Internal, TLDDeletionFailed)
}
return nil
}
|