package mail import ( "strings" mailModel "dove/models/mail" domainRepo "dove/repositories/domain" 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 }