package main import ( "context" "log" "os" "os/signal" "syscall" tokenstoredao "github.com/LoveLosita/smartflow/backend/services/tokenstore/dao" tokenstorerpc "github.com/LoveLosita/smartflow/backend/services/tokenstore/rpc" tokenstoresv "github.com/LoveLosita/smartflow/backend/services/tokenstore/sv" "github.com/LoveLosita/smartflow/backend/shared/infra/bootstrap" kafkabus "github.com/LoveLosita/smartflow/backend/shared/infra/kafka" outboxinfra "github.com/LoveLosita/smartflow/backend/shared/infra/outbox" "github.com/spf13/viper" ) func main() { if err := bootstrap.LoadConfig(); err != nil { log.Fatalf("failed to load config: %v", err) } ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM) defer stop() db, err := tokenstoredao.OpenDBFromConfig() if err != nil { log.Fatalf("failed to connect tokenstore database: %v", err) } svc := tokenstoresv.New(tokenstoresv.Options{DB: db}) outboxRepo := outboxinfra.NewRepository(db) eventBus, err := outboxinfra.NewEventBus(outboxRepo, kafkabus.LoadConfig()) if err != nil { log.Fatalf("failed to initialize tokenstore outbox bus: %v", err) } if eventBus != nil { if err := tokenstoresv.RegisterForumRewardHandlers(eventBus, outboxRepo, svc); err != nil { log.Fatalf("failed to register tokenstore outbox handlers: %v", err) } eventBus.Start(ctx) defer eventBus.Close() log.Println("Tokenstore outbox consumer started") } else { log.Println("Tokenstore outbox consumer is disabled") } server, listenOn, err := tokenstorerpc.NewServer(tokenstorerpc.ServerOptions{ ListenOn: viper.GetString("tokenstore.rpc.listenOn"), Timeout: viper.GetDuration("tokenstore.rpc.timeout"), Service: svc, }) if err != nil { log.Fatalf("failed to build tokenstore zrpc server: %v", err) } defer server.Stop() go func() { log.Printf("tokenstore zrpc service starting on %s", listenOn) server.Start() }() <-ctx.Done() log.Println("tokenstore service stopping") }