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:
100
plan_modernization.md
Normal file
100
plan_modernization.md
Normal 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).
|
||||
Reference in New Issue
Block a user