onasty/mailer/handlers.go(view raw)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
package main
import (
"context"
"encoding/json"
"log/slog"
"time"
"github.com/nats-io/nats.go/micro"
"github.com/olexsmir/onasty/internal/transport/http/reqid"
)
type Handlers struct {
service *Service
}
func NewHandlers(service *Service) *Handlers {
return &Handlers{
service: service,
}
}
func (h Handlers) RegisterAll(svc micro.Service) error {
m := svc.AddGroup("mailer")
if err := m.AddEndpoint("ping", micro.HandlerFunc(h.pingHandler)); err != nil {
return err
}
if err := m.AddEndpoint("send", micro.HandlerFunc(h.sendHandler)); err != nil {
return err
}
return nil
}
type pingResponse struct {
Message string `json:"message"`
}
func (h Handlers) pingHandler(req micro.Request) {
_ = req.RespondJSON(pingResponse{
Message: "pong",
})
}
type sendRequest struct {
RequestID string `json:"request_id"`
Receiver string `json:"receiver"`
TemplateName string `json:"template_name"`
Options map[string]string `json:"options"`
}
func (h Handlers) sendHandler(req micro.Request) {
var inp sendRequest
if err := json.Unmarshal(req.Data(), &inp); err != nil {
slog.Error("failed to unmarshal input data", "err", err)
return
}
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
ctx = reqid.SetContext(ctx, inp.RequestID)
if err := h.service.Send(ctx, cancel, inp.Receiver, inp.TemplateName, inp.Options); err != nil {
_ = req.Error("500", err.Error(), nil)
}
_ = req.Respond(nil)
}
|