Browse Source

Исправление критических ошибок (code review)

Go backend:
- bookings.go: *string -> *string (убрана strPtr для *string комментария)
- users.go: добавлена проверка user == nil после GetByID
- validator.go: ValidationErrors теперь алиас (=) вместо named type
  (errors.As в writeValidationError теперь работает корректно)

Frontend:
- MapView.tsx: place.lat/lng -> place.coordinates.lat/lng
- MapView.tsx: place.hourly_rate -> place.pricing?.hourly_rate
- MapView.tsx: координаты инита [55.7558,37.6173] -> [37.6173,55.7558]
- map.ts: YMapFeatureListener теперь через addChild (был не подключён)
- map.ts: удалены неиспользуемые React-импорты
- useAuth.tsx: удалены неиспользуемые импорты (ApiRequestError, getAccessToken)
neyrogovnarik 1 month ago
parent
commit
14e4080cbd

+ 1 - 1
backend/internal/handlers/bookings.go

@@ -74,7 +74,7 @@ func (h *BookingHandler) Create(w http.ResponseWriter, r *http.Request) {
 		EndTime:    end,
 		TotalPrice: totalPrice,
 		Currency:   "RUB",
-		Comment:    strPtr(req.Comment),
+		Comment:    req.Comment,
 	}
 
 	if err := h.bookingRepo.Create(r.Context(), booking); err != nil {

+ 4 - 0
backend/internal/handlers/users.go

@@ -56,6 +56,10 @@ func (h *UserHandler) UpdateMe(w http.ResponseWriter, r *http.Request) {
 		writeError(w, http.StatusInternalServerError, err.Error())
 		return
 	}
+	if user == nil {
+		writeError(w, http.StatusNotFound, "user not found")
+		return
+	}
 
 	var req updateMeRequest
 	if err := json.NewDecoder(r.Body).Decode(&req); err != nil {

+ 3 - 15
backend/internal/validator/validator.go

@@ -46,21 +46,9 @@ func ValidateVar(field interface{}, tag string) error {
 	return validate.Var(field, tag)
 }
 
-// ValidationErrors wraps validator.ValidationErrors for easier handling
-type ValidationErrors validator.ValidationErrors
-
-func (ve ValidationErrors) Error() string {
-	return validator.ValidationErrors(ve).Error()
-}
-
-// FieldErrors returns a map of field -> error message
-func (ve ValidationErrors) FieldErrors() map[string]string {
-	errs := make(map[string]string)
-	for _, fe := range ve {
-		errs[fe.Field()] = fe.Tag()
-	}
-	return errs
-}
+// ValidationErrors — алиас для go-playground/validator.ValidationErrors.
+// Позволяет использовать errors.As в хендлерах для проверки ошибок валидации.
+type ValidationErrors = validator.ValidationErrors
 
 // Custom validators
 

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

@@ -39,7 +39,7 @@ export default function MapView() {
     if (!containerRef.current || mapRef.current) return
 
     const provider = createYandexMapProvider()
-    provider.init(containerRef.current, [55.7558, 37.6173], 10)
+    provider.init(containerRef.current, [37.6173, 55.7558], 10)
     mapRef.current = provider
 
     if (navigator.geolocation) {
@@ -65,7 +65,7 @@ export default function MapView() {
     const provider = mapRef.current
 
     places.forEach((place) => {
-      provider.addMarker(place.id, place.lat, place.lng, {
+      provider.addMarker(place.id, place.coordinates.lat, place.coordinates.lng, {
         type: place.type as 'place' | 'studio',
         title: place.title,
         onClick: () => setSelectedPlace(place),
@@ -142,8 +142,8 @@ function PlaceCardModal({ place, onClose }: { place: Place; onClose: () => void
       </div>
       <div className="flex items-center gap-4 text-sm text-white/60">
         <span>★ {place.rating?.toFixed(1) || 'Нет оценок'}</span>
-        {place.type === 'studio' && place.hourly_rate && (
-          <span>{place.hourly_rate} ₽/час</span>
+        {place.type === 'studio' && place.pricing?.hourly_rate && (
+          <span>{place.pricing.hourly_rate} ₽/час</span>
         )}
       </div>
     </div>

+ 1 - 1
frontend/src/hooks/useAuth.tsx

@@ -2,7 +2,7 @@
 
 import { createContext, useContext, useState, useCallback, useEffect, type ReactNode } from 'react'
 import type { User } from '@/types'
-import { api, ApiRequestError, setAccessToken, getAccessToken } from '@/lib/api'
+import { api, setAccessToken } from '@/lib/api'
 
 /**
  * Состояние аутентификации, доступное через контекст

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

@@ -1,6 +1,5 @@
 'use client'
 
-import { useEffect, useRef, useCallback } from 'react'
 
 declare global {
   interface Window {
@@ -103,9 +102,9 @@ export function createYandexMapProvider(): MapProvider {
         )
       }
 
-      map.updateHandler = ymaps3.YMapFeatureListener({
+      map.addChild(new ymaps3.YMapFeatureListener({
         onUpdate: updateBounds,
-      })
+      }))
 
       updateBounds()
     },