📦 Сделал
Промоут 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 ━━