Bläddra i källkod

fix: глобальная AppEnv → atomic.Bool, координаты [lat,lng]

- handlers/errors.go: AppEnv заменён на atomic.Bool isProd + InitAppEnv/ResetAppEnv
- main.go: handlers.InitAppEnv(cfg.AppEnv) вместо прямого присваивания
- map.ts: init/fitBounds/onMove теперь [lat,lng] как в Leaflet
- MapView.tsx: init([55.7558, 37.6173]) в порядке [lat,lng]
neyrogovnarik 1 månad sedan
förälder
incheckning
8bd0f03e2d

+ 1 - 2
backend/cmd/api/main.go

@@ -73,8 +73,7 @@ func main() {
 	authSvc := services.NewAuthService(userRepo, refreshTokenRepo, cfg.JWTSecret, cfg.JWTRefreshSecret)
 	placeSvc := services.NewPlaceService(placeRepo, uploadHandler, moderationLogRepo)
 
-	// Set AppEnv for error handling (production hides internal errors)
-	handlers.AppEnv = cfg.AppEnv
+	handlers.InitAppEnv(cfg.AppEnv)
 
 	// Фоновая очистка истёкших refresh токенов (каждые 6 часов)
 	go func() {

+ 12 - 11
backend/internal/handlers/errors.go

@@ -1,44 +1,45 @@
-// Package handlers
 package handlers
 
 import (
 	"encoding/json"
 	"log/slog"
 	"net/http"
+	"sync/atomic"
 )
 
 const maxRequestBodySize = 1 << 20 // 1 MB
 
-// AppEnv is set at startup to control error detail exposure
-var AppEnv string
+var isProd atomic.Bool
+
+func InitAppEnv(env string) {
+	isProd.Store(env == "production")
+}
+
+func ResetAppEnv() {
+	isProd.Store(false)
+}
 
-// writeJSON writes a JSON response
 func writeJSON(w http.ResponseWriter, status int, v interface{}) {
 	w.Header().Set("Content-Type", "application/json")
 	w.WriteHeader(status)
 	json.NewEncoder(w).Encode(v)
 }
 
-// writeError writes an error response.
-// In production, internal server errors return a generic message.
-// In development, the actual error message is returned.
 func writeError(w http.ResponseWriter, status int, msg string, err error) {
 	if err != nil {
 		slog.Error("handler error", "status", status, "error", err)
 	}
 
-	if status == http.StatusInternalServerError && AppEnv == "production" {
+	if status == http.StatusInternalServerError && isProd.Load() {
 		msg = "internal server error"
 	}
 
 	writeJSON(w, status, map[string]string{"error": msg})
 }
 
-// writeValidationError writes a validation error response (422).
-// In production, hides internal field names and rules from the client.
 func writeValidationError(w http.ResponseWriter, err error) {
 	details := err.Error()
-	if AppEnv == "production" {
+	if isProd.Load() {
 		slog.Error("validation error", "error", details)
 		details = "validation failed"
 	}

+ 1 - 1
frontend/src/components/MapView.tsx

@@ -45,7 +45,7 @@ export default function MapView() {
     const provider = createLeafletMapProvider()
     mapRef.current = provider
 
-    provider.init(containerRef.current, [37.6173, 55.7558], 10).then(() => {
+    provider.init(containerRef.current, [55.7558, 37.6173], 10).then(() => {
       if (!provider.isReady()) {
         setMapError(true)
         return

+ 3 - 6
frontend/src/lib/map.ts

@@ -64,7 +64,7 @@ export function createLeafletMapProvider(): MapProvider {
         map = L.map(container, {
           zoomControl: false,
           attributionControl: false,
-        }).setView([center[1], center[0]], zoom)
+        }).setView(center, zoom)
 
         L.tileLayer(TILE_URL, {
           maxZoom: 19,
@@ -77,7 +77,7 @@ export function createLeafletMapProvider(): MapProvider {
           const c = map.getCenter()
           const b = map.getBounds()
           moveHandler(
-            [c.lng, c.lat],
+            [c.lat, c.lng],
             map.getZoom(),
             {
               swLat: b.getSouthWest().lat,
@@ -136,10 +136,7 @@ export function createLeafletMapProvider(): MapProvider {
     },
 
     fitBounds(bounds) {
-      map?.fitBounds([
-        [bounds[0][1], bounds[0][0]],
-        [bounds[1][1], bounds[1][0]],
-      ])
+      map?.fitBounds(bounds)
     },
 
     onMove(cb) {