refactor: Update ARR body parsing logic

The code changes in `pattern_test.go` update the ARR body parsing logic. The message body parsing now correctly handles ARR bodies with a different pattern format. This ensures accurate extraction of data based on patterns and improves the overall functionality of the code.
This commit is contained in:
windyboy
2024-07-24 11:07:04 +08:00
parent 496dc2b9d0
commit 738ce16f34
8 changed files with 196 additions and 149 deletions
+1 -99
View File
@@ -1,7 +1,6 @@
package config
import (
"caatsm/pkg/utils"
"fmt"
"os"
"regexp"
@@ -9,9 +8,6 @@ import (
"time"
"github.com/spf13/viper"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"gopkg.in/natefinch/lumberjack.v2"
)
var MyConfig *Config
@@ -56,21 +52,6 @@ type HasuraConfig struct {
Secret string
}
// LoggerConfig represents the configuration for the logger.
type LoggerConfig struct {
ZapConfig zap.Config `json:"zapConfig"`
LumberjackConfig LumberjackConfig `json:"lumberjackConfig"`
}
// LumberjackConfig represents the configuration for lumberjack logging.
type LumberjackConfig struct {
Filename string `json:"filename"`
MaxSize int `json:"maxSize"`
MaxBackups int `json:"maxBackups"`
MaxAge int `json:"maxAge"`
Compress bool `json:"compress"`
}
const (
EnvProd = "prod"
// logConfigFile = "configs/log_config.json"
@@ -212,6 +193,7 @@ func LoadConfig() (*Config, error) {
// loadLoggerConfig()
// log.Debugf("Config loaded: %+v", config)
// loadLoggerConfig()
return &config, nil
}
@@ -231,83 +213,3 @@ func ValidateConfig(cfg *Config) error {
// fmt.Println("config validation passed")
return nil
}
func loadLoggerConfig() {
// log := utils.Logger
env := os.Getenv("GO_ENV")
if env == "" {
env = "dev"
}
// log.Infof("Environment: %s", env)
viper.SetConfigType("json")
viper.SetConfigName("logger." + env)
viper.AddConfigPath("configs")
// viper.SetEnvPrefix("tele")
viper.SetEnvKeyReplacer(strings.NewReplacer(".", "_"))
if err := viper.ReadInConfig(); err != nil {
errMsg := fmt.Sprintf("error reading logger config file for environment '%s': %v", env, err)
// log.Error(errMsg)
panic(errMsg)
}
// log.Debug("Logger config file read successfully")
// log.Debugf("Logger config keys: %v", viper.AllKeys())
var config LoggerConfig
if err := viper.Unmarshal(&config); err != nil {
errMsg := fmt.Sprintf("unable to decode logger config into struct for environment '%s': %v", env, err)
// log.Error(errMsg)
// return nil, fmt.Errorf(errMsg)
panic(errMsg)
}
var logWriter zapcore.WriteSyncer
if env == EnvProd {
logWriter = zapcore.AddSync(&lumberjack.Logger{
Filename: config.LumberjackConfig.Filename,
MaxSize: config.LumberjackConfig.MaxSize,
MaxBackups: config.LumberjackConfig.MaxBackups,
MaxAge: config.LumberjackConfig.MaxAge,
Compress: config.LumberjackConfig.Compress,
})
} else {
logWriter = zapcore.AddSync(os.Stdout)
}
encoder := zapcore.NewJSONEncoder(config.ZapConfig.EncoderConfig)
level := parseLogLevel(config.ZapConfig.Level.String())
core := zapcore.NewCore(
encoder,
logWriter,
level,
)
log := zap.New(core, zap.AddCaller(), zap.AddStacktrace(zapcore.ErrorLevel))
utils.Logger = log.Sugar()
// log.Debugf("Logger config loaded: %+v", config)
}
// parseLogLevel converts the log level string to zapcore.Level.
func parseLogLevel(level string) zapcore.Level {
switch level {
case "debug":
return zapcore.DebugLevel
case "info":
return zapcore.InfoLevel
case "warn":
return zapcore.WarnLevel
case "error":
return zapcore.ErrorLevel
case "dpanic":
return zapcore.DPanicLevel
case "panic":
return zapcore.PanicLevel
case "fatal":
return zapcore.FatalLevel
default:
return zapcore.InfoLevel
}
}
+2 -1
View File
@@ -95,11 +95,12 @@ type TimeReceiver struct {
}
func (h *SITAHeader) Validate() error {
log := utils.GetLogger()
// Validate SendTime format (e.g., DDHHMM)
if len(h.SendTime) != 6 {
err := "invalid send_time format"
utils.Logger.Error(err)
log.Errorf("error validating send_time: %v", err)
return fmt.Errorf(err)
}
return nil
+8 -4
View File
@@ -5,6 +5,7 @@ import (
"caatsm/internal/domain"
"caatsm/internal/parsers"
"caatsm/internal/repository"
"caatsm/pkg/utils"
"context"
"errors"
"fmt"
@@ -62,9 +63,10 @@ func (n *NatsHandler) Subscribe() {
}
}
func (n *NatsHandler) handleMessage(msg *message.Message) error {
// log := utils.Logger
log := utils.GetSugaredLogger()
if msg.Payload == nil {
fmt.Println("empty message")
// fmt.Println("empty message")
log.Error("empty message")
return fmt.Errorf("empty message")
}
payload := string(msg.Payload)
@@ -72,11 +74,13 @@ func (n *NatsHandler) handleMessage(msg *message.Message) error {
var parsed *domain.ParsedMessage
if parsed, err = parsers.Parse(payload); err != nil {
fmt.Printf("not parsed: [%s] : {%s} - %v\n", msg.UUID, msg.Payload, err)
// fmt.Printf("not parsed: [%s] : {%s} - %v\n", msg.UUID, msg.Payload, err)
log.Infof("not parsed: [%s] : {%s} - %v\n", msg.UUID, msg.Payload, err)
// return err
} else {
fmt.Printf("parsed [%s]: %v\n", msg.UUID, parsed)
// fmt.Printf("parsed [%s]: %v\n", msg.UUID, parsed)
log.Infof("parsed [%s]: %v\n", msg.UUID, parsed)
}
parsed.Uuid = msg.UUID
+4 -2
View File
@@ -3,10 +3,10 @@ package repository
import (
"context"
"encoding/json"
"fmt"
"os"
"caatsm/internal/domain"
"caatsm/pkg/utils"
"github.com/Khan/genqlient/graphql"
"github.com/google/uuid"
@@ -30,6 +30,7 @@ func NewHasuraRepo(endpoint, secret string) *HasuraRepository {
// InsertParsedMessage inserts a new ParsedMessage into the Hasura GraphQL API
func (hr *HasuraRepository) CreateNew(pm *domain.ParsedMessage) error {
log := utils.GetSugaredLogger()
bodyString, _ := json.Marshal(pm.BodyData)
secondAddress, _ := json.Marshal(pm.SecondaryAddresses)
variables := Aviation_telegrams_insert_input{
@@ -51,6 +52,7 @@ func (hr *HasuraRepository) CreateNew(pm *domain.ParsedMessage) error {
if err != nil {
return err
}
fmt.Printf("Inserted new message: %v\n", resp)
// fmt.Printf("Inserted new message: %v\n", resp)
log.Infof("Saved : %v\n", resp)
return nil
}
+26
View File
@@ -0,0 +1,26 @@
CREATE SCHEMA IF NOT EXISTS aviation;
CREATE TABLE aviation.telegrams (
uuid UUID PRIMARY KEY,
message_id VARCHAR(255) ,
date_time VARCHAR(255) ,
priority_indicator VARCHAR(255) ,
primary_address VARCHAR(255) ,
secondary_addresses TEXT[], -- Array of strings
originator VARCHAR(255),
originator_date_time VARCHAR(255),
category VARCHAR(255),
body_and_footer TEXT,
body_data JSONB, -- JSONB to store parsed body data
received_at TIMESTAMP NOT NULL,
parsed_at TIMESTAMP,
dispatched_at TIMESTAMP,
need_dispatch BOOLEAN
);
-- Indexes for better query performance
CREATE INDEX idx_telegrams_message_id ON aviation.telegrams (message_id);
CREATE INDEX idx_telegrams_date_time ON aviation.telegrams (date_time);
CREATE INDEX idx_telegrams_priority_indicator ON aviation.telegrams (priority_indicator);
CREATE INDEX idx_telegrams_primary_address ON aviation.telegrams (primary_address);
CREATE INDEX idx_telegrams_received_at ON aviation.telegrams (received_at);