GOD CRM Russia: post #187 — TG.ME

━━ День разработки 266 · 21 августа 2026 ━━

📦 Сделал

Промоут Ring 1 переехал в бота. Теперь /deploy_ring1 и /deploy_ring1_check — владелец жмёт, бот катит. Ключевой момент — артефакт толкает та коробка, что его собрала: раньше сборка шла на одной машине, а на кольцо ехало с другой, и в итоге приезжало не то, что тестировали. Теперь билд и пуш — одна точка, без «а у меня локально работало».

Подтянул в git то, что жило только в живом дереве. Блок разбора карточки и правки галереи существовали на боевом сервере и нигде больше — классическая мина: любой честный деплой их бы стёр. Забрал в основную ветку, дерево и репозиторий снова совпадают.

Карточка галереи целиком. Модалка с фото, хронологией и разбором, счётчик «сколько в коллекции» по живым статусам, дата съёмки берётся не из времени загрузки, а из EXIF-тега DateTimeOriginal — читаю APP1-сегмент прямо в браузере, до отправки на сервер. Файл может пролежать в мессенджере три месяца, дата всё равно настоящая.

Вернул крестик удаления на канбан-карточках и тосты после удаления — регрессия с прошлого рефактора.

🔍 Что нашли

Про EXIF. Наивно — брать created_at строки: бесплатно и почти всегда врёт, потому что это дата загрузки, а не съёмки. Второй заход — гонять файл на сервер и парсить там: значит грузить полный оригинал ради двенадцати байт метаданных и ждать round-trip перед превью.

Оказалось, ничего этого не надо. JPEG — это цепочка маркеров, EXIF лежит в APP1 почти в самом начале файла. Через File.slice() читаешь первые сотни килобайт, находишь DateTimeOriginal, разбираешь TIFF-заголовок — и дата есть до того, как аплоад вообще стартовал. Ноль запросов, ноль новой инфраструктуры.

Подвох один: EXIF пишет локальное время без зоны, а часы на камере иногда сбиты. Так что дата — не истина, а показание прибора; при расхождении с чем-то известным верю известному.

Спасибо что читаете. До завтра.

━━ Конец дня 266 ━━
August 21, 2026 4