aboutsummaryrefslogtreecommitdiff
path: root/services/domain/tld.go
blob: 2cb7c05f8e9e1c64aad69124abb45a0649b7e07f (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
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
}