Korat
Архитектура

Расширения, которые заведение выбирает само

Бизнес в Korat — не готовый продукт с настройками. Он собирается во время работы из модулей, каждый из которых объявляет, на что он претендует, что показывает клиенту, какие плитки добавляет в консоль владельца и какие права вводит. Четыре базовых модуля и семь расширений бесплатны: установка ничего не стоит и не добавляет абонплаты.

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

Контракт модуля

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

Ещё четыре объявления необязательны, и именно в них система себя окупает. Модуль может объявить возможности, которые становятся новыми правами для ролей персонала; плитки консоли, появляющиеся в сетке панели владельца; собственный экран консоли; и раздел клиентской страницы, встраиваемый в публичную страницу заведения. Модуль, не объявивший ни одного из четырёх, — чистый каталог; объявивший все четыре перестраивает обе стороны приложения разом.

Есть и общий набор элементов интерфейса — кнопка главного действия, строка каталога, чип, заголовок раздела и пустое состояние, — и предполагается, что модули строятся из него. Это не единый стиль ради стиля: именно он делает так, что отдельно написанный модуль выглядит частью приложения, а не встроенным виджетом.

Четыре базовых модуля — это и есть типы бизнеса

Четыре базовых модуля — вовсе не расширения; они и означают тип бизнеса. Еда претендует на ресторан и кафе. Жильё — на жильё, отель, курорт, апартаменты, кондоминиум и посёлок: шесть названий, один модуль, потому что аренда кондоминиума и ночь в гостевом доме отличаются формулировкой, а не механизмом. Услуги претендуют на услуги и клинику, где вариант клиники переименовывает интерфейс в записи, пациентов и курсы лечения, не разветвляя код. Розница претендует на розницу.

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

Четыре устанавливаемых расширения, и они работают для любого типа

Поверх базовых модулей стоят семь расширений, применимые независимо от типа бизнеса. Права команды — самое интересное, потому что оно построено из остальных модулей: оно собирает редактор прав из возможностей, объявленных каждым установленным модулем, так что установка нового модуля добавляет его права в редактор без того, чтобы кто-то правил список. Те же возможности потом читает has_capability() в базе, о чём написано на странице безопасности.

Каналы оплаты добавляют плитку консоли для настройки принимаемых каналов и видимый клиенту список на публичной странице — одно расширение пишет на обе стороны через два слота объявлений. Абонементы и подписки вводят планы, которые клиент покупает прямо со страницы заведения. Напоминания о продлении берут на себя то, что следует за абонементом или курсом. Каждое из них — выпущенный собственный модуль, написанный по тому же контракту, которым пользовался бы сторонний разработчик: сознательная дисциплина, потому что контракт настоящий, только если его авторы тоже им ограничены.

Установка и удаление — на каждое заведение

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

Удаление стоит за подтверждением, и подтверждение говорит конкретную вещь: данные не удаляются. Это важнее, чем звучит. Люди колеблются над кнопкой удаления потому, что предполагают её разрушительность, — и оставляют установленными модули, которыми не пользуются, а консоль забивается плитками, которые никто не открывает. Именно рассказ о том, чего *не* произойдёт, делает кнопку пригодной. После удаления расширение не даёт ничего — ни плиток, ни прав в редакторе ролей, ни раздела на публичной странице, — но его записи переживут повторную установку.

Чем это пока не стало

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

Мы описываем это так, потому что интересна именно архитектура и она правдива сегодня, тогда как площадка — утверждение о будущем. Контракт проверяется так: модуль, написанный целиком по нему — плитки, возможности и раздел страницы, без единого касания к ядру, — должен вести себя как родная часть приложения. Четыре таких ведут. Открытие этого посторонним — задача политики и проверки в большей степени, чем техническая, и она не решена.

Почему модули, а не флаги функций

Флаг функции что-то выключает. Модуль что-то добавляет. Разница видна в редакторе прав: с флагами кто-то ведёт главный список всех возможностей и обязан не забыть его расширить. С контрактом расширение «права команды» спрашивает каждый установленный модуль, что он объявляет, и строит редактор из ответов, так что список не может устареть. Тот же приём работает для сетки панели и для публичной страницы — ни одно из них не перечисляет функции, все они спрашивают.

Это ещё и ограничивает цену новой отрасли. Добавить тип бизнеса, который Korat пока не обслуживает, — значит написать модуль: объявить типы, каталог, главное действие и те необязательные слоты, что нужны, — не трогая ни консоль, ни отрисовку страницы, ни систему прав. Именно это делает суперприложение управляемым, а не медленным накоплением частных случаев.

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

Код плагинов к тому же по-прежнему едет внутри APK, а не загружается по мере обращения к каждому. Это известное ограничение и очевидное условие для открытия магазина кому-либо вне проекта.

Обязательные объявления
идентификатор · типы бизнеса · название · заголовок каталога · главное действие · представление каталога
Необязательные объявления
возможности · плитки консоли · экран консоли · раздел клиентской страницы
Базовые модули
Еда · Жильё · Услуги · Розница
Расширения
Права команды · Каналы оплаты · Абонементы и подписки · Напоминания о продлении
Область установки
отдельное заведение
Удаление
за подтверждением, где сказано, что данные не удаляются
Сторонние
закрыты — только собственные расширения

Частые вопросы

Можно ли написать плагин для Korat?

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

Магазин пишет об этом в приложении, а не показывает пустую полку, намекающую на обратное.

Что будет с данными, если удалить расширение?

Ничего не удаляется. Диалог подтверждения говорит это прямо, потому что предположение, что удаление разрушительно, — обычная причина, по которой люди держат установленными модули, которые никогда не открывают.

После удаления расширение не даёт ни плиток консоли, ни прав в редакторе ролей, ни раздела на публичной странице. Поставьте его снова — записи на месте.

Нужно ли выбирать тип бизнеса навсегда?

Модуль претендует на набор типов бизнеса, и тип заведения его и выбирает. Один модуль жилья претендует на шесть — жильё, отель, курорт, апартаменты, кондоминиум и посёлок, — так что названия внутри семьи взаимозаменяемы.

Семь расширений от типа не зависят: любой бизнес может поставить любое из них.

Как права модуля попадают в редактор ролей?

Расширение «права команды» строит редактор, спрашивая каждый установленный модуль, какие возможности он объявляет, а не читая вручную поддерживаемый главный список.

Поэтому установка нового модуля сразу даёт его права для назначения, и поэтому список не может устареть.

Модули выглядят иначе, чем остальное приложение?

Не должны. Общий набор элементов даёт кнопку главного действия, строку каталога, чип, заголовок раздела и пустое состояние, и модули строятся из него.

Смысл в том, чтобы модуль читался как часть приложения, а не как встроенный виджет со своим мнением об отступах.

Посмотрите, как модули работают

Создайте бизнес, выберите тип — и консоль соберётся из тех модулей, которые на него претендуют.