@@ -23,6 +23,7 @@ import (
|
||||
|
||||
"ymhut-box/server/unified-management/internal/config"
|
||||
"ymhut-box/server/unified-management/internal/db"
|
||||
feedbackmail "ymhut-box/server/unified-management/internal/mail"
|
||||
)
|
||||
|
||||
const PackageMagic = "YMHUTFB1"
|
||||
@@ -79,14 +80,70 @@ func NewService(cfg *config.Config, store *db.Store) *Service {
|
||||
|
||||
func (s *Service) Submit(r *http.Request) (db.Feedback, error) {
|
||||
contentType := r.Header.Get("Content-Type")
|
||||
var item db.Feedback
|
||||
var err error
|
||||
if strings.Contains(contentType, "multipart/form-data") {
|
||||
if item, err := s.submitMultipart(r); err == nil {
|
||||
if item, err = s.submitMultipart(r); err == nil {
|
||||
if !DuplicateSubmission(r) && s.NotifyFeedback(item) == nil {
|
||||
item.MailSent = true
|
||||
}
|
||||
return item, nil
|
||||
} else if hasSignedFields(r) || !strings.Contains(strings.ToLower(err.Error()), "signed multipart fields are required") {
|
||||
return db.Feedback{}, err
|
||||
}
|
||||
}
|
||||
return s.submitSimple(r)
|
||||
item, err = s.submitSimple(r)
|
||||
if err == nil && s.NotifyFeedback(item) == nil {
|
||||
item.MailSent = true
|
||||
}
|
||||
return item, err
|
||||
}
|
||||
|
||||
func (s *Service) RetryMail(code string) error {
|
||||
item, err := s.store.GetFeedback(NormalizeCode(code))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return s.NotifyFeedback(item)
|
||||
}
|
||||
|
||||
func (s *Service) NotifyFeedback(item db.Feedback) error {
|
||||
message, err := feedbackmail.BuildFeedbackMessage(s.cfg, item)
|
||||
if err != nil {
|
||||
_, _ = s.store.InsertMailRecord(db.LegacyMailRecord{
|
||||
FeedbackCode: item.Code,
|
||||
Kind: "feedback",
|
||||
Status: "failed",
|
||||
Subject: "反馈邮件未发送",
|
||||
ErrorMessage: err.Error(),
|
||||
CreatedAt: db.Now(),
|
||||
})
|
||||
_ = s.store.UpdateFeedbackMailState(item.Code, false)
|
||||
return err
|
||||
}
|
||||
mailID, err := s.store.InsertMailRecord(db.LegacyMailRecord{
|
||||
FeedbackCode: item.Code,
|
||||
Kind: "feedback",
|
||||
Status: "pending",
|
||||
ToAddress: message.To,
|
||||
Subject: message.Subject,
|
||||
PlainBody: message.PlainBody,
|
||||
HTMLBody: message.HTMLBody,
|
||||
AttachmentPath: message.AttachmentPath,
|
||||
AttachmentName: message.AttachmentName,
|
||||
CreatedAt: db.Now(),
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if err := feedbackmail.Send(s.cfg, message); err != nil {
|
||||
_ = s.store.UpdateMailState(mailID, "failed", err.Error())
|
||||
_ = s.store.UpdateFeedbackMailState(item.Code, false)
|
||||
return err
|
||||
}
|
||||
_ = s.store.UpdateMailState(mailID, "sent", "")
|
||||
_ = s.store.UpdateFeedbackMailState(item.Code, true)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *Service) submitSimple(r *http.Request) (db.Feedback, error) {
|
||||
|
||||
Reference in New Issue
Block a user