package mail import ( "strings" domainModel "dove/models/domain" mailModel "dove/models/mail" domainRepo "dove/repositories/domain" mailRepo "dove/repositories/mail" "dove/utils/meta" "dove/utils/shortcuts" "dove/utils/validate" ) type CreateMailboxRequest struct { LocalPart string `form:"local_part"` DomainID uint `form:"domain_id"` UserID uint `form:"user_id"` } type UpdateMailboxRequest struct { UserID uint `form:"user_id"` } type MailboxFormResponse struct { Users []mailModel.User `json:"users"` Domains []domainModel.Domain `json:"domains"` } type EditMailboxFormResponse struct { Mailbox mailModel.Mailbox `json:"mailbox"` Users []mailModel.User `json:"users"` Aliases []mailModel.Alias `json:"aliases"` Domains []domainModel.Domain `json:"domains"` } func ListMailboxes(pagination meta.Pagination, sorting meta.Sorting, search string) meta.PaginatedResponse { mailboxes, total := mailRepo.ListMailboxes(pagination, sorting, search) return pagination.Response(mailboxes, total) } func MailboxFormData() MailboxFormResponse { return MailboxFormResponse{ Users: mailRepo.AllUsers(), Domains: domainRepo.AllDomains(), } } func CreateMailbox(request CreateMailboxRequest) *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.UserID == 0: return shortcuts.ServiceError(shortcuts.BadRequest, UserRequired) } if mailRepo.FindUserByID(request.UserID) == nil { return shortcuts.ServiceError(shortcuts.Unprocessable, UserNotFound) } foundDomain := domainRepo.FindDomainByID(request.DomainID) if foundDomain == nil { return shortcuts.ServiceError(shortcuts.Unprocessable, DomainNotFound) } address := localPart + "@" + foundDomain.Name + "." + foundDomain.TLD.Name if mailRepo.FindMailboxByAddress(address) != nil { return shortcuts.ServiceError(shortcuts.Unprocessable, AlreadyExists) } mailbox := &mailModel.Mailbox{ Address: address, UserID: request.UserID, DomainID: request.DomainID, } if createError := mailRepo.CreateMailbox(mailbox); createError != nil { return shortcuts.ServiceError(shortcuts.Internal, CreationFailed) } if seedError := mailRepo.SeedFoldersForMailbox(mailbox.ID); seedError != nil { return shortcuts.ServiceError(shortcuts.Internal, FolderSeedFailed) } return nil } func EditMailboxFormData(mailboxID uint) (*EditMailboxFormResponse, *shortcuts.Error) { mailbox := mailRepo.FindMailboxByIDWithRelations(mailboxID) if mailbox == nil { return nil, shortcuts.ServiceError(shortcuts.NotFound, MailboxNotFound) } return &EditMailboxFormResponse{ Mailbox: *mailbox, Users: mailRepo.AllUsers(), Aliases: mailRepo.FindAliasesByMailboxID(mailboxID), Domains: domainRepo.AllDomains(), }, nil } func UpdateMailbox(mailboxID uint, request UpdateMailboxRequest) *shortcuts.Error { mailbox := mailRepo.FindMailboxByID(mailboxID) if mailbox == nil { return shortcuts.ServiceError(shortcuts.NotFound, MailboxNotFound) } if request.UserID == 0 { return shortcuts.ServiceError(shortcuts.BadRequest, UserRequired) } if mailRepo.FindUserByID(request.UserID) == nil { return shortcuts.ServiceError(shortcuts.Unprocessable, UserNotFound) } mailbox.UserID = request.UserID if updateError := mailRepo.UpdateMailbox(mailbox); updateError != nil { return shortcuts.ServiceError(shortcuts.Internal, MailboxUpdateFailed) } return nil } func DeleteMailbox(mailboxID uint) *shortcuts.Error { mailbox := mailRepo.FindMailboxByID(mailboxID) if mailbox == nil { return shortcuts.ServiceError(shortcuts.NotFound, MailboxNotFound) } if deleteError := mailRepo.DeleteMailbox(mailbox); deleteError != nil { return shortcuts.ServiceError(shortcuts.Internal, DeletionFailed) } return nil }