feat: infinite scroll, HEIC support, likes fix, security & backup

- Fix liked hearts not showing after page reload (sync useEffect in CatCard)
- Replace pagination with infinite scroll (useInfiniteQuery + IntersectionObserver)
- Add HEIC/HEIF/AVIF image support with sharp conversion to JPEG on upload
- Validate MIME type alongside file extension to prevent spoofing
- Limit caption to 500 chars; increase upload size limit to 20MB
- Delete physical file from uploads/ when post is removed (cats + admin routes)
- Add WAL journal mode and graceful shutdown (SIGTERM/SIGINT) to db
- Add rate limiter for upload endpoint (10 req / 15 min)
- Add pre-deploy backup of data.db and uploads/ to deploy.sh (keeps last 10)
- Add plan_modernization.md with ideas for future improvements

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-26 00:18:46 +03:00
parent 81c9bba56f
commit 94fff09a41
11 changed files with 290 additions and 65 deletions

100
plan_modernization.md Normal file
View File

@@ -0,0 +1,100 @@
# Котограм — план модернизации
Идеи для последующих доработок, сгруппированные по направлениям.
---
## Функционал
### Социальное взаимодействие
- **Подписки на пользователей** — лента только из постов тех, на кого подписан; отдельная вкладка «Все».
- **Реакции вместо лайков** — несколько эмодзи (❤️ 😂 😮 😢 🔥), каждый даёт разное кол-во очков.
- **Репосты / поделиться** — пользователь может поделиться ссылкой на пост или репостнуть к себе в профиль.
- **Упоминания @username** в комментариях с уведомлением (push или in-app badge).
- **Теги #хэштеги** на фотографиях и фильтрация ленты по тегу.
### Контент
- **Сторис (истории)** — публикация на 24 часа, круговые аватарки с индикатором непросмотренной истории.
- **Карусель фотографий** — несколько фото в одном посте (swipe).
- **Видео поддержка** — короткие видео до 30 сек (mp4, mov), хранение в `uploads/`.
- **Черновики** — сохранить пост не публикуя.
- **Редактирование подписи** к своему посту.
### Профиль
- **Bio / описание** — поле до 150 символов в профиле.
- **Верификация** — значок ✓ для доверенных аккаунтов, назначается администратором.
- **Статистика профиля** — охват, просмотры за 7/30 дней.
- **Закреплённые посты** — возможность закрепить 1 пост вверху профиля.
### Поиск и открытие
- **Страница «Обзор»** — сетка популярных постов (по лайкам за 7 дней) как на вкладке «Explore» в Instagram.
- **Поиск пользователей** по username.
- **Лента трендов** — ТОП-10 котов недели в sidebar.
### Уведомления
- **In-app уведомления** — новый лайк, комментарий, подписчик (real-time через WebSocket или polling).
- **Push-уведомления** (PWA) — с разрешения пользователя.
---
## Интерфейс и UX
### Навигация
- **Мобильный bottom navigation bar** — иконки Лента / Поиск / Загрузить / Уведомления / Профиль.
- **Жест swipe** между постами на мобильном (как в Instagram Stories).
- **Keyboard shortcuts** для десктопа: `L` — лайк, `Esc` — закрыть модал, стрелки — следующий/предыдущий пост.
### Карточка поста
- **Двойной тап — лайк** (как в Instagram), с анимацией большого сердца поверх фото.
- **Lazy loading** с blur placeholder пока грузится изображение.
- **Zoom** по клику/пинчу на фото.
### Профиль
- **Grid-режим** фотографий (3 колонки) как в Instagram по умолчанию, переключатель на список.
- **Анимированный аватар** — возможность загрузить gif.
### Тёмная / светлая тема
- Тема уже есть. Добавить **«Авто» по системной теме** (уже `prefers-color-scheme`, но сделать переключатель 3-позиционный).
### Доступность
- Описания (`alt` тексты) генерировать через API Claude Vision как подсказку при загрузке.
- Навигация с клавиатуры для всех интерактивных элементов.
---
## Производительность
- **CDN для изображений** — вынести `uploads/` на Cloudflare R2 / S3, раздавать через CDN.
- **WebP конвертация** — уже есть sharp; конвертировать в WebP вместо JPEG (меньше размер при том же качестве), отдавать JPEG как fallback.
- **Мигрировать с sql.js на better-sqlite3** — нативный SQLite, не держит весь файл БД в RAM, в 10-20x быстрее на записи.
- **Redis кэш** для топа пользователей и трендовых постов (sidebar), TTL 5 минут.
- **Виртуальный список** (react-virtual / @tanstack/virtual) в ленте при 100+ постов — не рендерить вне viewport.
---
## Безопасность (дополнительно)
- **2FA / TOTP** — опционально для аккаунтов.
- **Чёрный список слов** в комментариях (модерация).
- **Жалоба на пост** — кнопка «Пожаловаться», уведомление администратору.
- **Автоматическое удаление сессий** — логаут всех активных сессий при смене пароля.
- **Сканирование загружаемых файлов** на вирусы через ClamAV (опционально).
---
## Инфраструктура
- **Docker** — `docker-compose.yml` для локальной разработки и VPS деплоя.
- **GitHub Actions CI** — автоматический билд и тест при push.
- **Автоматические бэкапы БД** — cron на сервере каждые 6 часов копирует `data.db` в `/backups/`.
- **Health-check endpoint** уже есть (`/api/health`). Подключить к uptime-мониторингу (UptimeRobot / Betterstack).
- **Логирование** — структурированные JSON-логи через `pino` или `winston` вместо `console.log`.
---
## Геймификация и монетизация
- **Рейтинговые лиги** — Bronze / Silver / Gold / Diamond по кол-ву очков.
- **Достижения** — «Первый кот», «100 лайков», «Месяц на сайте» и т.д. с иконками-бейджами в профиле.
- **Ежедневные задания** — «Поставь 5 лайков сегодня» за бонусные очки.
- **Донаты / супер-лайки** — платный лайк с особым отображением (опционально через Stripe/YooKassa).