127 lines
3.3 KiB
Go
127 lines
3.3 KiB
Go
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
|
|
}
|
|
}
|
|
}
|