forked from templates/template-go-backend
Sketch
This commit is contained in:
89
src/main.go
Normal file
89
src/main.go
Normal 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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user