- Реструктуризация: 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
233 lines
9.4 KiB
Markdown
233 lines
9.4 KiB
Markdown
# 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)
|