cml04-mediciones-service/internal/app/app.go

127 lines
3.3 KiB
Go
Raw Normal View History

2024-08-20 09:09:31 +02:00
package app
import (
"context"
"flag"
"os"
"os/signal"
"syscall"
cml04eventer "git.espin.casa/albert/cml04-eventer"
"git.espin.casa/albert/cml04-mediciones-service/internal/logging"
"git.espin.casa/albert/cml04-mediciones-service/internal/server"
"git.espin.casa/albert/cml04-mediciones-service/internal/service"
"git.espin.casa/albert/cml04-mediciones-service/internal/storage"
"git.espin.casa/albert/logger"
)
const (
Topic string = "SAP-IN"
)
func Run() error {
// flags
bindAddr := flag.String("bind-addr", ":3000", "http rest api bind address")
dbUser := flag.String("db-user", "mediciones", "database username")
dbPass := flag.String("db-user-pass", "mediciones", "database user password")
dbHost := flag.String("db-host", "10.1.152.13", "database host server")
dbPort := flag.String("db-port", "3308", "database host port")
dbName := flag.String("db-name", "mediciones", "database name")
nsqHost := flag.String("nsq-host", "10.1.152.13", "NSQ host")
nsqPort := flag.Int("nsq-port", 4150, "NSQ port")
logLevel := flag.String("level", "debug", "Log level")
// parse flags
flag.Parse()
// log fields
logFields := logger.LogFields{
"bind_address": *bindAddr,
"log_level": *logLevel,
"db_host": *dbHost,
"db_port": *dbPort,
"db_name": *dbName,
"nsq_host": *nsqHost,
"nsq_port": *nsqPort,
}
// setup logger
log := logger.New(os.Stdout, *logLevel)
// create storage
storage, err := storage.NewStorage(&storage.StorageConfig{
User: *dbUser,
Pass: *dbPass,
Host: *dbHost,
Port: *dbPort,
DBName: *dbName,
})
if err != nil {
log.Error("create storage failed", err, logFields)
return err
}
// create subscriber
subscriber, err := cml04eventer.NewSubscriber(&cml04eventer.SubscriberConfig{
NSQAddress: *nsqHost,
NSQPort: *nsqPort,
Unmarshaler: cml04eventer.JSONMarshaler{},
Channel: "CML04-MEDICIONES",
}, log)
// handle error
if err != nil {
log.Error("create subscriber failed", err, logFields)
return err
}
// close subscriber graceful
defer subscriber.Close()
// create service
svc := service.NewService(storage)
// create logging service
svc = logging.NewLoggingService(log, svc)
// create server
server := server.NewServer(*bindAddr, svc)
// create context
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
// subscribe event bus
eventChann, err := subscriber.SubscribeEvent(ctx, Topic)
// handle error
if err != nil {
log.Error("subscribe event failed", err, logFields)
return err
}
// process incoming events
go func() {
for event := range eventChann {
if err := svc.ProcessEvent(ctx, event); err != nil {
log.Error("process event has been failed", err, logFields)
continue
}
}
}()
// start server
server.Start()
// info banner
log.Info("started cml04-mediciones-service *", logFields)
// wait signal to finish
signal := WaitSignal()
log.Info("signal received", logFields.Add(logger.LogFields.Add(logFields, logger.LogFields{
"signal": signal,
})))
return nil
}
// WaitSignal catching exit signal
func WaitSignal() os.Signal {
ch := make(chan os.Signal, 2)
signal.Notify(
ch,
syscall.SIGINT,
syscall.SIGQUIT,
syscall.SIGTERM,
)
for {
sig := <-ch
switch sig {
case syscall.SIGINT, syscall.SIGQUIT, syscall.SIGTERM:
return sig
}
}
}