nakama/PROJECT_STRUCTURE.md

396 lines
17 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 📂 Структура проекта NakamaSpace
Полная карта проекта с описанием каждого файла и директории.
## 🗂️ Корневая директория
```
nakama/
├── backend/ # Backend сервер (Node.js + Express)
├── frontend/ # Frontend приложение (React + Vite)
├── .gitignore # Игнорируемые файлы для Git
├── .env.example # Пример переменных окружения
├── package.json # Зависимости backend и скрипты
├── README.md # Основная документация
├── SETUP.md # Подробная инструкция по установке
├── QUICKSTART.md # Быстрый старт за 5 минут
├── CONTRIBUTING.md # Гайд для разработчиков
├── LICENSE # MIT лицензия
└── start.sh # Скрипт быстрого запуска
```
## 🔧 Backend (`/backend`)
### Структура
```
backend/
├── models/ # MongoDB схемы
│ ├── User.js # Модель пользователя
│ ├── Post.js # Модель поста с комментариями
│ ├── Notification.js # Модель уведомлений
│ └── Report.js # Модель жалоб
├── routes/ # API endpoints
│ ├── auth.js # Авторизация через Telegram
│ ├── posts.js # CRUD постов, лайки, комментарии
│ ├── users.js # Профили, подписки, поиск
│ ├── notifications.js # Система уведомлений
│ ├── search.js # Интеграция e621 и gelbooru
│ └── moderation.js # Модерация и жалобы
├── middleware/ # Middleware функции
│ └── auth.js # Проверка Telegram Init Data
└── server.js # Точка входа, Express сервер
```
### Модели данных
#### User (Пользователь)
- `telegramId` - ID из Telegram (уникальный)
- `username`, `firstName`, `lastName` - Данные пользователя
- `photoUrl` - Аватар из Telegram
- `bio` - Описание профиля (до 300 символов)
- `role` - Роль: user / moderator / admin
- `followers` / `following` - Подписчики и подписки
- `settings` - Настройки фильтров и поиска
- `banned` - Флаг блокировки
#### Post (Пост)
- `author` - Автор (ref User)
- `content` - Текст поста (до 2000 символов)
- `imageUrl` - URL изображения
- `tags` - Массив тегов: furry / anime / other
- `mentionedUsers` - Упомянутые пользователи
- `isNSFW` - Флаг 18+ контента
- `likes` - Массив ID пользователей
- `comments` - Встроенные комментарии
- `reposts` - Массив ID пользователей
#### Notification (Уведомление)
- `recipient` - Получатель (ref User)
- `sender` - Отправитель (ref User)
- `type` - Тип: follow / like / comment / repost / mention
- `post` - Связанный пост (опционально)
- `read` - Флаг прочтения
#### Report (Жалоба)
- `reporter` - Кто пожаловался (ref User)
- `post` - На какой пост (ref Post)
- `reason` - Причина жалобы
- `status` - Статус: pending / reviewed / resolved / dismissed
- `reviewedBy` - Модератор (ref User)
### API Endpoints
#### Авторизация
- `POST /api/auth/verify` - Верификация Telegram Init Data
#### Посты
- `GET /api/posts` - Получить ленту (с фильтрами и пагинацией)
- `POST /api/posts` - Создать пост (с изображением)
- `POST /api/posts/:id/like` - Лайк/дизлайк
- `POST /api/posts/:id/comment` - Добавить комментарий
- `POST /api/posts/:id/repost` - Репост
- `DELETE /api/posts/:id` - Удалить (автор или модератор)
#### Пользователи
- `GET /api/users/:id` - Профиль пользователя
- `GET /api/users/:id/posts` - Посты пользователя
- `POST /api/users/:id/follow` - Подписаться/отписаться
- `PUT /api/users/profile` - Обновить свой профиль
- `GET /api/users/search/:query` - Поиск пользователей
#### Уведомления
- `GET /api/notifications` - Список уведомлений
- `PUT /api/notifications/:id/read` - Отметить прочитанным
- `PUT /api/notifications/read-all` - Прочитать все
#### Поиск
- `GET /api/search/furry?query=tags` - Поиск в e621
- `GET /api/search/anime?query=tags` - Поиск в gelbooru
- `GET /api/search/furry/tags?query=tag` - Автокомплит e621
- `GET /api/search/anime/tags?query=tag` - Автокомплит gelbooru
- `GET /api/search/proxy/:encodedUrl` - Проксирование изображений с e621/gelbooru
#### Модерация (требуют роли moderator/admin)
- `POST /api/moderation/report` - Создать жалобу (все пользователи)
- `GET /api/moderation/reports` - Список жалоб
- `PUT /api/moderation/reports/:id` - Обработать жалобу
- `PUT /api/moderation/posts/:id/nsfw` - Установить NSFW
- `PUT /api/moderation/users/:id/ban` - Заблокировать пользователя
## 🎨 Frontend (`/frontend`)
### Структура
```
frontend/
├── src/
│ ├── components/ # React компоненты
│ │ ├── Layout.jsx # Основной Layout с навигацией
│ │ ├── Navigation.jsx # Нижняя панель навигации
│ │ ├── PostCard.jsx # Карточка поста
│ │ ├── CreatePostModal.jsx # Модалка создания поста
│ │ ├── CommentsModal.jsx # Модалка комментариев
│ │ └── PostMenu.jsx # Меню поста (удалить, пожаловаться)
│ ├── pages/ # Страницы-вкладки
│ │ ├── Feed.jsx # Лента постов
│ │ ├── Search.jsx # Поиск (e621 + gelbooru)
│ │ ├── Notifications.jsx # Уведомления
│ │ ├── Profile.jsx # Свой профиль
│ │ └── UserProfile.jsx # Профиль другого пользователя
│ ├── utils/ # Утилиты
│ │ ├── api.js # Axios API клиент
│ │ └── telegram.js # Telegram Mini App SDK
│ ├── styles/ # Глобальные стили
│ │ └── index.css # CSS переменные и базовые стили
│ ├── App.jsx # Корневой компонент
│ └── main.jsx # Точка входа React
├── index.html # HTML шаблон
├── vite.config.js # Конфигурация Vite
├── package.json # Зависимости frontend
└── .env.example # Пример переменных окружения
```
### Компоненты
#### Layout & Navigation
- **Layout** - Обёртка с навигацией, содержит React Router Outlet
- **Navigation** - 4 кнопки: Лента, Поиск, Уведомления, Профиль
- Использует lucide-react иконки
- Активная вкладка подсвечивается синим
#### PostCard (Карточка поста)
Основной компонент для отображения постов:
- Аватар и имя автора (кликабельно → профиль)
- Дата публикации
- Текст поста
- Изображение (если есть)
- Теги с цветовой кодировкой:
- 🦊 Furry - оранжевый (#FF8A33)
- 🎌 Anime - синий (#4A90E2)
- ⚪ Other - серый (#A0A0A0)
- NSFW badge (если помечено)
- Действия: лайк, комментарий, репост
- Меню (три точки): удалить или пожаловаться
#### CreatePostModal (Создание поста)
Модальное окно с функциями:
- Текстовое поле (до 2000 символов)
- Загрузка изображения (до 10MB)
- Выбор тегов (обязательно хотя бы один)
- Поиск и упоминание пользователей (@username)
- Чекбокс NSFW
- Превью изображения с кнопкой удаления
#### CommentsModal (Комментарии)
- Список комментариев с аватарами
- Форма добавления (Enter для отправки)
- Время публикации ("только что", "5 мин", "2 ч")
- Автоматическая прокрутка к новому комментарию
#### PostMenu (Меню поста)
- Для своих постов: Удалить
- Для чужих: Пожаловаться
- Для модераторов: дополнительные опции
### Страницы
#### Feed (Лента)
- Хедер с названием и кнопкой "+"
- Фильтры: Все / Furry / Anime / Other
- Бесконечная загрузка (пагинация)
- Применяет whitelist настройки пользователя
- Pull-to-refresh (планируется)
#### Search (Поиск)
- Переключатель: Furry / Anime / Mixed
- Строка поиска с автокомплитом тегов
- Сетка результатов (2 колонки)
- Просмотрщик изображений:
- Полноэкранный режим
- Swipe влево/вправо
- Скачивание изображения
- Информация о тегах и рейтинге
#### Notifications (Уведомления)
Telegram-стиль баблов:
- Цветовая кодировка по типу уведомления
- Аватар отправителя с иконкой действия
- Превью поста (текст или изображение)
- Непрочитанные выделены фоном
- Счётчик непрочитанных
- Кнопка "Прочитать все"
- Клик → переход к посту или профилю
#### Profile (Свой профиль)
- Аватар из Telegram
- Имя, username, роль (модератор/админ)
- Редактируемое био (до 300 символов)
- Статистика: подписчики / подписки
- Донаты через Telegram Stars
- Быстрые настройки:
- Без Furry контента
- Только Anime
- Без NSFW
- Кнопка настроек → полная модалка
#### UserProfile (Профиль другого пользователя)
- Информация о пользователе
- Кнопка подписаться/отписаться
- Список постов пользователя
- Кнопка "Назад"
### Утилиты
#### api.js
Axios клиент с:
- Автоматической добавкой Telegram Init Data в headers
- Обработкой ошибок
- Типизированными методами для всех endpoints
- Dev моками для разработки без Telegram
#### telegram.js
Обёртка над Telegram Mini App SDK:
- `initTelegramApp()` - Инициализация
- `getTelegramUser()` - Получить данные пользователя
- `getTelegramInitData()` - Init Data для API
- `showAlert()`, `showConfirm()` - Нативные диалоги
- `hapticFeedback()` - Тактильная обратная связь
- `openLink()`, `openTelegramLink()` - Открыть ссылки
- Dev моки для тестирования
### Стили
#### Цветовая палитра (CSS переменные)
```css
--bg-primary: #F2F3F5 /* Основной фон */
--bg-secondary: #FFFFFF /* Фон карточек */
--text-primary: #1C1C1E /* Основной текст */
--text-secondary: #5C5C5C /* Второстепенный текст */
--border-color: #C7C7CC /* Границы */
--divider-color: #E5E5EA /* Разделители */
--tag-furry: #FF8A33 /* Оранжевый */
--tag-anime: #4A90E2 /* Синий */
--tag-other: #A0A0A0 /* Серый */
--button-dark: #1C1C1E /* Тёмная кнопка */
--button-accent: #007AFF /* Акцентная кнопка (iOS синий) */
--search-bg: #E6E6E8 /* Фон поиска */
```
#### Анимации
- `fadeIn` - Плавное появление (0.3s)
- `slideUp` - Слайд снизу (0.3s)
- `scaleIn` - Масштабирование (0.2s)
#### Компоненты
- Радиус скругления: 16px для карточек, 12px для кнопок
- Тени: мягкие rgba(0,0,0,0.08)
- Отступы: 16px стандарт
- Шрифт: SF Pro Display (iOS) / Roboto (Android)
## 🚀 Скрипты
### Корневые (package.json)
```bash
npm run dev # Запуск backend + frontend
npm run server # Только backend (nodemon)
npm run client # Только frontend (vite)
npm run build # Сборка frontend для production
npm start # Production сервер
```
### Frontend (frontend/package.json)
```bash
npm run dev # Dev сервер Vite (HMR)
npm run build # Сборка для production
npm run preview # Превью production сборки
```
## 🔐 Безопасность
### Backend
- Telegram Init Data валидация с HMAC-SHA256
- JWT для сессий (опционально)
- Multer для безопасной загрузки файлов
- Rate limiting (TODO)
- Санитизация входных данных
### Frontend
- XSS защита через React
- CORS настройки
- HTTPS only для production
- Нет хранения секретов в коде
## 📦 Зависимости
### Backend
- `express` - Web framework
- `mongoose` - MongoDB ORM
- `cors` - CORS middleware
- `dotenv` - Переменные окружения
- `axios` - HTTP клиент (для API e621/gelbooru)
- `multer` - Загрузка файлов
- `crypto` - Криптография для Telegram
### Frontend
- `react` + `react-dom` - UI библиотека
- `react-router-dom` - Роутинг
- `@twa-dev/sdk` - Telegram Mini App SDK
- `axios` - HTTP клиент
- `lucide-react` - Иконки
- `vite` - Сборщик
## 🎯 Ключевые особенности
### Дизайн
- ✅ iOS-стиль минимализм
- ✅ Нейтральная серая палитра
- ✅ Bubble-дизайн для уведомлений
- ✅ Плавные анимации
- ✅ Адаптивная вёрстка
### Функциональность
- ✅ Полный CRUD постов
- ✅ Лайки, комментарии, репосты
- ✅ Система тегов (Furry, Anime, Other)
- ✅ Интеграция e621 и gelbooru API
-**Проксирование изображений для доступа из РФ**
- ✅ Система уведомлений
- ✅ Подписки на пользователей
- ✅ Модерация и жалобы
- ✅ Настройки whitelist фильтров
- ✅ Telegram авторизация
### Качество кода
- ✅ Модульная архитектура
- ✅ Переиспользуемые компоненты
- ✅ Централизованное управление API
- ✅ Error handling
- ✅ Логирование
- ✅ Документация
## 📝 TODO / Планы развития
- [ ] Unit тесты
- [ ] E2E тесты
- [ ] Rate limiting
- [ ] Кэширование (Redis)
- [ ] WebSocket для real-time уведомлений
- [ ] Telegram Stars интеграция
- [ ] Поиск по постам
- [ ] Хэштеги
- [ ] Приватные сообщения
- [ ] Группы/сообщества
- [ ] Рекомендации постов (алгоритм)
- [ ] Статистика для авторов
- [ ] Dark mode
- [ ] Мультиязычность
---
**Вопросы?** Смотрите полную документацию в README.md, SETUP.md и CONTRIBUTING.md