all repos

onasty @ 39d6b8e

a one-time notes service

onasty/mailer/main.go (view raw)

Smirnov Oleksandr Smirnov Oleksandr
ss2316544@gmail.com
chore(linter): ignore some of the Config structs (#145), 11 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
	svc, err := micro.AddService(nc, micro.Config{
46
		Name:    "mailer",
47
		Version: version,
48
	})
49
	if err != nil {
50
		return err
51
	}
52
53
	mg := NewMailgun(cfg.MailgunFrom, cfg.MailgunDomain, cfg.MailgunAPIKey)
54
	service := NewService(cfg.AppURL, mg)
55
	handlers := NewHandlers(service)
56
57
	if err := handlers.RegisterAll(svc); err != nil {
58
		return err
59
	}
60
61
	if cfg.MetricsEnabled {
62
		srv := httpserver.NewServer(MetricsHandler(), httpserver.Config{
63
			Port:            cfg.MetricsPort,
64
			ReadTimeout:     10 * time.Second,
65
			WriteTimeout:    10 * time.Second,
66
			MaxHeaderSizeMb: 1,
67
		})
68
		go func() {
69
			slog.Info("starting metrics server", "port", cfg.MetricsPort)
70
			if err := srv.Start(); !errors.Is(err, http.ErrServerClosed) {
71
				slog.Error("failed to start metrics server", "error", err)
72
			}
73
		}()
74
	}
75
76
	slog.Info("the service is listening")
77
78
	// graceful shutdown
79
	quitCh := make(chan os.Signal, 1)
80
	signal.Notify(quitCh, syscall.SIGINT, syscall.SIGTERM)
81
	<-quitCh
82
83
	slog.Info("stopping the service")
84
85
	if err := svc.Stop(); err != nil {
86
		return err
87
	}
88
89
	if err := nc.Drain(); err != nil {
90
		return err
91
	}
92
93
	return nil
94
}