Просмотр исходного кода

chore: исправлены оставшиеся низкоприоритетные проблемы

- useSSL выводится из схемы S3_ENDPOINT
- Удалена неиспользуемая ErrPlaceNotFound
- Удалены неиспользуемые валидаторы service_status/booking_status
- Удалён избыточный fetchPlacesRef из MapView
- fetchPlaces обёрнут в useCallback в MyPlacesPage
- Убран комментарий в PlaceForm
neyrogovnarik 1 месяц назад
Родитель
Сommit
484982cde6

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

@@ -10,6 +10,7 @@ import (
 	"net/http"
 	"os"
 	"os/signal"
+	"strings"
 	"syscall"
 	"time"
 
@@ -61,7 +62,7 @@ func main() {
 	featureRepo := repository.NewFeatureRepo(pool)
 
 	// Хендлеры (сначала те, что нужны сервисам)
-	uploadHandler, err := handlers.NewUploadHandler(cfg.S3Endpoint, cfg.S3PublicEndpoint, cfg.S3AccessKey, cfg.S3SecretKey, cfg.S3Bucket, false)
+	uploadHandler, err := handlers.NewUploadHandler(cfg.S3Endpoint, cfg.S3PublicEndpoint, cfg.S3AccessKey, cfg.S3SecretKey, cfg.S3Bucket, strings.HasPrefix(cfg.S3Endpoint, "https://"))
 	if err != nil {
 		logger.ErrorContext(ctx, "upload handler init failed", log.WithError(err))
 		os.Exit(1)

+ 0 - 1
backend/internal/services/places.go

@@ -44,7 +44,6 @@ type ObjectStorager interface {
 
 var (
 	ErrNotYourPlace  = errors.New("not your place")
-	ErrPlaceNotFound = errors.New("place not found")
 )
 
 type PlaceRepo interface {

+ 1 - 13
backend/internal/validator/validator.go

@@ -1,6 +1,6 @@
 // Package validator предоставляет кастомные валидаторы на базе go-playground/validator.
 // Реализованы валидации: uuid, slug, latitude, longitude, place_type, user_role,
-// currency, user_status, place_status, service_status, booking_status, datetime.
+// currency, user_status, place_status, datetime.
 // Экспортирует функции Validate (структуры) и ValidateVar (одно поле).
 package validator
 
@@ -31,8 +31,6 @@ func init() {
 	_ = validate.RegisterValidation("currency", validateCurrency)
 	_ = validate.RegisterValidation("user_status", validateUserStatus)
 	_ = validate.RegisterValidation("place_status", validatePlaceStatus)
-	_ = validate.RegisterValidation("service_status", validateServiceStatus)
-	_ = validate.RegisterValidation("booking_status", validateBookingStatus)
 	_ = validate.RegisterValidation("datetime", validateDateTime)
 }
 
@@ -100,16 +98,6 @@ func validatePlaceStatus(fl validator.FieldLevel) bool {
 	return statuses[fl.Field().String()]
 }
 
-func validateServiceStatus(fl validator.FieldLevel) bool {
-	statuses := map[string]bool{"draft": true, "published": true, "archived": true}
-	return statuses[fl.Field().String()]
-}
-
-func validateBookingStatus(fl validator.FieldLevel) bool {
-	statuses := map[string]bool{"pending": true, "confirmed": true, "cancelled": true, "completed": true}
-	return statuses[fl.Field().String()]
-}
-
 func validateDateTime(fl validator.FieldLevel) bool {
 	_, err := time.Parse(time.RFC3339, fl.Field().String())
 	return err == nil

+ 4 - 4
frontend/src/app/places/my/page.tsx

@@ -1,6 +1,6 @@
 'use client'
 
-import { useEffect, useState } from 'react'
+import { useEffect, useState, useCallback } from 'react'
 import dynamic from 'next/dynamic'
 import { api, ApiRequestError } from '@/lib/api'
 import type { Place, Tag, Feature } from '@/types'
@@ -327,15 +327,15 @@ export default function MyPlacesPage() {
   const [filter, setFilter] = useState('all')
   const [toast, setToast] = useState('')
 
-  const fetchPlaces = () => {
+  const fetchPlaces = useCallback(() => {
     setLoading(true)
     api.get<{ data: Place[] }>('/places/my')
       .then((res) => setPlaces(res.data || []))
       .catch(() => setToast('Ошибка загрузки мест'))
       .finally(() => setLoading(false))
-  }
+  }, [])
 
-  useEffect(() => { fetchPlaces() }, [])
+  useEffect(() => { fetchPlaces() }, [fetchPlaces])
 
   return (
     <div className="min-h-screen bg-[#0f172a] pt-20">

+ 2 - 6
frontend/src/components/MapView.tsx

@@ -39,10 +39,6 @@ export default function MapView() {
     }
   }, [])
 
-  /** Реф для актуальной версии fetchPlaces — предотвращает проблему устаревшего замыкания */
-  const fetchPlacesRef = useRef(fetchPlaces)
-  fetchPlacesRef.current = fetchPlaces
-
   useEffect(() => {
     if (!containerRef.current || mapRef.current) return
 
@@ -71,8 +67,8 @@ export default function MapView() {
         )
       }
 
-      provider.onMove((center, zoom, bounds) => {
-        fetchPlacesRef.current(bounds)
+      provider.onMove((_center, _zoom, bounds) => {
+        fetchPlaces(bounds)
       })
 
       const b = provider.getBounds()

+ 0 - 1
frontend/src/components/PlaceForm.tsx

@@ -243,7 +243,6 @@ export default function PlaceForm({ type, onSuccess, place }: PlaceFormProps) {
             const file = e.target.files?.[0]
             if (file) {
               setCoverFile(file)
-              // Освобождаем предыдущий blob-URL, чтобы не было утечки
               if (coverPreview) URL.revokeObjectURL(coverPreview)
               setCoverPreview(URL.createObjectURL(file))
             }