sp3-test-1770368381/services/chat-api/cmd/server/main.go
rdev-worker 0e39598aa6
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
build: /implement-feature websocket-chat --requirements 'GET /ws upgrades to...
2026-02-06 09:09:52 +00:00

73 lines
2.0 KiB
Go

// Package main is the entry point for the chat-api service.
package main
import (
"context"
"github.com/redis/go-redis/v9"
"git.threesix.ai/jordan/sp3-test-1770368381/pkg/app"
"git.threesix.ai/jordan/sp3-test-1770368381/pkg/logging"
"git.threesix.ai/jordan/sp3-test-1770368381/pkg/realtime"
"git.threesix.ai/jordan/sp3-test-1770368381/services/chat-api/internal/adapter/memory"
"git.threesix.ai/jordan/sp3-test-1770368381/services/chat-api/internal/api"
"git.threesix.ai/jordan/sp3-test-1770368381/services/chat-api/internal/config"
"git.threesix.ai/jordan/sp3-test-1770368381/services/chat-api/internal/service"
)
func main() {
// Create logger
logger := logging.Default()
cfg := config.Load()
// Create adapters (repositories)
exampleRepo := memory.NewExampleRepository()
// Create services (business logic)
exampleService := service.NewExampleService(exampleRepo, logger)
// Create application
application := app.New("chat-api", app.WithDefaultPort(8001))
// Set up WebSocket hub and Redis broadcaster
hub := realtime.NewHub(logger)
hubCtx, hubCancel := context.WithCancel(context.Background())
go hub.Run(hubCtx)
var broadcaster realtime.Broadcaster
if cfg.RedisURL != "" {
opts, err := redis.ParseURL(cfg.RedisURL)
if err != nil {
logger.Error("invalid REDIS_URL", "error", err)
} else {
redisClient := redis.NewClient(opts)
redisBroadcaster := realtime.NewRedisBroadcaster(redisClient, hub, logger)
go func() {
if err := redisBroadcaster.Run(hubCtx); err != nil && hubCtx.Err() == nil {
logger.Error("redis broadcaster error", "error", err)
}
}()
broadcaster = redisBroadcaster
application.OnShutdown(func(_ context.Context) error {
return redisClient.Close()
})
}
}
wsHandler := realtime.NewHandler(hub, logger, realtime.HandlerConfig{
Broadcaster: broadcaster,
})
application.OnShutdown(func(_ context.Context) error {
hubCancel()
return nil
})
// Register routes with dependency injection
api.RegisterRoutes(application, exampleService, wsHandler)
// Start server
application.Run()
}