Некоторые проверки не удались
CI / test (push) Successful in 2m5s
Docker / Build and publish worker image (push) Failing after 31s
91 строка
2.0 KiB
Go
91 строка
2.0 KiB
Go
package sender
|
|
|
|
import (
|
|
"errors"
|
|
"log"
|
|
"time"
|
|
|
|
"rocketgit.ru/rsmon/worker/app/models"
|
|
)
|
|
|
|
// Run provides functionality.
|
|
func Run() {
|
|
messages := make([]models.Message, 0)
|
|
|
|
tx := models.DB().Begin().Set("gorm:association_autoupdate", false)
|
|
|
|
q := tx
|
|
// q = q.Set("gorm:query_option", "FOR UPDATE")
|
|
err := models.MessageScope(q).Where("state IN ('queued')").Find(&messages).Error
|
|
if err != nil {
|
|
tx.Rollback()
|
|
log.Println(err)
|
|
return
|
|
// panic(err)
|
|
}
|
|
|
|
for _, msg := range messages { //nolint:gocritic // range copy is acceptable here
|
|
msg.State = "sending"
|
|
tx.Model(&msg).Update("state", "sending")
|
|
// spew.Dump(msg.ID)
|
|
// err = tx.Save(&msg).Error
|
|
// if err != nil {
|
|
// panic(err)
|
|
// }
|
|
}
|
|
_ = tx.Commit()
|
|
|
|
for _, msg := range messages { //nolint:gocritic // range copy is acceptable here
|
|
_, _ = RunMessage(&msg)
|
|
}
|
|
}
|
|
|
|
// RunMessage provides functionality.
|
|
func RunMessage(message *models.Message) (*string, error) {
|
|
var err error
|
|
var response *string
|
|
|
|
log.Println("send message", message.ID)
|
|
switch message.Contact.Kind {
|
|
case "telegram_group", "telegram_private":
|
|
err = RunTelegram(message)
|
|
case "email":
|
|
err = RunEmail(message)
|
|
case "webhook":
|
|
response, err = RunWebhook(message)
|
|
case "mattermost":
|
|
response, err = RunMattermost(message)
|
|
case "sms":
|
|
err = RunSMS(message)
|
|
case "voice":
|
|
err = RunVoice(message)
|
|
default:
|
|
err = errors.New("notification kind not implemented: " + message.Contact.Kind)
|
|
}
|
|
if response != nil {
|
|
log.Println("notification done. response:", *response, "error:", err)
|
|
} else {
|
|
log.Println("notification done. error:", err)
|
|
}
|
|
|
|
if message.ID != 0 {
|
|
if response != nil {
|
|
message.Response = response
|
|
}
|
|
if err == nil {
|
|
message.State = "sent"
|
|
message.SentAt = time.Now()
|
|
} else {
|
|
message.State = "error"
|
|
et := err.Error()
|
|
message.Error = &et
|
|
}
|
|
err = models.DB().Save(&message).Error
|
|
if err != nil {
|
|
log.Println("ERROR:", err)
|
|
return response, err
|
|
}
|
|
}
|
|
return response, err
|
|
}
|