Дата аудита: 2026-06-13 Дата исправлений: 2026-06-14
return true. При пустом allowedOrigins в production соединения отклоняются.ErrNotYourPlace с errors.Is-поддержкой.${VAR:-default}._FILE suffix.GetRevoked в репозитории, проверка в RefreshSession, отзыв всех токенов пользователя при обнаружении, обработка в хендлере.writeError с параметром err для логирования; в production 500 ошибки возвращают "internal server error" вместо деталей БД/логики.PlaceFilter.IncludeTagsFeatures + batch-загрузка (GetTagsBatch/GetFeaturesBatch), запрос ?include=tags,features. N+1 проблема решена.PlaceFilter.CursorRating, PaginatedPlaces с json-тегами, сервис возвращает *PaginatedPlaces, репозиторий поддерживает курсор для created_at и rating сортировок. API: ?cursor=<base64>&limit=N. Ответ: {"data":[...], "next_cursor":"...", "has_more":true}.failOpen=false — возвращается 503 только если оба лимитера недоступны).string(rune(line)) — код в log.go уже использует strconv.Itoa. Баг был исправлен до аудита.strPtr дублирование — удалён из handlers/helpers.go и services/auth.go. Создан единый pointer package.contains/searchString — код в repository/reviews.go использует errors.As напрямую. Проблема не актуальна.services/auth_test.go — 6 тестов (регистрация, дубликат email, неверный пароль, бан, валидация токена, невалидный токен)services/places_test.go — 3 теста (создание, не-владелец, неизвестный action модерации)vitest + @testing-library/reactErrorBoundary.test.tsx — 2 тестаcatch {} — в admin/tags/page.tsx заменён на обработку с сообщением пользователюconsole.error — в MapView.tsx заменён на тихий catch (карта работает с текущими данными)PlaceRepo, UserRepo, RefreshTokenRepo для тестируемостиisProd флаг для безопасного fallback origins.github/dependabot.yml есть, но нет workflow. Нужен GitHub Actions.| Файл | Изменение |
|---|---|
backend/internal/services/places.go |
Sentinel errors + интерфейс PlaceRepo |
backend/internal/services/auth.go |
Интерфейсы UserRepo/RefreshTokenRepo, убран strPtr |
backend/internal/handlers/websocket.go |
isProd + CheckOrigin без fallback true |
backend/internal/handlers/helpers.go |
Удалён strPtr |
backend/internal/handlers/tags.go |
strPtr → pointer.Str |
backend/internal/pointer/ |
Новый пакет (Str, Int, Float64) |
backend/cmd/api/main.go |
isProd для WS Hub; rate limiter fallback (Redis → in-memory) |
backend/internal/config/config.go |
JWT секреты обязательны в production, запрещены дефолты |
backend/internal/handlers/errors.go |
Новый: единый writeError с логированием и скрытием деталей в prod |
backend/internal/handlers/*.go |
Все хендлеры обновлены: writeError(msg, err) вместо err.Error() |
backend/internal/models/place.go |
PlaceFilter.IncludeTagsFeatures, CursorRating; PaginatedPlaces json-теги |
backend/internal/services/places.go |
List: batch-загрузка тегов/фич, encodeCursor/DecodeCursor, возвращает *PaginatedPlaces |
backend/internal/repository/places.go |
GetTagsBatch, GetFeaturesBatch; курсор для rating sort |
backend/internal/handlers/places.go |
List: парсинг ?include=tags,features и ?cursor= |
docker-compose.yml |
Все пароли через ${VAR:-default} |
deploy/env.prod |
Очищен Yandex-ключ |
deploy/Caddyfile |
CSP + Permissions-Policy |
frontend/src/components/ErrorBoundary.tsx |
Новый компонент |
frontend/src/app/layout.tsx |
ErrorBoundary обёртка |
frontend/src/app/admin/tags/page.tsx |
Обработка ошибок |
frontend/src/components/MapView.tsx |
console.error → тихий catch |
frontend/vitest.config.ts |
Новый файл |
frontend/src/test/ |
setup.ts, ErrorBoundary.test.tsx |
obsidian_data/Photoplaces_data/ |
7 новых Zettelkasten-заметок |