From 12c0870c8fafcdd8983ac9c97ad0abc08d5a253b Mon Sep 17 00:00:00 2001 From: Fovway Date: Fri, 14 Nov 2025 21:32:18 +0700 Subject: [PATCH] =?UTF-8?q?=D0=9E=D1=87=D0=B8=D1=81=D1=82=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B5=D0=BA=D1=82=D0=B0=20=D0=BE=D1=82=20?= =?UTF-8?q?=D1=83=D1=81=D1=82=D0=B0=D1=80=D0=B5=D0=B2=D1=88=D0=B5=D0=B9=20?= =?UTF-8?q?=D0=B4=D0=BE=D0=BA=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D0=B8=20=D0=B8=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BB=D0=BE=D0=B3=D0=B8=D0=BA?= =?UTF-8?q?=D0=B8=20=D0=BC=D0=B8=D0=B3=D1=80=D0=B0=D1=86=D0=B8=D0=B8=20?= =?UTF-8?q?=D0=B1=D0=B0=D0=B7=D1=8B=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Удалены устаревшие файлы документации (CHANGES.md, COMMANDS.md, DEBUG.md, OFFLINE_FIX.md, QUICK_START.md, README_RU.md), конфигурационные файлы .cursor и скрипты установки/запуска (install.sh, start.sh). Исправлена логика миграции в backend/server.js: теперь is_public_profile обновляется только для пользователей с NULL значением, а не для всех пользователей с 0, что предотвращает нежелательное изменение явно установленных значений. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .cursor/rules/mcp.mdc | 5 - .cursor/rules/start-server-rule.mdc | 5 - .cursor/worktrees.json | 5 - CHANGES.md | 157 --------------------- COMMANDS.md | 192 -------------------------- DEBUG.md | 70 ---------- OFFLINE_FIX.md | 131 ------------------ QUICK_START.md | 144 -------------------- README_RU.md | 204 ---------------------------- backend/server.js | 25 +--- dev-dist/sw.js | 2 +- install.sh | 36 ----- review.md | 154 +++++++++++++++++++++ start.sh | 15 -- 14 files changed, 159 insertions(+), 986 deletions(-) delete mode 100644 .cursor/rules/mcp.mdc delete mode 100644 .cursor/rules/start-server-rule.mdc delete mode 100644 .cursor/worktrees.json delete mode 100644 CHANGES.md delete mode 100644 COMMANDS.md delete mode 100644 DEBUG.md delete mode 100644 OFFLINE_FIX.md delete mode 100644 QUICK_START.md delete mode 100644 README_RU.md delete mode 100755 install.sh create mode 100644 review.md delete mode 100755 start.sh diff --git a/.cursor/rules/mcp.mdc b/.cursor/rules/mcp.mdc deleted file mode 100644 index e24cacd..0000000 --- a/.cursor/rules/mcp.mdc +++ /dev/null @@ -1,5 +0,0 @@ ---- -alwaysApply: true ---- - -не забывай использовать MCP сервера diff --git a/.cursor/rules/start-server-rule.mdc b/.cursor/rules/start-server-rule.mdc deleted file mode 100644 index bdd398e..0000000 --- a/.cursor/rules/start-server-rule.mdc +++ /dev/null @@ -1,5 +0,0 @@ ---- -alwaysApply: true ---- - -Never try to start the server yourself. If it is required, then ask me to do it! diff --git a/.cursor/worktrees.json b/.cursor/worktrees.json deleted file mode 100644 index 77e9744..0000000 --- a/.cursor/worktrees.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "setup-worktree": [ - "npm install" - ] -} diff --git a/CHANGES.md b/CHANGES.md deleted file mode 100644 index c4b0dbe..0000000 --- a/CHANGES.md +++ /dev/null @@ -1,157 +0,0 @@ -# Список изменений - NoteJS React - -## Структура проекта - -Проект реорганизован для независимой работы фронтенда и бэкенда: - -### ✅ Backend (Node.js + Express) - -**Расположение:** `backend/` - -**Что сделано:** - -- ✅ Скопирован `server.js` из корня проекта -- ✅ Скопированы `package.json` и `package-lock.json` -- ✅ Изменён порт с `3000` на `3001` (чтобы не конфликтовать со старым приложением) -- ✅ Установлены все зависимости (`npm install`) -- ✅ Созданы папки: - - `database/` - для SQLite баз данных - - `public/uploads/` - для загруженных файлов -- ✅ Создан `.gitignore` для исключения ненужных файлов -- ✅ Создан `README.md` с инструкциями - -**Запуск:** - -```bash -cd backend -npm start -``` - -**Адрес:** http://localhost:3001 - ---- - -### ✅ Frontend (React + TypeScript) - -**Расположение:** `src/` - -**Что сделано:** - -- ✅ Обновлён `vite.config.ts`: - - Порт изменён на `5173` (стандартный для Vite) - - Настроен proxy для API запросов к бэкенду (`http://localhost:3001`) - - Добавлены proxy правила для `/api`, `/uploads`, `/logout` -- ✅ Обновлён `package.json`: - - Добавлен скрипт `server` для запуска бэкенда - - Добавлен скрипт `dev:all` для одновременного запуска фронтенда и бэкенда - - Добавлен скрипт `start` как алиас для `dev:all` - - Установлен пакет `concurrently` для параллельного запуска - -**Запуск только фронтенда:** - -```bash -npm run dev -``` - -**Адрес:** http://localhost:5173 - ---- - -## 🚀 Запуск всего приложения - -### Вариант 1: Одна команда (рекомендуется) - -```bash -npm start -``` - -Это запустит фронтенд и бэкенд одновременно. - -### Вариант 2: Раздельный запуск - -**Терминал 1 (Backend):** - -```bash -cd backend -npm start -``` - -**Терминал 2 (Frontend):** - -```bash -npm run dev -``` - ---- - -## 📋 Установка зависимостей - -### Первый раз: - -```bash -# Фронтенд -npm install - -# Бэкенд -cd backend -npm install -cd .. -``` - ---- - -## 🔧 Конфигурация - -### Backend (.env) - -Создайте файл `backend/.env`: - -```env -PORT=3001 -SESSION_SECRET=your-secret-key-here -NODE_ENV=development -ENCRYPTION_KEY=your-encryption-key-min-32-chars -``` - -**Важно:** `ENCRYPTION_KEY` используется для шифрования заметок в базе данных. Используйте надежный случайный ключ минимум 32 символа! - ---- - -## 📍 Порты - -- **Frontend (dev):** http://localhost:5173 -- **Backend (новый):** http://localhost:3001 -- **Старое приложение:** http://localhost:3000 (если запущено) - ---- - -## ✨ Преимущества новой структуры - -1. **Независимость:** Фронтенд и бэкенд могут разрабатываться и деплоиться независимо -2. **Современный стек:** Vite для быстрой разработки фронтенда -3. **Hot Reload:** Автоматическая перезагрузка при изменениях -4. **TypeScript:** Типизация на фронтенде -5. **Proxy:** Нет проблем с CORS в разработке -6. **Раздельные зависимости:** Чистое разделение фронтенд/бэкенд зависимостей - ---- - -## 📖 Документация - -- [QUICK_START.md](QUICK_START.md) - Быстрый старт -- [README_RU.md](README_RU.md) - Полная документация на русском -- [backend/README.md](backend/README.md) - Документация бэкенда -- [DEBUG.md](DEBUG.md) - Отладка и решение проблем - ---- - -## 🔄 Совместимость со старым приложением - -Старое приложение (порт 3000) и новое (порты 5173 + 3001) могут работать одновременно. - -**База данных:** Оба приложения используют разные базы данных: - -- Старое: `/database/notes.db` -- Новое: `/backend/database/notes.db` - -Если нужно использовать общую базу, можно скопировать файлы из `/database/` в `/backend/database/`. diff --git a/COMMANDS.md b/COMMANDS.md deleted file mode 100644 index 67cb295..0000000 --- a/COMMANDS.md +++ /dev/null @@ -1,192 +0,0 @@ -# Команды NoteJS React - -## 🔧 Установка - -```bash -# Автоматическая установка всех зависимостей -./install.sh - -# Или вручную: -npm install # Фронтенд -cd backend && npm install # Бэкенд -``` - -## 🚀 Запуск - -```bash -# Запуск всего приложения (рекомендуется) -./start.sh -# или -npm start -# или -npm run dev:all - -# Только фронтенд -npm run dev - -# Только бэкенд -npm run server -# или -cd backend && npm start -``` - -## 🏗️ Сборка - -```bash -# Production сборка -npm run build - -# Предпросмотр production сборки -npm run preview -``` - -## 🧹 Разработка - -```bash -# Проверка кода (линтинг) -npm run lint -``` - -## 📂 Структура команд - -### Package.json (корень) - -- `npm run dev` - Запуск Vite dev сервера (фронтенд) -- `npm run build` - Сборка production версии -- `npm run preview` - Предпросмотр production сборки -- `npm run lint` - Проверка кода -- `npm run server` - Запуск бэкенда -- `npm run dev:all` - Запуск фронтенда и бэкенда одновременно -- `npm start` - Алиас для `dev:all` - -### Backend/package.json - -- `npm start` - Запуск сервера -- `npm run dev` - Запуск с nodemon (auto-reload) - -## 🌐 Адреса - -После запуска приложение доступно по адресам: - -- **Frontend (dev):** http://localhost:5173 -- **Backend API:** http://localhost:3001 -- **Старая версия:** http://localhost:3000 (если запущена) - -## 🔑 Переменные окружения - -### Backend (.env) - -Создайте файл `backend/.env`: - -```env -PORT=3001 -SESSION_SECRET=ваш-секретный-ключ -NODE_ENV=development -``` - -## 📝 Примеры использования - -### Первый запуск - -```bash -# 1. Клонирование репозитория -git clone -cd notejs-react - -# 2. Установка зависимостей -./install.sh - -# 3. Настройка бэкенда (создать .env) -nano backend/.env - -# 4. Запуск -./start.sh -``` - -### Разработка - -```bash -# Терминал 1: Backend с auto-reload -cd backend -npm run dev - -# Терминал 2: Frontend с hot-reload -npm run dev -``` - -### Production - -```bash -# 1. Сборка фронтенда -npm run build - -# 2. Запуск бэкенда -cd backend -NODE_ENV=production npm start -``` - -## 🐛 Отладка - -```bash -# Проверка портов -lsof -i :3001 # Backend -lsof -i :5173 # Frontend - -# Логи бэкенда -cd backend -npm start - -# Логи фронтенда -npm run dev -``` - -## 🔄 Работа с базой данных - -```bash -# Просмотр базы данных (SQLite) -sqlite3 backend/database/notes.db - -# Создание резервной копии -cp backend/database/notes.db backend/database/notes.db.backup - -# Восстановление -cp backend/database/notes.db.backup backend/database/notes.db -``` - -## 📦 Обновление зависимостей - -```bash -# Проверка устаревших пакетов (фронтенд) -npm outdated - -# Обновление (фронтенд) -npm update - -# Проверка устаревших пакетов (бэкенд) -cd backend -npm outdated -npm update -``` - -## 🧪 Тестирование - -```bash -# В будущем здесь будут команды для тестов -# npm test -``` - -## 📋 Git - -```bash -# Статус -git status - -# Добавить изменения -git add . - -# Коммит -git commit -m "Описание изменений" - -# Отправка -git push -``` diff --git a/DEBUG.md b/DEBUG.md deleted file mode 100644 index 096b33e..0000000 --- a/DEBUG.md +++ /dev/null @@ -1,70 +0,0 @@ -# Инструкция по отладке подключения к backend - -## Проблема: "Ошибка соединения с сервером" - -### Шаг 1: Проверьте, запущен ли backend сервер - -```bash -# В корне проекта NoteJS -cd /home/fovway/git/NoteJS -npm start -# или -node server.js -``` - -Backend должен быть запущен на порту 3000. Проверьте: - -- В консоли должно быть: "Сервер запущен на порту 3000" -- В браузере: http://localhost:3000 должен открываться - -### Шаг 2: Проверьте консоль браузера - -Откройте DevTools (F12) и посмотрите в консоль: - -- Если видите "API Request: POST /api/login" - запрос отправляется -- Если видите "Network error - server might be down or proxy not working" - backend не отвечает -- Если видите ошибку CORS - проблема с настройками сервера - -### Шаг 3: Проверьте прокси Vite - -Vite dev server (порт 3001) должен проксировать запросы на `/api` на `http://localhost:3000`. - -Убедитесь что в `vite.config.ts`: - -```typescript -proxy: { - "/api": { - target: "http://localhost:3000", - changeOrigin: true, - secure: false, - ws: true, - }, -} -``` - -### Шаг 4: Проверьте сетевые запросы - -В DevTools > Network: - -- Запрос должен быть на `http://localhost:3001/api/login` (не 3000!) -- Статус должен быть 200 или 400/401 (не ошибка сети) - -### Шаг 5: Проверьте сессии - -Backend использует cookies для сессий. Убедитесь что: - -- `withCredentials: true` в axios клиенте -- Backend настроен для работы с cookies - -### Типичные ошибки: - -1. **"Сервер не отвечает"** - backend не запущен -2. **CORS ошибка** - проверьте настройки CORS в server.js -3. **404 Not Found** - неправильный URL или прокси не работает -4. **Network Error** - backend не доступен или прокси не настроен - -### Быстрое решение: - -1. Убедитесь что backend запущен: `cd /home/fovway/git/NoteJS && npm start` -2. Перезапустите Vite dev server: `cd notejs-react && npm run dev` -3. Откройте браузер и проверьте консоль для деталей ошибки diff --git a/OFFLINE_FIX.md b/OFFLINE_FIX.md deleted file mode 100644 index d58fdf8..0000000 --- a/OFFLINE_FIX.md +++ /dev/null @@ -1,131 +0,0 @@ -# Исправление проблемы с оффлайн режимом - -## Проблема -При обновлении страницы в оффлайн режиме попеременно показывается сообщение "нет подключения к интернету" и нормальное отображение приложения. - -## Причина -Service Worker использовал стратегию, которая пыталась обратиться к сети перед использованием кэша, что приводило к показу страницы ошибки браузера при отсутствии подключения. - -## Решение -Внесены изменения в `vite.config.ts` для обеспечения стабильной работы в оффлайн режиме: - -### 1. Стратегия CacheFirst для навигационных запросов -Теперь при обновлении страницы Service Worker **сразу** загружает кэшированную версию без попыток обращения к сети: - -```typescript -{ - urlPattern: ({ request }) => request.mode === 'navigate', - handler: "CacheFirst", - options: { - cacheName: "pages-cache", - expiration: { - maxEntries: 10, - maxAgeSeconds: 7 * 24 * 60 * 60, // 7 days - }, - cacheableResponse: { - statuses: [0, 200], - }, - }, -} -``` - -### 2. Дополнительное кэширование HTML файлов -Добавлено специальное правило для всех HTML файлов: - -```typescript -{ - urlPattern: /\.html$/, - handler: "CacheFirst", - options: { - cacheName: "html-cache", - expiration: { - maxEntries: 10, - maxAgeSeconds: 7 * 24 * 60 * 60, - }, - cacheableResponse: { - statuses: [0, 200], - }, - }, -} -``` - -### 3. Автоматическое обновление Service Worker -Изменен тип регистрации с `"prompt"` на `"autoUpdate"` для обеспечения автоматического обновления SW без запроса пользователя: - -```typescript -registerType: "autoUpdate" -``` - -### 4. Отключение Navigation Preload -Добавлена настройка `navigationPreload: false` для предотвращения попыток загрузки из сети при навигации. - -## Как применить изменения - -### 1. Пересборка проекта -```bash -npm run build -``` - -### 2. Копирование файлов на сервер -После успешной сборки скопируйте содержимое папки `dist/` в `backend/public/`: - -```bash -# Windows PowerShell -Remove-Item -Recurse -Force backend/public/* -Copy-Item -Recurse dist/* backend/public/ - -# Linux/Mac -rm -rf backend/public/* -cp -r dist/* backend/public/ -``` - -### 3. Запуск сервера -Запустите сервер (или попросите это сделать): - -```bash -cd backend -npm start -``` - -### 4. Проверка работы -1. Откройте приложение в браузере -2. Дождитесь полной загрузки приложения -3. Откройте DevTools → Application → Service Workers -4. Убедитесь, что новый Service Worker активирован -5. Переключите браузер в оффлайн режим (DevTools → Network → Offline) -6. Обновите страницу несколько раз - приложение должно загружаться из кэша каждый раз - -### 5. Очистка старого кэша (если необходимо) -Если проблема все еще возникает, попробуйте: -1. DevTools → Application → Clear storage → Clear site data -2. Закройте и откройте браузер заново -3. Перейдите на сайт снова - новый SW установится и закэширует все ресурсы -4. Проверьте работу в оффлайн режиме - -## Технические детали - -### Стратегии кэширования - -**CacheFirst (Cache First, Network Fallback)** -- Сначала проверяется кэш -- Если ресурс найден в кэше, он возвращается немедленно -- Если ресурса нет в кэше, делается запрос к сети -- Идеально для статических ресурсов и оффлайн работы - -**NetworkFirst** (используется для API) -- Сначала пытается загрузить из сети -- Если сеть недоступна или таймаут, возвращается кэшированная версия -- Идеально для данных, которые должны быть актуальными - -### Настройки Service Worker -- `skipWaiting: true` - новый SW активируется немедленно -- `clientsClaim: true` - новый SW берет контроль над всеми открытыми страницами -- `cleanupOutdatedCaches: true` - автоматическая очистка устаревших кэшей - -## Ожидаемый результат -После применения изменений приложение будет: -- ✅ Всегда загружаться из кэша в оффлайн режиме -- ✅ Не показывать страницу "нет подключения к интернету" -- ✅ Работать стабильно при любом количестве обновлений страницы -- ✅ Автоматически обновлять Service Worker без запроса пользователя - diff --git a/QUICK_START.md b/QUICK_START.md deleted file mode 100644 index 83137bc..0000000 --- a/QUICK_START.md +++ /dev/null @@ -1,144 +0,0 @@ -# Быстрый старт NoteJS React - -## 🚀 Первый запуск - -### 1. Установка всех зависимостей - -```bash -# Установка зависимостей фронтенда -npm install - -# Установка зависимостей бэкенда -cd backend && npm install && cd .. -``` - -### 2. Запуск приложения - -```bash -# Запуск фронтенда и бэкенда одновременно -npm start -``` - -Приложение будет доступно по адресу: **http://localhost:5173** - -⚠️ **ВАЖНО:** Открывайте именно **http://localhost:5173** (Frontend), а НЕ http://localhost:3001 (Backend API) - -## 🏗️ Архитектура - -Приложение разделено на два независимых сервера: - -1. **Frontend (React + Vite)** - порт 5173 - - - Отображает интерфейс пользователя - - Обрабатывает роутинг - - Проксирует API запросы к бэкенду - -2. **Backend (Node.js + Express)** - порт 3001 - - Предоставляет REST API - - Работает с базой данных - - Обрабатывает аутентификацию - - Хранит файлы и изображения - -**Как это работает:** - -- Вы открываете http://localhost:5173 -- Frontend отображает интерфейс -- При запросе данных Frontend обращается к Backend API -- Backend обрабатывает запрос и возвращает данные - -## 📋 Полезные команды - -### Запуск - -```bash -# Запуск всего приложения (фронтенд + бэкенд) -npm start -# или -npm run dev:all - -# Запуск только фронтенда -npm run dev - -# Запуск только бэкенда -npm run server -# или -cd backend && npm start -``` - -### Сборка - -```bash -# Production сборка фронтенда -npm run build - -# Предпросмотр production сборки -npm run preview -``` - -### Разработка - -```bash -# Проверка кода (линтинг) -npm run lint -``` - -## 🔧 Первоначальная настройка - -### 1. Настройка бэкенда - -Создайте файл `backend/.env`: - -```env -PORT=3001 -SESSION_SECRET=замените-на-свой-секретный-ключ -NODE_ENV=development -ENCRYPTION_KEY=замените-на-свой-ключ-минимум-32-символа -``` - -**Важно:** `ENCRYPTION_KEY` используется для шифрования заметок в базе данных. Используйте надежный случайный ключ минимум 32 символа! - -### 2. Первый пользователь - -1. Откройте http://localhost:5173 -2. Перейдите на страницу регистрации -3. Создайте учетную запись - -### 3. Настройка AI (опционально) - -1. Войдите в приложение -2. Перейдите в "Настройки" -3. Вкладка "AI настройки" -4. Введите: - - API ключ - - Base URL (например: `https://api.openai.com/v1/`) - - Модель (например: `gpt-3.5-turbo`) -5. Включите "Включить AI функционал" - -## 📍 Адреса - -- **Фронтенд (dev)**: http://localhost:5173 -- **Бэкенд API**: http://localhost:3001 -- **Старая версия**: http://localhost:3000 (если запущена) - -## ❓ Проблемы - -### Порт уже занят - -Если порт 3001 или 5173 занят: - -1. Измените порт в `backend/.env` (для бэкенда) -2. Измените порт в `vite.config.ts` (для фронтенда) - -### База данных не создается - -Проверьте, что папка `backend/database/` существует и доступна для записи. - -### Не загружаются файлы - -Проверьте, что папка `backend/public/uploads/` существует и доступна для записи. - -## 📖 Документация - -Полная документация в файле [README_RU.md](README_RU.md) - -Backend документация: [backend/README.md](backend/README.md) diff --git a/README_RU.md b/README_RU.md deleted file mode 100644 index 567e59b..0000000 --- a/README_RU.md +++ /dev/null @@ -1,204 +0,0 @@ -# NoteJS React - Приложение для заметок - -Современное PWA приложение для ведения заметок с поддержкой Markdown, изображений, файлов и AI. - -## Структура проекта - -``` -notejs-react/ -├── backend/ # Backend сервер (Node.js + Express) -│ ├── database/ # SQLite базы данных -│ ├── public/ # Статические файлы и загрузки -│ ├── server.js # Основной файл сервера -│ └── package.json # Зависимости бэкенда -├── src/ # Frontend исходники (React + TypeScript) -│ ├── api/ # API клиенты -│ ├── components/ # React компоненты -│ ├── hooks/ # Кастомные хуки -│ ├── pages/ # Страницы приложения -│ ├── store/ # Redux store -│ ├── styles/ # CSS стили -│ ├── types/ # TypeScript типы -│ └── utils/ # Утилиты -├── public/ # Публичные файлы (иконки, манифест) -└── package.json # Зависимости фронтенда -``` - -## Установка - -### 1. Установка зависимостей фронтенда - -```bash -npm install -``` - -### 2. Установка зависимостей бэкенда - -```bash -cd backend -npm install -cd .. -``` - -## Запуск - -### Вариант 1: Запуск всего приложения (рекомендуется) - -```bash -npm start -``` - -или - -```bash -npm run dev:all -``` - -Это запустит: - -- **Frontend** на `http://localhost:5173` -- **Backend** на `http://localhost:3001` - -### Вариант 2: Раздельный запуск - -**Frontend:** - -```bash -npm run dev -``` - -**Backend (в отдельном терминале):** - -```bash -npm run server -``` - -или - -```bash -cd backend -npm start -``` - -## Функционал - -### ✨ Основные возможности - -- 📝 Создание и редактирование заметок с Markdown -- 🖼️ Загрузка изображений к заметкам -- 📎 Прикрепление файлов (PDF, DOC, XLS, ZIP и др.) -- 📌 Закрепление важных заметок -- 📦 Архивация заметок -- 🔍 Поиск по заметкам и тегам -- 📅 Календарь заметок -- 🏷️ Система тегов -- 🌓 Светлая/тёмная тема -- 🎨 Настройка цветовой схемы -- 👤 Профили пользователей с аватарами - -### 🤖 AI функционал - -- Улучшение текста заметок -- Исправление ошибок -- Генерация контента -- Настройка собственного OpenAI-совместимого API - -### 📱 PWA - -- Установка как приложение -- Работа офлайн (Service Worker) -- Push-уведомления (опционально) -- Адаптивный дизайн для всех устройств - -### Markdown поддержка - -- Заголовки (H1-H5) -- **Жирный** и _курсив_ -- Списки (маркированные и нумерованные) -- ~~Зачеркнутый текст~~ -- [Ссылки](https://example.com) -- `Код` и блоки кода -- Todo списки с чекбоксами -- ||Спойлеры|| -- Внешние ссылки - -## Технологии - -### Frontend - -- React 18 -- TypeScript -- Redux Toolkit -- React Router -- Vite -- Axios -- Marked (Markdown) -- Iconify - -### Backend - -- Node.js -- Express -- SQLite3 -- Bcrypt -- Multer -- Express Session -- Helmet - -## Разработка - -### Сборка production версии - -```bash -npm run build -``` - -Собранные файлы будут в папке `dist/`. - -### Проверка типов - -```bash -npm run lint -``` - -## Конфигурация - -### Backend (.env) - -Создайте файл `backend/.env`: - -```env -PORT=3001 -SESSION_SECRET=your-secret-key-here -NODE_ENV=development -ENCRYPTION_KEY=your-encryption-key-min-32-chars -``` - -**Важно:** -- `ENCRYPTION_KEY` - ключ для шифрования заметок в базе данных (минимум 32 символа) -- В продакшене ОБЯЗАТЕЛЬНО используйте надежный случайный ключ -- Не используйте дефолтный ключ в продакшене! - -### AI настройки - -Настройки AI выполняются через интерфейс приложения в разделе "Настройки". - -Требуется: - -- OpenAI API Key (или ключ совместимого API) -- Base URL (например, `https://api.openai.com/v1/`) -- Модель (например, `gpt-3.5-turbo`) - -## Порты - -- **Frontend (dev)**: `http://localhost:5173` -- **Backend**: `http://localhost:3001` -- **Старое приложение**: `http://localhost:3000` (если запущено) - -## Лицензия - -ISC - -## Автор - -NoteJS Team diff --git a/backend/server.js b/backend/server.js index 9cdc5d2..b93e47b 100644 --- a/backend/server.js +++ b/backend/server.js @@ -625,18 +625,18 @@ function runMigrations() { console.log( "Колонка is_public_profile добавлена в таблицу users" ); - // Устанавливаем is_public_profile = 1 для всех существующих пользователей + // Только для NULL значений устанавливаем DEFAULT (1) db.run( - "UPDATE users SET is_public_profile = 1 WHERE is_public_profile IS NULL OR is_public_profile = 0", + "UPDATE users SET is_public_profile = 1 WHERE is_public_profile IS NULL", (updateErr) => { if (updateErr) { console.error( - "Ошибка обновления is_public_profile для существующих пользователей:", + "Ошибка обновления is_public_profile для пользователей с NULL:", updateErr.message ); } else { console.log( - "is_public_profile установлен в 1 для всех существующих пользователей" + "is_public_profile установлен в 1 для пользователей с NULL" ); } } @@ -644,23 +644,6 @@ function runMigrations() { } } ); - } else { - // Если колонка уже существует, обновляем существующих пользователей с NULL или 0 - db.run( - "UPDATE users SET is_public_profile = 1 WHERE is_public_profile IS NULL OR is_public_profile = 0", - (updateErr) => { - if (updateErr) { - console.error( - "Ошибка обновления is_public_profile для существующих пользователей:", - updateErr.message - ); - } else { - console.log( - "is_public_profile установлен в 1 для всех существующих пользователей" - ); - } - } - ); } }); diff --git a/dev-dist/sw.js b/dev-dist/sw.js index 0400897..5721164 100644 --- a/dev-dist/sw.js +++ b/dev-dist/sw.js @@ -82,7 +82,7 @@ define(['./workbox-47da91e0'], (function (workbox) { 'use strict'; "revision": "3ca0b8505b4bec776b69afdba2768812" }, { "url": "/index.html", - "revision": "0.rkgg11egm7o" + "revision": "0.unrihnsl5to" }], { "ignoreURLParametersMatching": [/^utm_/, /^fbclid$/] }); diff --git a/install.sh b/install.sh deleted file mode 100755 index ff38029..0000000 --- a/install.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/bash - -# Скрипт для установки всех зависимостей NoteJS React - -echo "📦 Установка зависимостей NoteJS React..." -echo "" - -# Установка зависимостей фронтенда -echo "1️⃣ Установка зависимостей фронтенда..." -npm install - -if [ $? -ne 0 ]; then - echo "❌ Ошибка установки зависимостей фронтенда" - exit 1 -fi - -echo "" -echo "2️⃣ Установка зависимостей бэкенда..." -cd backend -npm install - -if [ $? -ne 0 ]; then - echo "❌ Ошибка установки зависимостей бэкенда" - exit 1 -fi - -cd .. - -echo "" -echo "✅ Все зависимости успешно установлены!" -echo "" -echo "Для запуска приложения выполните:" -echo " npm start" -echo "или" -echo " ./start.sh" - diff --git a/review.md b/review.md new file mode 100644 index 0000000..2045d30 --- /dev/null +++ b/review.md @@ -0,0 +1,154 @@ +● Проведено полное ревью кода вашего приложения. Вот краткое резюме найденных проблем: + + 🔴 КРИТИЧЕСКИЕ УЯЗВИМОСТИ БЕЗОПАСНОСТИ + + 1. Hardcoded Secrets в репозитории ⚠️ CRITICAL + + Файл: backend/.env + - Ключ шифрования и секреты коммитятся в git + - Любой с доступом к репозиторию может расшифровать все заметки + - СРОЧНО: Удалите .env из истории git, ротируйте все секреты + + 2. Отключена CORS защита ⚠️ HIGH + + Файл: backend/server.js + - CORS пакет установлен, но НЕ используется + - Приложение открыто для CSRF атак + - API доступен с любых доменов + + 3. Отключен Rate Limiting ⚠️ HIGH + + Файл: backend/server.js:187-192 + - Защита от брутфорса закомментирована + - Возможны DDoS атаки + - Перебор паролей неограничен + + 4. Отсутствует CSRF защита ⚠️ HIGH + + - Все POST/PUT/DELETE эндпоинты уязвимы + - Используются сессии, но без CSRF токенов + + 5. Небезопасная конфигурация сессий ⚠️ HIGH + + Файл: backend/server.js:221-236 + cookie: { + secure: false, // ❌ куки передаются по HTTP + // ❌ нет httpOnly + // ❌ нет sameSite + } + + 🟡 СРЕДНИЕ УЯЗВИМОСТИ + + 6. Слабые требования к паролям + + - Минимум только 6 символов + - Нет требований к сложности + - Рекомендация: минимум 12 символов + буквы/цифры/спецсимволы + + 7. Path Traversal в загрузке файлов + + Файл: backend/server.js:1637-1641 + - Недостаточная санитизация имен файлов + - Возможна запись в произвольные директории + + 8. Недостаточная валидация файлов + + - Проверка только по MIME типу + - Возможна загрузка вредоносных файлов с подменой расширения + - Рекомендация: Magic byte validation + + 9. Нет валидации AI input + + Файлы: server.js:3117, 3258, 3655 + - Возможны prompt injection атаки + - Нет лимитов на длину текста + - Риск больших расходов на API + + 10. Слабая генерация backup кодов + + Math.random().toString(36) // ❌ не криптографически безопасно + Используйте: crypto.randomBytes() + + 📊 ПРОБЛЕМЫ КАЧЕСТВА КОДА + + 11. Массовое дублирование кода + + Файлы: NoteEditor.tsx vs NoteItem.tsx + - 500+ строк идентичного markdown кода + - При багфиксе нужно править 2 места + - Рекомендация: Вынести в useMarkdownEditor hook + + 12. Проблемы производительности + + Файл: NoteEditor.tsx:820-870 + - handleSelection вызывается на каждый mousemove + - Нет debounce/throttle + - Рекомендация: Добавить debounce 100ms + + Файл: NotesList.tsx:167-183 + - Сортировка массива на каждом рендере + - Рекомендация: Обернуть в useMemo + + 13. Злоупотребление TypeScript any + + - 29 использований error: any + - any в types для sync queue + - Множество @ts-expect-error + - Рекомендация: Использовать unknown и type guards + + 14. Огромные компоненты + + Файл: NoteEditor.tsx - 1,172 строки + - Нарушение Single Responsibility + - Рекомендация: Разбить на: + - Core editor + - useMarkdownEditor hook + - useFloatingToolbar hook + - useAIFeatures hook + + 15. Проблемы с accessibility + + - Кнопки без aria-label + - Inputs без labels + - Нет focus management в модалках + - Icon-only кнопки без текстовых альтернатив + + 16. Отключенные ESLint правила + + // eslint-disable-next-line react-hooks/exhaustive-deps + - Вместо исправления - отключение + - Пропущенные зависимости в useEffect + + 🎯 ПРИОРИТЕТЫ ИСПРАВЛЕНИЯ + + ⚠️ СРОЧНО (24 часа): + + 1. Удалить .env из git истории + 2. Ротировать все секреты + 3. Включить rate limiting + 4. Настроить CORS + 5. Исправить session cookies + + 🔴 Высокий (1 неделя): + + 1. Добавить CSRF защиту + 2. Улучшить валидацию паролей + 3. Исправить CSP конфигурацию + 4. Добавить валидацию всех inputs + 5. Исправить проблемы с TypeScript any + + 🟡 Средний (1 месяц): + + 1. Вынести дублированный код + 2. Оптимизировать производительность + 3. Разбить большие компоненты + 4. Добавить unit тесты + 5. Исправить accessibility + + 📈 Метрики качества: + + - Безопасность: 4/10 + - Качество кода: 6.5/10 + - TypeScript: 5/10 + - Производительность: 6/10 + - Accessibility: 4/10 \ No newline at end of file diff --git a/start.sh b/start.sh deleted file mode 100755 index 62e0f77..0000000 --- a/start.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash - -# Скрипт для запуска NoteJS React приложения - -echo "🚀 Запуск NoteJS React..." -echo "" -echo "Frontend: http://localhost:5173" -echo "Backend: http://localhost:3001" -echo "" -echo "Для остановки нажмите Ctrl+C" -echo "" - -# Запускаем приложение -npm start -