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 } } }