aboutsummaryrefslogtreecommitdiff
path: root/services/mail/aliases.go
diff options
context:
space:
mode:
Diffstat (limited to 'services/mail/aliases.go')
-rw-r--r--services/mail/aliases.go76
1 files changed, 76 insertions, 0 deletions
diff --git a/services/mail/aliases.go b/services/mail/aliases.go
new file mode 100644
index 0000000..2999681
--- /dev/null
+++ b/services/mail/aliases.go
@@ -0,0 +1,76 @@
+package mail
+
+import (
+ "strings"
+
+ domainRepo "dove/repositories/domain"
+ mailModel "dove/models/mail"
+ mailRepo "dove/repositories/mail"
+ "dove/utils/shortcuts"
+ "dove/utils/validate"
+)
+
+type CreateAliasRequest struct {
+ LocalPart string `form:"local_part"`
+ DomainID uint `form:"domain_id"`
+ MailboxID uint
+}
+
+func CreateAlias(request CreateAliasRequest) *shortcuts.Error {
+ localPart := strings.TrimSpace(request.LocalPart)
+
+ switch {
+ case localPart == "":
+ return shortcuts.ServiceError(shortcuts.BadRequest, LocalPartRequired)
+ case !validate.EmailLocalPart(localPart):
+ return shortcuts.ServiceError(shortcuts.BadRequest, LocalPartInvalid)
+ case request.DomainID == 0:
+ return shortcuts.ServiceError(shortcuts.BadRequest, DomainRequired)
+ case request.MailboxID == 0:
+ return shortcuts.ServiceError(shortcuts.BadRequest, MailboxNotFound)
+ }
+
+ mailbox := mailRepo.FindMailboxByID(request.MailboxID)
+ if mailbox == nil {
+ return shortcuts.ServiceError(shortcuts.NotFound, MailboxNotFound)
+ }
+
+ foundDomain := domainRepo.FindDomainByID(request.DomainID)
+ if foundDomain == nil {
+ return shortcuts.ServiceError(shortcuts.Unprocessable, DomainNotFound)
+ }
+
+ sourceAddress := localPart + "@" + foundDomain.Name + "." + foundDomain.TLD.Name
+
+ if mailRepo.FindMailboxByAddress(sourceAddress) != nil {
+ return shortcuts.ServiceError(shortcuts.Unprocessable, AliasAlreadyExists)
+ }
+
+ if mailRepo.FindAliasByAddress(sourceAddress) != nil {
+ return shortcuts.ServiceError(shortcuts.Unprocessable, AliasAlreadyExists)
+ }
+
+ alias := &mailModel.Alias{
+ SourceAddress: sourceAddress,
+ MailboxID: request.MailboxID,
+ }
+
+ if createError := mailRepo.CreateAlias(alias); createError != nil {
+ return shortcuts.ServiceError(shortcuts.Internal, AliasCreationFailed)
+ }
+
+ return nil
+}
+
+func DeleteAlias(aliasID uint) *shortcuts.Error {
+ alias := mailRepo.FindAliasByID(aliasID)
+ if alias == nil {
+ return shortcuts.ServiceError(shortcuts.NotFound, AliasNotFound)
+ }
+
+ if deleteError := mailRepo.DeleteAlias(alias); deleteError != nil {
+ return shortcuts.ServiceError(shortcuts.Internal, AliasDeletionFailed)
+ }
+
+ return nil
+}