Files
go-receipt-tracker/main.go
Alex Savin f1d2410857
All checks were successful
Build and Push Docker Image / testing (1.24.x, ubuntu-latest) (push) Successful in 1m40s
Build and Push Docker Image / build-and-push (push) Successful in 10m29s
Some API fixes
2025-04-30 18:53:12 -04:00

162 lines
3.8 KiB
Go

package main
import (
"fmt"
"log/slog"
"os"
"os/signal"
"syscall"
"git.savin.nyc/alex/go-receipt-tracker/app"
"git.savin.nyc/alex/go-receipt-tracker/bus"
"git.savin.nyc/alex/go-receipt-tracker/config"
"git.savin.nyc/alex/go-receipt-tracker/database"
"git.savin.nyc/alex/go-receipt-tracker/hooks/debug"
"git.savin.nyc/alex/go-receipt-tracker/listeners"
"git.savin.nyc/alex/go-receipt-tracker/workers"
)
// var log = *slog.Logger
var cfg = &config.Config{}
const (
LoggingOutputJson = "JSON"
LoggingOutputText = "TEXT"
)
func configureLogging(config *config.Logging) *slog.Logger { //nolint:unparam
if config == nil {
return nil
}
var level slog.Level
if err := level.UnmarshalText([]byte(config.Level)); err != nil {
slog.Warn(err.Error())
slog.Warn(fmt.Sprintf("logging level not recognized, defaulting to level %s", slog.LevelInfo.String()))
level = slog.LevelInfo
}
var handler slog.Handler
switch config.Output {
case LoggingOutputJson:
handler = slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{AddSource: cfg.Logging.Source, Level: level})
case LoggingOutputText:
handler = slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{AddSource: cfg.Logging.Source, Level: level})
default:
handler = slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{AddSource: cfg.Logging.Source, Level: level})
}
return slog.New(handler)
}
func main() {
sigs := make(chan os.Signal, 1)
done := make(chan bool, 1)
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
go func() {
<-sigs
done <- true
}()
var err error
cfg, err = config.New()
if err != nil { // Handle errors reading the config file
slog.Error("Fatal error config file", "error", err.Error())
os.Exit(1)
}
// LOGGER
logger := configureLogging(cfg.Logging)
logger.Debug("CONFIG", "config", cfg)
// BUS
evBus := bus.New(cfg.Bus, logger)
// DATABASE
db, err := database.NewDB(cfg.DataBase, logger)
if err != nil {
logger.Error(err.Error())
os.Exit(1)
}
app := app.New(cfg, evBus, db, logger)
for _, opts := range cfg.Parsers {
if opts.Type == "openai" {
openai := workers.NewOpenAi(opts, evBus)
err = app.AddWorker(openai)
if err != nil {
app.Log.Error(err.Error())
}
}
// if opts.Type == "claude" {
// claude := workers.NewClaude(opts, evBus)
// err = app.AddWorker(claude)
// if err != nil {
// app.Log.Error(err.Error())
// }
// }
// if opts.Type == "gemini" {
// gemini := workers.NewGemini(opts, evBus)
// err = app.AddWorker(gemini)
// if err != nil {
// app.Log.Error(err.Error())
// }
// }
}
tb := workers.NewTelegramBot(cfg.Telegram, evBus)
err = app.AddWorker(tb)
if err != nil {
app.Log.Error(err.Error())
os.Exit(1)
}
// if len(cfg.Listeners) > 0 {
// for name, opts := range cfg.Listeners {
// listener := listeners.NewHTTPStats(name, ":"+strconv.Itoa(opts.Port), nil, app.Info)
// err = app.AddListener(listener)
// if err != nil {
// app.Log.Error(err.Error())
// }
// }
// }
err = app.AddHook(new(debug.Hook), nil)
if err != nil {
app.Log.Error(err.Error())
}
api := listeners.NewHttpApi(cfg.Listeners[1], db)
err = app.AddListener(api)
if err != nil {
app.Log.Error(err.Error())
}
// err = app.AddHook(new(consul.Hook), &consul.Options{
// Hostname: cfg.Consul.Host,
// Port: cfg.Consul.Port,
// DC: cfg.Consul.DataCenter,
// ServiceID: "srv-mysubaru-01",
// NodeName: "mysubaru",
// Tags: []string{"mysubaru", "hassio", "mqtt"},
// LocalHost: cfg.Consul.Interfaces.WAN,
// LocalPort: cfg.Listeners["stats"].Port,
// })
// if err != nil {
// app.Log.Error(err.Error())
// }
go func() {
err := app.Serve()
if err != nil {
app.Log.Error(err.Error())
}
}()
<-done
app.Log.Warn("caught signal, stopping...")
_ = app.Close()
app.Log.Info("main.go finished")
}