После публикации предыдущей статьи на Хабре я неожиданно получил длинный список запросов от читателей. Кто-то переживал, что приложение не работает без интернета, а кто-то хотел установить его как обычное мобильное приложение.

Плюс оказалось, что часть людей банально не может восстановить пароль — а в моём MVP этой функции не было вовсе. Я посмотрел на всё это и понял, что задача тянет на хороший месяц разработки, но чисто спортивный интерес победил: решил попробовать сделать всё за два вечера после работы, используя Claude Code по максимуму.

Получился интересный эксперимент. Вот что вышло.

Пока я разрабатывал, главный тестировщик спал

В первый вечер я занялся офлайн-режимом. По сути, это фундамент для любого медицинского или околомедицинского приложения — измерения должны сохраняться всегда, даже если связь пропала. Я настроил сервис-воркер, кеширование статики и локальную IndexedDB, чтобы все данные жили в браузере до синхронизации. Приложение после пары итераций действительно стало открываться без интернета: даже если включить режим «в самолёте», интерфейс загружается, записи добавляются, а очередь изменений складывается в локальную базу.

Когда сеть появляется, все временные UUID отправляются на сервер и заменяются на реальные ID — механизм оказался удивительно устойчивым даже при стресс-тестах. Исправил несколько мелких нюансов вроде задержки обновления графика, сделал индикатор офлайна и поставил нормальный манифест, чтобы приложение можно было установить на телефон. После генерации иконок Chrome честно предложил «Установить Diabnostic», и оно выглядело не хуже нативного.

баннер "Офлайн-режим" с счётчиком операций
Интерфейс оффлайн-режима
Интерфейс оффлайн-режима
UUID ожидающие синхронизации
UUID ожидающие синхронизации
Мобильный вид
It`s alive!
It`s alive!
Само приложение
Само приложение

Во второй вечер я занялся кабинетом клиники и кабинетом ветеринара. Об этом меня никто специально не просил, но по мере работы стало очевидно, что такая часть системы напрашивается сама собой: если владельцам удобно вести историю питомца, то врачу тоже нужно иметь возможность смотреть данные своих пациентов в одном месте.

Архитектура получилась довольно прямолинейной: у клиники есть сотрудники, у каждого — свой VET-код, который владельцы животных вводят, чтобы прикрепить питомца к конкретному врачу. Или же наоборот, владелец может предоставить свой PET-код ветеринару. Я начал с регистрации по инвайт-коду, поправил ряд багов с VET и PET кодами, сделал интерфейс управления командой и роли для администраторов.

Кабинет ветеринара получился максимально практичным: список пациентов, поиск сразу по кличке и имени владельца, графики и история измерений. AI-анализ подключился почти безболезненно, нужно было только правильно ограничить доступ, чтобы каждый врач видел ровно своих животных.

По дороге я заодно закрыл технический долг: фоновые задачи перенёс из памяти Python в Redis, чтобы можно было масштабировать сервис без риска потерять состояние, и добавил блокировку миграций, чтобы не ловить гонки при запуске нескольких экземпляров.

Скриншоты: кабинет ветеринара
Страница управления клиникой
Страница управления клиникой
AI анализ, возможно ветеринарам нужно давать чуть большую свободу в обращении с AI?
AI анализ, возможно ветеринарам нужно давать чуть большую свободу в обращении с AI?
Пациенты ветеринара
Пациенты ветеринара

Под конец я реализовал восстановление пароля, которое почему-то кажется мелочью только до момента, пока не начинаешь его писать. Выходило много неровных мест: защита от перебора email, одинаковые ответы на существующие и несуществующие адреса, задержки, чтобы нельзя было вычислить пользователя по скорости ответа, инвалидация старых токенов и рейтлимиты. Я сделал письмо со ссылкой сброса, две страницы на фронте, настроил лимиты запросов и несколько раз прогнал всё через Bandit — там всплыли старые потенциальные уязвимости, и я их заодно исправил. SonarQube выдал ноль ошибок, и это был приятный финальный аккорд.

Забыли пароль? Ну что ж теперь.
Такое вот приходит письмо
Такое вот приходит письмо
И всем знакомая форма восстановления пароля
И всем знакомая форма восстановления пароля
Вывод Bandit и рейтинги Sonarqube
Что нашел бандит
Что нашел бандит
Для проекта на 17к LOC вполне неплохо
Для проекта на 17к LOC вполне неплохо

Итоги

Итак, два вечера — примерно пятнадцать часов — и приложение получило офлайн-режим, полноценный PWA, синхронизацию, кабинет клиники, кабинет ветеринара, восстановление пароля и нормальную подсистему фоновых задач на Redis. Манишкины данные теперь всегда под рукой, и я могу спокойно показать врачу всю динамику без объяснений «вот тут было 25, вот тут упало до восьми».

По итогам всей этой истории у меня сложилось простое ощущение: ИИ — это не «второй разработчик», а просто автодополнение к IDE на стероидах. Он не думает за тебя, не принимает архитектурных решений, но снимает с плеч всю рутину и позволяет двигаться в несколько раз быстрее там, где раньше уходили часы.

 Главный бенефициар проекта одобряет разработку
Главный бенефициар проекта одобряет разработку

P.S. Если вы представляете ветеринарную клинику и хотели бы протестировать новый функционал управления клиниками и командами — буду рад дать доступ и помочь с настройкой. Система позволяет вести базу пациентов, управлять командой ветеринаров и отслеживать показатели глюкозы у всех подопечных животных в одном месте. Пишите в телеграм @diabnostic_support — обсудим детали и настроим всё под ваши нужды. ?

Комментарии (0)