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 }