nikoksr/notify

View on GitHub
service/lark/webhook.go

Summary

Maintainability
A
0 mins
Test Coverage
package lark

import (
    "context"
    "fmt"

    "github.com/go-lark/lark"

    "github.com/nikoksr/notify"
)

// WebhookService is a Notify service that uses a Lark webhook to send messages.
type WebhookService struct {
    cli sender
}

// Compile time check that larkCustomAppService implements notify.Notifer.
var _ notify.Notifier = &WebhookService{}

// NewWebhookService returns a new instance of a Lark notify service using a
// Lark group chat webhook. Note that this service does not take any
// notification receivers because it can only push messages to the group chat
// it belongs to.
func NewWebhookService(webhookURL string) *WebhookService {
    bot := lark.NewNotificationBot(webhookURL)
    return &WebhookService{
        cli: &larkClientGoLarkNotificationBot{
            bot: bot,
        },
    }
}

// Send sends the message subject and body to the group chat.
func (w *WebhookService) Send(_ context.Context, subject, message string) error {
    return w.cli.Send(subject, message)
}

// larkClientGoLarkNotificationBot is a wrapper around go-lark/lark's Bot, to
// be used for notifications via webhooks only.
type larkClientGoLarkNotificationBot struct {
    bot *lark.Bot
}

// Send implements the sender interface using a go-lark/lark notification bot.
func (w *larkClientGoLarkNotificationBot) Send(subject, message string) error {
    content := lark.NewPostBuilder().
        Title(subject).
        TextTag(message, 1, false).
        Render()
    msg := lark.NewMsgBuffer(lark.MsgPost).Post(content)
    res, err := w.bot.PostNotificationV2(msg.Build())
    if err != nil {
        return fmt.Errorf("post webhook message: %w", err)
    }
    if res.Code != 0 {
        return fmt.Errorf(
            "send failed with error code %d, please see "+
                "https://open.larksuite.com/document/ukTMukTMukTM/ugjM14COyUjL4ITN for details",
            res.Code,
        )
    }
    return nil
}