- Реструктуризация: 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
4.8 KiB
AKNAPROFF v4.1.11 - HOTFIX
Дата: 2025-12-31
Тип: HOTFIX - Критическое исправление
Статус: Production Ready ✅
🐛 Исправленная проблема
❌ Ошибка: "NOT NULL constraint failed: production_records.price"
Симптомы:
POST /api/records
[HTTP/2 500 Internal Server Error]
Save record error: Failed to create record
Консоль браузера:
Viga salvestamisel: Failed to create record
Save record error: Request failed with status code 500
Логи сервера:
Error creating record: D1_ERROR: NOT NULL constraint failed: production_records.price: SQLITE_CONSTRAINT
Причина:
В реальной БД колонка price имеет ограничение NOT NULL, но код передавал null вместо 0.
Схема БД:
CREATE TABLE production_records (
...
price REAL NOT NULL, -- ⚠️ NOT NULL!
...
);
Старый код (v4.1.10):
const price = data.price ? parseFloat(data.price) : null // ❌ null вызывает ошибку
Новый код (v4.1.11):
const price = data.price ? parseFloat(data.price) : 0 // ✅ 0 соответствует схеме
✅ Решение
Изменённые файлы:
src/index.tsx:
- POST /api/records: изменено
null→0для price - PUT /api/records/🆔 изменено
null→0для price
public/original.html:
- Cache version: v4.1.11
dist/_worker.js:
- Пересобран с исправлениями
🧪 Тестирование
Тест 1: Добавление записи без цены
curl -X POST http://localhost:3000/api/records \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"month":"1",
"year":"2025",
"client_name":"Test Client",
"offer_number":"TEST-001",
"work_number":"WRK-001",
"quantity":"5"
}'
Результат v4.1.10: ❌ 500 Internal Server Error
Результат v4.1.11: ✅ {"success":true,"id":49}
Тест 2: Проверка сохранённой записи
SELECT id, client_name, price FROM production_records WHERE id = 49
Результат:
id: 49
client_name: "Test Client"
price: 0 ✅
Тест 3: Добавление записи с ценой
curl -X POST http://localhost:3000/api/records \
-d '{"month":"1","year":"2025","client_name":"Test","offer_number":"123","work_number":"456","quantity":"1","price":"100.50"}'
Результат: ✅ {"success":true,"id":50}, price = 100.5
🔄 Миграция с v4.1.10
Обновление не требует изменений БД
Просто замените файлы:
# 1. Остановить
docker-compose down
# 2. Заменить код
cp /path/to/new/dist/_worker.js dist/
cp /path/to/new/src/index.tsx src/
cp /path/to/new/public/original.html public/
# 3. Запустить
docker-compose up -d --build
⚠️ НЕ трогайте data/ директорию!
📊 Сравнение версий
| Параметр | v4.1.10 | v4.1.11 |
|---|---|---|
| price default | null ❌ | 0 ✅ |
| Добавление без цены | 500 ошибка ❌ | Работает ✅ |
| Добавление с ценой | Работает ✅ | Работает ✅ |
| NOT NULL constraint | Нарушается ❌ | Соблюдается ✅ |
✅ Все проверки пройдены
- Добавление записи без цены → ✅ price = 0
- Добавление записи с ценой → ✅ price сохраняется
- Редактирование записи → ✅ price обновляется
- NOT NULL constraint → ✅ соблюдается
- Кнопка "Lisa uus rida" → ✅ работает
- Права доступа → ✅ admin может добавлять
- Cache version → ✅ v4.1.11
🎯 Статус
Версия: v4.1.11
Тип: HOTFIX
Критичность: Высокая (блокировала добавление записей)
Совместимость: Полная обратная совместимость
Требуется миграция БД: Нет
Статус: Production Ready ✅
📝 Changelog Summary
v4.1.11 (2025-12-31) - HOTFIX
- Fixed: NOT NULL constraint failed for price column
- Changed: price default value from null to 0
- Files: src/index.tsx, dist/_worker.js, public/original.html
- Status: Production Ready
ПРОБЛЕМА ИСПРАВЛЕНА! Добавление записей теперь работает корректно. ✅