all repos

onasty @ e6c5d1c07f0fcf559b84cc65671c6225b01a73de

a one-time notes service

onasty/mailer/main.go (view raw)

Smirnov Oleksandr Smirnov Oleksandr
ss2316544@gmail.com
refactor: logger set default interface (#131)..., 12 months ago
1
package main
2
3
import (
4
	"errors"
5
	"fmt"
6
	"log/slog"
7
	"net/http"
8
	"os"
9
	"os/signal"
10
	"strings"
11
	"syscall"
12
	"time"
13
14
	"github.com/nats-io/nats.go"
15
	"github.com/nats-io/nats.go/micro"
16
	"github.com/olexsmir/onasty/internal/logger"
17
	"github.com/olexsmir/onasty/internal/transport/http/httpserver"
18
19
	_ "embed"
20
)
21
22
//go:embed version
23
var _version string
24
25
var version = strings.Trim(_version, "\n")
26
27
func main() {
28
	if err := run(); err != nil {
29
		fmt.Fprintf(os.Stderr, "error: %v\n", err)
30
		os.Exit(1)
31
	}
32
}
33
34
func run() error {
35
	cfg := NewConfig()
36
	nc, err := nats.Connect(cfg.NatsURL)
37
	if err != nil {
38
		return err
39
	}
40
41
	if err = logger.SetDefault(cfg.LogLevel, cfg.LogFormat, cfg.LogShowLine); err != nil {
42
		return err
43
	}
44
45
	//nolint:exhaustruct
46
	svc, err := micro.AddService(nc, micro.Config{
47
		Name:    "mailer",
48
		Version: version,
49
	})
50
	if err != nil {
51
		return err
52
	}
53
54
	mg := NewMailgun(cfg.MailgunFrom, cfg.MailgunDomain, cfg.MailgunAPIKey)
55
	service := NewService(cfg.AppURL, mg)
56
	handlers := NewHandlers(service)
57
58
	if err := handlers.RegisterAll(svc); err != nil {
59
		return err
60
	}
61
62
	if cfg.MetricsEnabled {
63
		srv := httpserver.NewServer(MetricsHandler(), httpserver.Config{
64
			Port:            cfg.MetricsPort,
65
			ReadTimeout:     10 * time.Second,
66
			WriteTimeout:    10 * time.Second,
67
			MaxHeaderSizeMb: 1,
68
		})
69
		go func() {
70
			slog.Info("starting metrics server", "port", cfg.MetricsPort)
71
			if err := srv.Start(); !errors.Is(err, http.ErrServerClosed) {
72
				slog.Error("failed to start metrics server", "error", err)
73
			}
74
		}()
75
	}
76
77
	slog.Info("the service is listening")
78
79
	// graceful shutdown
80
	quitCh := make(chan os.Signal, 1)
81
	signal.Notify(quitCh, syscall.SIGINT, syscall.SIGTERM)
82
	<-quitCh
83
84
	slog.Info("stopping the service")
85
86
	if err := svc.Stop(); err != nil {
87
		return err
88
	}
89
90
	if err := nc.Drain(); err != nil {
91
		return err
92
	}
93
94
	return nil
95
}