2023-08-28 14:51:31 +08:00

93 lines
2.9 KiB
Go

/*******************************************************************************
* Copyright 2017.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*******************************************************************************/
package webapi
import (
"encoding/json"
"github.com/kirinlabs/HttpRequest"
"github.com/winc-link/hummingbird/internal/models"
"github.com/winc-link/hummingbird/internal/pkg/di"
"github.com/winc-link/hummingbird/internal/pkg/logger"
"time"
)
type WebApiClient struct {
lc logger.LoggingClient
p *di.Container
}
type WebApiTemplate struct {
Product struct {
ProductId string `json:"product_id"`
ProductName string `json:"product_name"`
} `json:"product"`
Device struct {
DeviceId string `json:"device_id"`
DeviceName string `json:"device_name"`
} `json:"device"`
Rule struct {
RuleId string `json:"rule_id"`
RuleName string `json:"rule_name"`
AlertLevel string `json:"alert_level"`
Trigger string `json:"trigger,omitempty"`
TriggerTime int64 `json:"trigger_time,omitempty"`
} `json:"rule"`
Message string `json:"message"`
}
func (d *WebApiClient) generateWebApiTemplate(rule models.AlertRule, device models.Device, product models.Product, message map[string]interface{}) WebApiTemplate {
var temp WebApiTemplate
msg, _ := json.Marshal(message)
temp.Message = string(msg)
temp.Product.ProductId = product.Id
temp.Product.ProductName = product.Name
temp.Device.DeviceId = device.Id
temp.Device.DeviceName = device.Name
temp.Rule.RuleId = rule.Id
temp.Rule.RuleName = rule.Name
temp.Rule.AlertLevel = string(rule.AlertLevel)
if len(rule.SubRule) > 0 {
temp.Rule.Trigger = string(rule.SubRule[0].Trigger)
temp.Rule.TriggerTime = time.Now().UnixMilli()
}
return temp
}
func NewWebApiClient(lc logger.LoggingClient, p *di.Container) *WebApiClient {
return &WebApiClient{
lc: lc,
p: p,
}
}
func (d *WebApiClient) Send(webhook string, header []map[string]string, rule models.AlertRule, device models.Device, product models.Product, messages map[string]interface{}) {
if webhook == "" {
return
}
req := HttpRequest.NewRequest()
req.JSON()
d.lc.Infof("webapi send header:", header)
context, _ := json.Marshal(d.generateWebApiTemplate(rule, device, product, messages))
for _, m := range header {
req.SetHeaders(m)
}
_, err := req.Post(webhook, context)
if err != nil {
d.lc.Errorf("webapi send alert message error:", err.Error())
}
d.lc.Info("webapi send message")
}