Кейс // Планирование операционных

Kliniq
Surgical Scheduling

Kotlin 2.1Spring Boot 3.5jOOQPostgreSQL 16RedisSvelteKit 2WebAuthnPlaywright
Открыть демо
01 // Резюме
Задача

Планирование операционных
на пределе

Время операционной — самый дефицитный ресурс клиники, но планируется оно чаще всего через общие таблицы и звонки. Пересекающиеся брони проскакивают, ни у кого нет живой картины дня, а каждое изменение запускает новый круг ручной координации — трение, которое тихо растёт по мере роста клиники.

Решение

Без конфликтов
по построению

Kliniq — платформа планирования, написанная с нуля: бэкенд на Kotlin / Spring Boot 3 с jOOQ поверх PostgreSQL и фронтенд на SvelteKit. Пересекающиеся брони не просто отсекаются в коде приложения — ограничение Postgres EXCLUDE делает их физически невозможными для вставки. Server-Sent Events держат каждое открытое расписание живым, drag-and-drop переносит бронь на месте, а самостоятельно развёрнутый стек аутентификации (Argon2id + WebAuthn passkeys) тянет всё это без сторонних провайдеров. Построено и выпущено в одиночку, от и до.

02 // Ключевые результаты
0

Двойных броней возможно

Ограничение Postgres EXCLUDE

3

Роли RBAC

Admin · Manager · Staff

Live

Расписание в реальном времени

Server-Sent Events

187

тестов бэкенда

и ещё 8 e2e на Playwright

03 // Технические особенности

Без конфликтов по построению

Ограничение Postgres EXCLUDE USING gist по каждой операционной и tstzrange делает две пересекающиеся брони физически невозможными для вставки — целостность гарантируется базой данных, а не проверками-надеждами в коде приложения.

Машина состояний брони

Каждая бронь проходит детерминированный жизненный цикл — Scheduled → In-Progress → Completed / Cancelled — с защищёнными переходами в доменном слое, которые отклоняют недопустимые скачки до того, как они достигнут БД.

Реальное время через SSE

Server-Sent Events транслируют каждое создание, изменение и отмену на все подключённые дашборды — расписание остаётся живым по всей клинике без поллинга и ручного обновления.

Своя аутентификация

Хеширование Argon2id, WebAuthn passkeys, сессии в Redis, защита от CSRF и rate-limiting по IP — полноценный стек идентификации, написанный с нуля, без Auth0 и внешних провайдеров.

04 // Демонстрация проекта
LIVE // KLINIQ.IZOTOV.DEV
PRJ-003

Живое демо

Демо работает на kliniq.izotov.dev: три операционные и брони на две недели вперёд. Зайди под любым демо-хирургом — [email protected], пароль DemoSurgeon2026! — и подвинь бронь; вторая вкладка увидит изменение без перезагрузки.

Об этом проекте

Вопросы
об архитектуре?

С удовольствием объясню, почему защита от двойных броней живёт в базе, а не в интерфейсе, и чего это стоило в других местах.