package main import ( "context" "log" "os" "os/signal" "syscall" "tailly_back_v2/internal/config" "tailly_back_v2/internal/http" "tailly_back_v2/internal/repository" "tailly_back_v2/internal/service" "tailly_back_v2/internal/ws" "tailly_back_v2/pkg/auth" "tailly_back_v2/pkg/database" "time" ) func main() { // Загрузка конфигурации cfg, err := config.Load() if err != nil { log.Fatalf("failed to load config: %v", err) } // Инициализация БД db, err := database.NewPostgres(cfg.Database.DSN) if err != nil { log.Fatalf("failed to connect to database: %v", err) } defer db.Close() // Инициализация зависимостей tokenAuth := auth.NewTokenAuth( cfg.Auth.AccessTokenSecret, cfg.Auth.RefreshTokenSecret, cfg.Auth.AccessTokenExpiry, cfg.Auth.RefreshTokenExpiry, ) // Репозитории userRepo := repository.NewUserRepository(db) postRepo := repository.NewPostRepository(db) commentRepo := repository.NewCommentRepository(db) likeRepo := repository.NewLikeRepository(db) chatRepo := repository.NewChatRepository(db) // Сервисы services := service.NewServices( service.NewAuthService(userRepo, *tokenAuth), service.NewUserService(userRepo), service.NewPostService(postRepo), service.NewCommentService(commentRepo), service.NewLikeService(likeRepo), service.NewChatService(chatRepo), ) // Инициализация чата chatHub := ws.NewChatHub() go chatHub.Run() chatService := service.NewChatService( chatRepo, userRepo, chatHub, encryptionService, ) // HTTP сервер server := http.NewServer(cfg, services, tokenAuth) // Запуск сервера в отдельной горутине go func() { if err := server.Run(); err != nil { log.Printf("server error: %v", err) } }() // Ожидание сигнала завершения quit := make(chan os.Signal, 1) signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) <-quit // Graceful shutdown ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() if err := server.Shutdown(ctx); err != nil { log.Printf("server shutdown error: %v", err) } log.Println("server stopped") }