v4.1.21: Реструктуризация проекта для Synology ARM

- Реструктуризация: src/ разбит на middleware/, utils/, repositories/ (удалены), routes/ (удалены)
- Добавлен src/original-html.ts — полный HTML с reportModal
- Добавлен src/index.tsx.backup — React-компонент с reportModal
- Миграции переименованы (0001_initial_schema.sql)
- Добавлена миграция 0018 (удалена позже)
- Docker: multi-stage build, wrangler.toml
- Frontend: public/static/app.js + style.css
- seed.sql добавлен
- Документация: CHANGELOG, CHANGES_v4.1.0-4.1.9, PROJECT_STRUCTURE
This commit is contained in:
Deploy Bot
2026-01-14 18:37:00 +02:00
parent 4898f5ec7f
commit 64403d6fd6
113 changed files with 19231 additions and 3084 deletions

232
CHANGELOG.md Normal file
View File

@@ -0,0 +1,232 @@
# AKNAPROFF Tootmine - CHANGELOG
## v4.1.10 - 2025-12-31 (HOTFIX - КРИТИЧЕСКИЕ ИСПРАВЛЕНИЯ)
### 🔥 Критические исправления
#### 1. Исправлена потеря данных при рестарте Docker
- **Проблема:** Миграции пересоздавали БД при каждом запуске
- **Симптомы:**
- Существующая БД с 38 записями терялась
- При обновлении страницы старые данные появлялись на секунду
- **Решение:**
- Добавлен флаг `SKIP_MIGRATIONS=true` в `docker-entrypoint.sh`
- Добавлена переменная `SKIP_MIGRATIONS: "true"` в `docker-compose.yml`
- Миграции теперь пропускаются по умолчанию
- Используется готовая БД из `data/` директории
- **Файлы:** `docker-entrypoint.sh`, `docker-compose.yml`
#### 2. Исправлена ошибка 500 при добавлении записи
- **Проблема:** `POST /api/records` возвращал 500 Internal Server Error
- **Симптомы:**
```
POST http://komo.aknaproff.ee:8180/api/records
[HTTP/1.1 500 Internal Server Error]
Save record error: "Failed to create record"
```
- **Причина:** Таблица `production_records` требует поля `created_by` и `updated_by`, но они не передавались
- **Решение:**
- Добавлены поля `created_by` и `updated_by` в INSERT запрос
- Добавлено поле `updated_by` в UPDATE запрос
- Значения берутся из `userId` (из JWT токена)
- **Файлы:** `src/index.tsx`, `dist/_worker.js`
#### 3. Исправлена неработающая кнопка "Lisa uus rida"
- **Проблема:** Admin не мог добавить новую запись
- **Причина:** Ошибка 500 в backend (см. пункт 2)
- **Решение:** Исправлен backend код
- **Статус:** ✅ Теперь работает
### 📝 Изменённые файлы
#### Backend
- **src/index.tsx**
- `POST /api/records`: добавлены поля `created_by, updated_by` в INSERT
- `PUT /api/records/:id`: добавлено поле `updated_by` в UPDATE
- **dist/_worker.js**
- Пересобран с исправлениями
#### Docker
- **docker-entrypoint.sh**
- Добавлен флаг `SKIP_MIGRATIONS` (по умолчанию `true`)
- Добавлена логика проверки `SKIP_MIGRATIONS`
- При `SKIP_MIGRATIONS=true` миграции пропускаются
- **docker-compose.yml**
- Добавлена переменная `SKIP_MIGRATIONS: "true"`
#### Frontend
- **public/original.html**
- Cache version обновлена: `app.js?v=4.1.10`
### ⚠️ Breaking Changes
Нет breaking changes. Полная обратная совместимость с v4.1.9.
### 🔄 Миграция с v4.1.9
1. Остановить контейнер: `docker-compose down`
2. **КРИТИЧНО:** Сделать бэкап: `cp -r data data.backup.$(date +%Y%m%d_%H%M%S)`
3. Заменить файлы (НЕ трогать `data/`)
4. Проверить `SKIP_MIGRATIONS: "true"` в `docker-compose.yml`
5. Запустить: `docker-compose up -d --build`
6. Проверить данные: 38 записей должны остаться
### ✅ Тесты
- [x] Данные сохраняются между рестартами
- [x] Миграции пропускаются (логи: "Skipping migrations")
- [x] POST /api/records работает (200 OK)
- [x] Кнопка "Lisa uus rida" работает
- [x] created_by/updated_by записываются в БД
- [x] Admin может добавлять записи
- [x] User НЕ может добавлять записи
- [x] User НЕ может редактировать заметки
- [x] User может редактировать проблемы
### 📦 Архивы
- `aknaproff_production_v4.1.10_arm.tar.gz` (278 KB)
- `aknaproff_production_v4.1.10_arm.zip` (318 KB)
---
## v4.1.9 - 2025-12-30
### 🔒 Исправлены права доступа
#### 1. User теперь может только просматривать заметки (read-only)
- **Проблема:** User мог редактировать заметки
- **Решение:**
- Frontend: `openNotesModal()` использует `canEditRecords()` (только admin)
- Frontend: кнопка "Salvesta" скрыта для user
- Backend: `PATCH /api/records/:id/notes` → Admin only (403 для user)
- **Статус:** ✅ Исправлено
#### 2. User может редактировать проблемы
- **Backend:** `PATCH /api/records/:id/problems` → Admin + User
- **Frontend:** UI показывает возможность редактирования
- **Статус:** ✅ Работает
#### 3. Кнопка "Lisa uus rida" скрыта для User и Guest
- **Frontend:** Кнопка скрыта через `role-admin` CSS класс
- **Backend:** Проверка роли перед созданием записи
- **Статус:** ✅ Работает
### 📊 Матрица прав доступа
| Функция | Admin | User | Guest |
|----------------------|-------|------|-------|
| Просмотр записей | ✅ | ✅ | ✅ |
| Добавить запись | ✅ | ❌ | ❌ |
| Редактировать запись | ✅ | ❌ | ❌ |
| Удалить запись | ✅ | ❌ | ❌ |
| Просмотр заметок | ✅ | ✅ | ✅ |
| Редактировать заметки| ✅ | ❌ | ❌ |
| Просмотр проблем | ✅ | ✅ | ✅ |
| Редактировать проблемы| ✅ | ✅ | ❌ |
### 📝 Изменённые файлы
- `public/static/app.js`: изменены `openNotesModal()`, `saveNotes()`
- `src/index.tsx`: добавлены проверки роли в API
- `public/original.html`: cache v4.1.9
---
## v4.1.8 - 2025-12-30
### 🐛 Исправления
#### 1. Исправлены права пользователей
- **Проблема:** User не мог редактировать Problems
- **Решение:** Изменён `openProblemsModal()` на использование `canEditProblems()`
#### 2. Скрыта кнопка "Lisa uus rida" для non-admin
- **Frontend:** Кнопка скрыта для User и Guest ролей
- **CSS:** Использован класс `.role-admin`
#### 3. Добавлены колонки problems
- **База данных:**
- `problems` TEXT DEFAULT NULL
- `problems_date` DATE DEFAULT NULL
- **Миграции:** Применены в локальной БД
#### 4. Исправлены названия полей audit_log
- **Было:** `field_name`, `action_type`
- **Стало:** `field`, `action`
- **Файлы:** `src/index.tsx`
### 📦 Изменения БД
```sql
ALTER TABLE production_records ADD COLUMN problems TEXT DEFAULT NULL;
ALTER TABLE production_records ADD COLUMN problems_date DATE DEFAULT NULL;
```
---
## v4.1.7 - 2025-12-30
### 🔐 Исправлена аутентификация
#### 1. Исправлена система входа (bcrypt → SHA-256)
- **Проблема:** Login failed - несовместимость хэшей
- **Было:** Бэкап использовал bcrypt ($2a$)
- **Стало:** Все пароли SHA-256
- **Решение:** Обновлены все password_hash в БД
#### 2. Удалён дубликат пользователя
- **Удалён:** user `tootmine` (дубликат kasutaja)
- **Причина:** Один человек, два аккаунта
- **Статус:** ✅ Удалён
#### 3. Добавлена колонка deleted_at
- **Таблица:** `users`
- **Тип:** `DATETIME DEFAULT NULL`
- **Причина:** Код использовал `WHERE deleted_at IS NULL`, но колонки не было
- **Статус:** ✅ Добавлена
### 📊 База данных
- **Записей:** 38 production records
- **Пользователей:** 3 active
- `admin` / `demo123` (admin)
- `aknaproff` / `demo123` (admin)
- `kasutaja` / `tootmine` (user)
### 🔒 Учётные данные
Все пароли теперь SHA-256:
```
admin: d3ad9315b7be5dd53b31a273b3b3aba5defe700808305aa16a3062b76658a791
aknaproff: d3ad9315b7be5dd53b31a273b3b3aba5defe700808305aa16a3062b76658a791
kasutaja: a1026b7bd143f7190248bc79901e9a357a408e208f2d8e4d38fccf184754f35f
```
---
## v4.1.6 и ранее
См. файлы:
- `CHANGES_v4.1.6.md`
- `CHANGES_v4.1.5.md`
- `CHANGES_v4.1.4.md`
- `CHANGES_v4.1.3.md`
- `CHANGES_v4.1.2.md`
- `CHANGES_v4.1.0.md`
---
## Легенда
- 🔥 Критическое исправление
- 🐛 Исправление бага
- ✨ Новая функция
- 🔒 Безопасность
- 📝 Документация
- 🔧 Конфигурация
- 📊 База данных
- 🎨 UI/UX
- ⚡ Производительность
- 🔄 Рефакторинг
---
**Текущая версия:** v4.1.10
**Дата:** 2025-12-31
**Статус:** Production Ready ✅
**Архитектура:** ARM64/AMD64 (Synology Compatible)