396 lines
17 KiB
Markdown
396 lines
17 KiB
Markdown
|
|
# 📂 Структура проекта 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
|
|||
|
|
|