pgx не мог сканировать NULL из COALESCE(...,'') когда
OtherPhoto был *string. После преобразования subquery
photo в строки и OtherPhoto в string, scan работает.
Проверено: Алиса и Тест получают свои чаты 200, без 500.
После Sprint 5.1 (snake_case lowercase) Nearby struct не получил
json-теги. /search/nearby возвращал {UserID, Name, Lat, ...}
а фронт ждал {user_id, name, lat, ...} — markers не рисовались.
Фикс: добавил json:"..." на все поля Nearby.
Проверено: snake_case теперь везде в /search/nearby.
pgx по умолчанию передаёт float64 как numeric.
В запросе BETWEEN $1 - $6 AND $1 + $6 numeric-numeric
сравнивалось с double precision lat/lng и возвращало ошибку.
Фикс: ::float8 касты на все параметры запроса.
Проверено: /search/nearby → 200 с count=2 для юзеров в 600м.
- internal/places/overpass.go: запрос к Overpass API (OSM), bar/pub/restaurant/cafe/biergarten/nightclub
- internal/handlers/places.go: GET /api/v1/places/nearby (radius, limit)
- POST через application/x-www-form-urlencoded (раньше был broken — query params)
- 2GIS tile layer в map.js (вместо OSM)
- Кнопка 'Показать/Скрыть бары' + список под картой
- Invite to place: шлёт предложение встретиться в чат с собеседником
- Карточки с эмодзи по типу заведения, расстояние, время работы
- POST /api/v1/me/photo (multipart, field 'photo')
- MinIO upload via storage.UploadAvatar (avatars/{userID}/{uuid}-{ts})
- /storage/* backend route reads from MinIO + serves with proper headers
- nginx unchanged: /storage/* proxied to backend like everything else
- Bumped to v0.5.0
1. CORS whitelist (was '*'): only buhapp.mygoodservice.ru, t.me, web.telegram.org
2. Rate limit on /auth/login (10/min/IP) and /auth/register (5/hour/IP)
3. TGHandler: removed unused JWTSecret, added WebhookSecret, real secret check
4. Login: constant-time bcrypt on user enumeration (dummy hash)
5. TgUsername saved in users (was lost)
6. User.IsVerified=true for Telegram users
7. Register: 409 instead of 500 on duplicate email
8. Bumped version to 0.4.0
- All response types now use lowercase json tags (id, name, photo_url, etc.)
- email/phone/birthdate/last_seen_at/photo_url use omitempty
- audit.Metadata type []byte (was map[string]any)
- fixes register/login inconsistency where login returned ID/Name (CamelCase)
while register returned id/name (lowercase)
- POST /api/v1/reviews (one per chat_id, UNIQUE)
- GET /api/v1/users/:id/reviews (public list)
- GET /api/v1/users/:id/stats (rating_avg, count)
- migration 0004: reviews (rating 1-5, anonymous flag), user_stats aggregate
- only chat participants can review; reviewed_id is other party
- PUT /messages/:msgId now returns {ok, edited:true}
- WS pushes 'message_edited' event to both chat members
- Mobile UI: show 'ред.' marker when edited=true
- Audit log: message.edit action
- Repo: GetMessage helper for fetching after edit