This commit is contained in:
2025-11-19 01:28:34 +03:00
parent 469879cfd9
commit 33e49e1a00
12 changed files with 659 additions and 0 deletions

89
src/main.go Normal file
View File

@@ -0,0 +1,89 @@
package main
import (
"context"
"fmt"
"log/slog"
"net/http"
"net/url"
"strings"
"backend/ent"
"backend/src/internal/config"
"backend/src/internal/gateway"
"backend/src/logic"
_ "github.com/lib/pq" // побочный импорт драйвера PostgreSQL
"github.com/rs/cors"
)
const (
AppName = "Backend"
AppVersion = "1.0.0"
)
func main() {
var err error
logger := slog.Default()
// slog.SetLogLoggerLevel(slog.LevelDebug)
logger.Info(fmt.Sprintf("Starting %s version %s\n", AppName, AppVersion))
cfg, err := config.LoadConfig(logger)
if err != nil {
logger.Error("Configuration loading error", "error", err)
return
}
// создаем контекст с отменой для управления жизненным циклом сервиса.
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
// подключаемся к базе данных
dsn := config.GetDatabaseDSN(&cfg.DatabaseConfig)
db, err := ent.Open(cfg.DatabaseConfig.Kind, dsn)
if err != nil {
logger.Error("Failed opening connection to postgres", "error", err)
return
}
defer db.Close()
// Применяем миграции
if err := db.Schema.Create(ctx); err != nil {
logger.Error("Failed creating schema resources", "error", err)
return
}
// инициализируем бизнес логику
business := logic.NewBusinessLogic(ctx, db)
// регистрируем обработчик WebSocket по адресу /ws
http.HandleFunc("/ws", func(w http.ResponseWriter, r *http.Request) {
gateway.WebSocketHandler(ctx, cfg, w, r, business)
})
// создаём CORS middleware
corsMiddleware := cors.New(cors.Options{
AllowedOrigins: []string{"http://localhost:4200"},
AllowedMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"},
AllowedHeaders: []string{"Content-Type", "Authorization"},
AllowCredentials: true,
})
// оборачиваем стандартный mux (DefaultServeMux)
handler := corsMiddleware.Handler(http.DefaultServeMux)
// адрес сервера должен быть без схемы
clearURL := cfg.ServiceURL
if strings.Contains(clearURL, "://") {
if u, err := url.Parse(clearURL); err == nil && u.Host != "" {
clearURL = u.Host
}
}
logger.Info("WebSocket server is on", cfg.ServiceURL)
if err := http.ListenAndServe(clearURL, handler); err != nil {
logger.Error("WebSocket server is unable to start", "error", err)
return
}
}