diff options
Diffstat (limited to 'services/mail/aliases.go')
| -rw-r--r-- | services/mail/aliases.go | 76 |
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 +} |
