Модули — ответ Korat на проблему одного приложения для ресторанов, отелей, клиник и магазинов: честная его версия — это четыре приложения с общим входом. Нечестная — одно приложение с экраном настроек такого размера, что каждый бизнес видит в основном то, что к нему не относится. Korat идёт третьим путём: тип бизнеса выбирает модуль, модуль строит интерфейс, и ни публичная страница, ни консоль владельца не содержат зашитого знания о том, что такое ресторан.
Контракт модуля
Модуль объявляет фиксированный набор вещей, а всё остальное приложение собирает из них. Он даёт идентификатор; типы бизнеса, на которые претендует, — от этого зависит, применим ли модуль к конкретному заведению; название и заголовок каталога; главное действие — ту самую кнопку, с которой начинается страница для клиента; и представление каталога: меню для еды, типы номеров для жилья, услуги для клиники, товары для розницы.
Ещё четыре объявления необязательны, и именно в них система себя окупает. Модуль может объявить возможности, которые становятся новыми правами для ролей персонала; плитки консоли, появляющиеся в сетке панели владельца; собственный экран консоли; и раздел клиентской страницы, встраиваемый в публичную страницу заведения. Модуль, не объявивший ни одного из четырёх, — чистый каталог; объявивший все четыре перестраивает обе стороны приложения разом.
Есть и общий набор элементов интерфейса — кнопка главного действия, строка каталога, чип, заголовок раздела и пустое состояние, — и предполагается, что модули строятся из него. Это не единый стиль ради стиля: именно он делает так, что отдельно написанный модуль выглядит частью приложения, а не встроенным виджетом.
Четыре базовых модуля — это и есть типы бизнеса
Четыре базовых модуля — вовсе не расширения; они и означают тип бизнеса. Еда претендует на ресторан и кафе. Жильё — на жильё, отель, курорт, апартаменты, кондоминиум и посёлок: шесть названий, один модуль, потому что аренда кондоминиума и ночь в гостевом доме отличаются формулировкой, а не механизмом. Услуги претендуют на услуги и клинику, где вариант клиники переименовывает интерфейс в записи, пациентов и курсы лечения, не разветвляя код. Розница претендует на розницу.
Поскольку это модули, а не ветвления внутри одного огромного экрана, экран кухни и группы опций из модуля еды для отеля просто не существуют — не спрятаны за флагом, не отключены, а отсутствуют. Поверхность, которую видит заведение, — функция того, чем оно себя объявило.
Четыре устанавливаемых расширения, и они работают для любого типа
Поверх базовых модулей стоят семь расширений, применимые независимо от типа бизнеса. Права команды — самое интересное, потому что оно построено из остальных модулей: оно собирает редактор прав из возможностей, объявленных каждым установленным модулем, так что установка нового модуля добавляет его права в редактор без того, чтобы кто-то правил список. Те же возможности потом читает has_capability() в базе, о чём написано на странице безопасности.
Каналы оплаты добавляют плитку консоли для настройки принимаемых каналов и видимый клиенту список на публичной странице — одно расширение пишет на обе стороны через два слота объявлений. Абонементы и подписки вводят планы, которые клиент покупает прямо со страницы заведения. Напоминания о продлении берут на себя то, что следует за абонементом или курсом. Каждое из них — выпущенный собственный модуль, написанный по тому же контракту, которым пользовался бы сторонний разработчик: сознательная дисциплина, потому что контракт настоящий, только если его авторы тоже им ограничены.
Установка и удаление — на каждое заведение
Расширения ставятся из магазина плагинов внутри консоли владельца, и установка привязана к одному бизнесу. Владелец двух заведений может поставить абонементы в одно и не ставить в другое, и две панели будут по-настоящему разными.
Удаление стоит за подтверждением, и подтверждение говорит конкретную вещь: данные не удаляются. Это важнее, чем звучит. Люди колеблются над кнопкой удаления потому, что предполагают её разрушительность, — и оставляют установленными модули, которыми не пользуются, а консоль забивается плитками, которые никто не открывает. Именно рассказ о том, чего *не* произойдёт, делает кнопку пригодной. После удаления расширение не даёт ничего — ни плиток, ни прав в редакторе ролей, ни раздела на публичной странице, — но его записи переживут повторную установку.
Чем это пока не стало
Сторонние плагины закрыты. Магазин плагинов сам об этом пишет, а не намекает обратное пустой полкой «скоро». Сегодня существует модульная архитектура с настоящим контрактом, четыре базовых модуля и четыре собственных расширения, написанных по нему, — все загружаются через один и тот же путь регистрации. Приём сторонних заявлен как следующий шаг, а не как работающая площадка: нет ни портала разработчика, ни очереди проверки, ни опубликованного SDK.
Мы описываем это так, потому что интересна именно архитектура и она правдива сегодня, тогда как площадка — утверждение о будущем. Контракт проверяется так: модуль, написанный целиком по нему — плитки, возможности и раздел страницы, без единого касания к ядру, — должен вести себя как родная часть приложения. Четыре таких ведут. Открытие этого посторонним — задача политики и проверки в большей степени, чем техническая, и она не решена.
Почему модули, а не флаги функций
Флаг функции что-то выключает. Модуль что-то добавляет. Разница видна в редакторе прав: с флагами кто-то ведёт главный список всех возможностей и обязан не забыть его расширить. С контрактом расширение «права команды» спрашивает каждый установленный модуль, что он объявляет, и строит редактор из ответов, так что список не может устареть. Тот же приём работает для сетки панели и для публичной страницы — ни одно из них не перечисляет функции, все они спрашивают.
Это ещё и ограничивает цену новой отрасли. Добавить тип бизнеса, который Korat пока не обслуживает, — значит написать модуль: объявить типы, каталог, главное действие и те необязательные слоты, что нужны, — не трогая ни консоль, ни отрисовку страницы, ни систему прав. Именно это делает суперприложение управляемым, а не медленным накоплением частных случаев.
Площадки сторонних плагинов нет. Всё, что сегодня можно установить, — собственные расширения, и магазин говорит об этом в приложении. Приём сторонних заявлен как следующий шаг: портала разработчика и опубликованного SDK, по которому можно было бы писать, пока нет.
Код плагинов к тому же по-прежнему едет внутри APK, а не загружается по мере обращения к каждому. Это известное ограничение и очевидное условие для открытия магазина кому-либо вне проекта.
- Обязательные объявления
- идентификатор · типы бизнеса · название · заголовок каталога · главное действие · представление каталога
- Необязательные объявления
- возможности · плитки консоли · экран консоли · раздел клиентской страницы
- Базовые модули
- Еда · Жильё · Услуги · Розница
- Расширения
- Права команды · Каналы оплаты · Абонементы и подписки · Напоминания о продлении
- Область установки
- отдельное заведение
- Удаление
- за подтверждением, где сказано, что данные не удаляются
- Сторонние
- закрыты — только собственные расширения