cml04-falcon-system/sap/app/app.go

144 lines
3.7 KiB
Go
Raw Normal View History

2024-10-01 20:28:58 +02:00
package app
2024-10-02 18:33:55 +02:00
import (
2024-10-02 18:51:41 +02:00
"bytes"
2024-10-02 18:33:55 +02:00
"context"
2024-10-02 18:51:41 +02:00
"encoding/json"
2024-10-02 18:33:55 +02:00
"fmt"
"os"
"os/signal"
"syscall"
2024-10-01 20:28:58 +02:00
2024-10-02 18:33:55 +02:00
cml04eventer "git.espin.casa/albert/cml04-eventer"
"git.espin.casa/albert/cml04-falcon-system/internal/storage"
2024-10-02 18:51:41 +02:00
"git.espin.casa/albert/cml04-falcon-system/internal/types"
2024-10-02 18:33:55 +02:00
"git.espin.casa/albert/logger"
"github.com/nats-io/nats.go"
"github.com/spf13/cobra"
)
func Run(cmd *cobra.Command, args []string) {
// read flags
logLevel, _ := cmd.Flags().GetString("log-level")
dbUser, _ := cmd.Flags().GetString("db-username")
dbPass, _ := cmd.Flags().GetString("db-password")
dbHost, _ := cmd.Flags().GetString("db-host")
dbPort, _ := cmd.Flags().GetInt("db-port")
dbName, _ := cmd.Flags().GetString("db-name")
natsHost, _ := cmd.Flags().GetString("nats-host")
natsPort, _ := cmd.Flags().GetInt("nats-port")
nsqHost, _ := cmd.Flags().GetString("nsq-host")
nsqPort, _ := cmd.Flags().GetInt("nsq-port")
// setup logger
log := logger.New(os.Stdout, logLevel)
// log fields
logFields := logger.LogFields{
"nsq_host": nsqHost,
"nsq_port": nsqPort,
"nats_host": natsHost,
"nats_port": natsPort,
"log_level": logLevel,
}
// NATS connect
nc, err := nats.Connect(fmt.Sprintf("nats://%s:%d", natsHost, natsPort))
if err != nil {
log.Error("create nats connection failed", err, logFields)
return
}
// on close disconnects
defer nc.Close()
// create storager
storage, err := storage.New(&storage.DBConfig{
Username: dbUser,
Password: dbPass,
Host: dbHost,
Port: dbPort,
Name: dbName,
})
// handle error
if err != nil {
log.Error("create storage failed", err, logFields)
return
}
// create nsq subscriber
subscriber, err := cml04eventer.NewSubscriber(&cml04eventer.SubscriberConfig{
NSQAddress: nsqHost,
NSQPort: nsqPort,
Unmarshaler: cml04eventer.JSONMarshaler{},
2024-10-03 00:29:18 +02:00
Channel: "CML04-FALCON",
2024-10-02 18:33:55 +02:00
}, log)
// handle error
if err != nil {
log.Error("create nsq subscriber failed", err, logFields)
return
}
// on exit close subscriber
defer subscriber.Close()
// create context with cancel
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
2024-10-03 00:29:18 +02:00
eventChan, err := subscriber.SubscribeEvent(ctx, "SAP-IN")
2024-10-02 18:33:55 +02:00
// handle error
if err != nil {
log.Error("nsq subscription failed", err, logFields)
return
}
go func() {
for event := range eventChan {
2024-10-02 18:51:41 +02:00
// create buffer
buffer := bytes.NewBuffer(event.EventData)
// get event message subject
subject, err := event.EventMeta.Get("subject")
if err != nil {
log.Error("get event metada data failed", err, logFields)
}
switch subject {
case "sap.in.telegramas.z_sms_10001":
po := &types.ProductionOrder{}
if err := json.Unmarshal(buffer.Bytes(), po); err != nil {
log.Error("decode event message data failed", err, logFields)
continue
}
2024-10-03 00:29:18 +02:00
// log info banner
log.Info("received new production data from SAP event", logFields.Add(
logger.LogFields{
"event_id": event.EventID,
"production_order": po.POrderNo,
}))
2024-10-02 18:51:41 +02:00
if err := storage.StoreProductionOrder(ctx, po); err != nil {
log.Error("store production order data failed", err, logFields)
continue
}
2024-10-03 00:29:18 +02:00
case "sap.in.telegramas.z_sms-10002":
2024-10-02 18:51:41 +02:00
default:
continue
}
2024-10-02 18:33:55 +02:00
}
}()
// info banner
log.Info("started cml04-falcon-sap service", logFields)
// wait signal to finish
signal := WaitSignal()
log.Info("signal received", logFields.Add(logger.LogFields{
"signal": signal,
}))
}
// 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
}
}
}