-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.go
130 lines (110 loc) · 3.32 KB
/
main.go
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
package main
import (
"context"
"os"
"os/signal"
"syscall"
"time"
ainform "github.com/airenas/async-api/pkg/inform"
"github.com/airenas/go-app/pkg/goapp"
"github.com/airenas/roxy/internal/pkg/inform"
"github.com/airenas/roxy/internal/pkg/postgres"
"github.com/jackc/pgx/v5/pgxpool"
"github.com/labstack/gommon/color"
"github.com/vgarvardt/gue/v5"
"github.com/vgarvardt/gue/v5/adapter/pgxv5"
)
func main() {
goapp.StartWithDefault()
cfg := goapp.Config
data := &inform.ServiceData{}
ctx := context.Background()
dbConfig, err := pgxpool.ParseConfig(cfg.GetString("db.url"))
if err != nil {
goapp.Log.Fatal().Err(err).Msg("can't init db pool")
}
dbPool, err := pgxpool.NewWithConfig(ctx, dbConfig)
if err != nil {
goapp.Log.Fatal().Err(err).Msg("can't init db pool")
}
defer dbPool.Close()
data.GueClient, err = gue.NewClient(pgxv5.NewConnPool(dbPool))
if err != nil {
goapp.Log.Fatal().Err(err).Msg("can't init gue")
}
data.WorkerCount = cfg.GetInt("worker.count")
data.EmailMaker, err = ainform.NewTemplateEmailMaker(cfg)
if err != nil {
goapp.Log.Fatal().Err(err).Msg("can't init email maker")
}
location := cfg.GetString("worker.location")
if location != "" {
data.Location, err = time.LoadLocation(location)
if err != nil {
goapp.Log.Fatal().Err(err).Msg("can't init location")
}
goapp.Log.Info().Str("local", time.Now().In(data.Location).Format(time.RFC3339)).Msg("time")
}
if cfg.GetString("smtp.fakeUrl") == "" {
goapp.Log.Info().Str("sender", "real").Msg("smtp")
data.EmailSender, err = ainform.NewSimpleEmailSender(cfg)
if err != nil {
goapp.Log.Fatal().Err(err).Msg("can't init email sender")
}
} else {
goapp.Log.Info().Str("sender", "fake").Msg("smtp")
data.EmailSender, err = inform.NewFakeEmailSender(cfg)
if err != nil {
goapp.Log.Fatal().Err(err).Msg("can't init fake email sender")
}
}
db, err := postgres.NewDB(dbPool)
if err != nil {
goapp.Log.Fatal().Err(err).Msg("can't init db")
}
data.DB = db
printBanner()
ctx, cancelFunc := context.WithCancel(context.Background())
// data.StopCtx = ctx
doneCh, err := inform.StartWorkerService(ctx, data)
if err != nil {
goapp.Log.Fatal().Err(err).Msg("can't start inform service")
}
/////////////////////// Waiting for terminate
waitCh := make(chan os.Signal, 2)
signal.Notify(waitCh, os.Interrupt, syscall.SIGTERM)
select {
case <-waitCh:
goapp.Log.Info().Msg("Got exit signal")
case <-doneCh:
goapp.Log.Info().Msg("Service exit")
}
cancelFunc()
select {
case <-doneCh:
goapp.Log.Info().Msg("All code returned. Now exit. Bye")
case <-time.After(time.Second * 15):
goapp.Log.Warn().Msg("Timeout gracefull shutdown")
}
}
var (
version = "DEV"
)
func printBanner() {
banner := `
____ ____ _ ____ __
/ __ \/ __ \ |/ /\ \/ /
/ /_/ / / / / / \ /
/ _, _/ /_/ / | / /
/_/ |_|\____/_/|_| /_/
_ ____
(_)___ / __/ ____ _________ ___
/ / __ \/ /_____________/ __ \____________/ ___/ __ ` + "`" + ` __ \
/ / / / / __/_____/_____/ /_/ /_____/_____/ / / / / / / /
/_/_/ /_/_/ \____/ /_/ /_/ /_/ /_/ v: %s
%s
________________________________________________________
`
cl := color.New()
cl.Printf(banner, cl.Red(version), cl.Green("https://github.com/airenas/roxy"))
}