← К списку версий
v0.80.1
28.09.2026
PATCH
Мусорные проекты убраны: откуда они взялись и почему не вернутся
ТЗ 254 «Локальные проекты». Найдена причина, по которой в списке проектов появлялись пустые строки с бейджем «Локальный»: их создавал сам DatabaseSeeder — при каждом запуске `php artisan db:seed`, то есть при каждой смене версии платформы, он вставлял пять проектов-шаблонов каждому клиенту без проверок. Один запуск 25.09.2026 в 20:40:16 дал 93 проекта с нулём задач, нулём участников и нулём писем, а заодно привязал четыре демо-токена к пустым проектам. Демо-данные вынесены в отдельный DemoSeeder, который запускается только на пустой базе и больше не вызывается при смене версии; учётная запись администратора больше не переписывается (пароль не сбрасывается, дата создания не затирается). Из базы удалены 93 мусорных проекта и 4 демо-клиента вместе с их токенами.
Что было
- Источник мусора - DatabaseSeeder::seedProjects() вставлял пять проектов-шаблонов («Разработка сайта», «SEO-продвижение», «Мобильное приложение», «Техподдержка», «Дизайн-проект») каждому клиенту, кроме администратора, без проверки на повтор. Штатная процедура смены версии платформы требует `php artisan db:seed`, поэтому мусор появлялся сам, без участия человека. Доказательство: у всех 93 проектов одна и та же дата created_at 2026-09-25 20:40:16, и в ту же секунду в versions появилась запись 0.77.1.
- Что было на самом деле - Из 135 проектов 41 имел external_id (настоящие, с платформы задач), 1 был локальным, но настоящим («Ришелье стиль», 22.08.2026, 3 участника, 123 письма, папка Total Commander), и 93 были пустыми заготовками.
- Откуда взялись «непонятные люди» - Иван Петров (client@ipd.by), Тестовый Пользователь (test@ipd.by) и Демо Клиент (demo@ipd.by) создавались ClientSeeder, а Тестовый Клиент (client@project.ipd.test, 29.07.2026) был заведён вручную. Тестовый Пользователь — единственный с ролью test.
Что изменено в коде
- DemoSeeder - Новый сидер database/seeders/DemoSeeder.php: три демо-клиента, пять проектов-шаблонов на каждого и токены. DatabaseSeeder его не вызывает. Запуск только на пустой базе: если в projects есть хоть одна строка или в clients есть хоть один не-администратор, сидер бросает RuntimeException с объяснением.
- DatabaseSeeder - Вызывает только идемпотентные сидеры: TariffSeeder, ClientSeeder, ClientTaskTemplateSeeder, VersionSeeder. Методы seedProjects() и seedProjectTokens() удалены.
- ClientSeeder - Осталась только учётная запись администратора и её токен. Создаёт их, только если их нет: повторный запуск больше не переписывает created_at и не сбрасывает пароль на admin123 (раньше updateOrInsert делал именно это при каждой смене версии).
- Версия - v0.80.1 (.env, .env.example, config/app.php, VersionSeeder, README.md).
Результат
- В списке проектов остались настоящие проекты: 41 с платформы задач и один локальный «Ришелье стиль». Повторный `php artisan db:seed` больше не добавляет ни проектов, ни демо-клиентов.