modified: main_dc/yalarba/api_yal/go.mod

modified:   main_dc/yalarba/api_yal/go.sum
	modified:   main_dc/yalarba/api_yal/internal/config/config.go
	modified:   main_dc/yalarba/api_yal/internal/router/router.go
add stock middleware from chi
This commit is contained in:
2026-03-09 02:26:56 +05:00
parent 1e263cf1a2
commit 74b46a5109
4 changed files with 88 additions and 4 deletions
@@ -3,11 +3,16 @@ package router
import (
"api_yal/internal/config"
"api_yal/internal/logger"
CastomMiddleware "api_yal/internal/middleware"
"time"
"encoding/json"
"github.com/go-chi/chi/v5"
"gorm.io/gorm"
"net/http"
"github.com/go-chi/chi/v5"
ChiMiddleware "github.com/go-chi/chi/v5/middleware"
"github.com/go-chi/cors"
"gorm.io/gorm"
)
func SetupRouter(db *gorm.DB, config *config.Config) http.Handler {
@@ -16,6 +21,9 @@ func SetupRouter(db *gorm.DB, config *config.Config) http.Handler {
zapLogger.Info("Start setup routers")
r := chi.NewRouter()
// Добавляем все production middleware
addProductionMiddleware(r, config)
// Health check
r.Get("/health", func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
@@ -23,7 +31,8 @@ func SetupRouter(db *gorm.DB, config *config.Config) http.Handler {
json.NewEncoder(w).Encode(map[string]string{"status": "healthy"})
})
r.Group()
// Auth middleware
r.Use(CastomMiddleware.AuthMiddlewareWithContext)
zapLogger.Info("End setup routers")
@@ -33,3 +42,67 @@ func SetupRouter(db *gorm.DB, config *config.Config) http.Handler {
return r
}
// addProductionMiddleware добавляет все необходимые middleware для production окружения
func addProductionMiddleware(r *chi.Mux, config *config.Config) {
// Request ID middleware - добавляет уникальный ID к каждому запросу
r.Use(ChiMiddleware.RequestID)
// Real IP middleware - корректно определяет реальный IP клиента (за прокси)
r.Use(ChiMiddleware.RealIP)
// Logger middleware - логирует все запросы в формате Apache
r.Use(ChiMiddleware.Logger)
// Recoverer middleware - восстанавливает после паники и возвращает 500
r.Use(ChiMiddleware.Recoverer)
// Timeout middleware - устанавливает таймаут на запросы (30 секунд)
r.Use(ChiMiddleware.Timeout(30 * time.Second))
// Compress middleware - сжимает ответы (gzip)
r.Use(ChiMiddleware.Compress(5, "gzip"))
// StripSlashes middleware - удаляет слеши в конце URL или редиректит
r.Use(ChiMiddleware.StripSlashes)
// CORS middleware - настройка CORS для production
r.Use(cors.Handler(cors.Options{
AllowedOrigins: config.CORS.AllowedOrigins,
AllowedMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS", "PATCH"},
AllowedHeaders: []string{"Accept", "Authorization", "Content-Type", "X-CSRF-Token", "X-Request-ID"},
ExposedHeaders: []string{"Link", "X-Request-ID"},
AllowCredentials: true,
MaxAge: 300,
}))
// Content-Type middleware - проверяет Content-Type для POST/PUT запросов
r.Use(ChiMiddleware.AllowContentType("application/json", "application/xml"))
// Дополнительные middleware в зависимости от конфигурации
if config.Environment == "development" {
// Добавляем дополнительное логирование для разработки
r.Use(ChiMiddleware.Logger)
}
if config.RateLimit.Enabled {
// Добавляем rate limiting если включено в конфиге
r.Use(ChiMiddleware.Throttle(config.RateLimit.RequestsPerSecond))
}
// Security headers middleware
r.Use(func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("X-Content-Type-Options", "nosniff")
w.Header().Set("X-Frame-Options", "DENY")
w.Header().Set("X-XSS-Protection", "1; mode=block")
w.Header().Set("Referrer-Policy", "strict-origin-when-cross-origin")
if config.Environment == "production" {
w.Header().Set("Strict-Transport-Security", "max-age=31536000; includeSubDomains; preload")
}
next.ServeHTTP(w, r)
})
})
}