madipo2611 6ad760a85b
All checks were successful
continuous-integration/drone/push Build is passing
v0.0.16 Исправление работы мессенджера
2025-08-09 13:30:49 +03:00

122 lines
3.4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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,
)
// Инициализация чата
chatHub := ws.NewChatHub()
go chatHub.Run()
// Репозитории
userRepo := repository.NewUserRepository(db)
postRepo := repository.NewPostRepository(db)
commentRepo := repository.NewCommentRepository(db)
likeRepo := repository.NewLikeRepository(db)
chatRepo := repository.NewChatRepository(db)
auditRepo := repository.NewAuditRepository(db)
recoveryRepo := repository.NewRecoveryRepository(db)
deviceRepo := repository.NewDeviceRepository(db)
sessionRepo := repository.NewSessionRepository(db)
// Инициализация MailService
mailService, err := service.NewMailService(
cfg.SMTP.From,
cfg.SMTP.Host,
cfg.SMTP.Port,
cfg.SMTP.Username,
cfg.SMTP.Password,
cfg.SMTP.URL,
)
if err != nil {
log.Fatalf("Failed to create mail service: %v", err)
}
// Сервисы
authService := service.NewAuthService(userRepo, tokenAuth, mailService)
userService := service.NewUserService(userRepo)
postService := service.NewPostService(postRepo)
commentService := service.NewCommentService(commentRepo, postRepo)
likeService := service.NewLikeService(likeRepo, postRepo)
chatService := service.NewChatService(chatRepo, userRepo)
auditService := service.NewAuditService(auditRepo)
recoveryService := service.NewRecoveryService(recoveryRepo, userRepo, sessionRepo, deviceRepo, mailService)
sessionService := service.NewSessionService(sessionRepo, deviceRepo, userRepo, mailService)
// Создаем структуру Services
services := &service.Services{
Auth: authService,
User: userService,
Post: postService,
Comment: commentService,
Like: likeService,
Chat: chatService,
Audit: auditService,
Recovery: recoveryService,
Session: sessionService,
Mail: mailService,
ChatHub: chatHub, // Добавляем хаб в Services
}
// HTTP сервер - передаем db как дополнительный параметр
server := http.NewServer(cfg, services, tokenAuth, db)
// Запуск сервера в отдельной горутине
go func() {
log.Println("server started")
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")
}