Я делаю API в Node и MongoDB.В настоящее время я использую Express и Mongoose.
Для пояснения давайте предположим, что это просто (но это не так) и состоит только из одной коллекции, называемой событиями и четырьмя пользовательскими ролями.:
events-manager
- создает и редактирует событие venue-manager
- утверждает события и размещает их в общедоступной части сайта guest
- посещает сайт объекта и следит за событиями site-admin
- выполняет все роли и решает все, что не так
Я хочу, чтобы каждое событие было в одном из трисостояния :
draft
(событие, которое готовится), public
- активное событие, видимое посетителям места cancelled
- событие, которое было отменено, но остается видимым для информирования общественности об отмене
Я ищу масштабируемый способ, структуру или дизайн API, чтобы решить эти проблемы:
1)Сообщите клиенту, какие переходы доступны, отфильтруйте документы в зависимости от наличияпереходы (например, показ событий для утверждения) и предотвращения недопустимых действий
Конечно, бизнес-логика никогда не бывает легкой, и вы не можете перейти из состояния draft
в состояние cancelled
из логики потока.Мне нужно сопровождать исходящие документы (в данном случае события) метаданными о возможных переходах.
Но это означало бы установить время логического дерева - для защиты маршрута для недопустимых переходов, для фильтрации документов с доступным переходом (например,события с доступным действием публикации должны иметь state:draft
) и помещать возможные переходы в документы, перечисленные в другом запросе.
2) Сообщите клиенту, какие конечные точки CRUD (и переходы) доступны пользователю благодаряКонтроль доступа на основе ролей и предотвращение доступа к запрещенным.
Наш пользователь должен знать, доступен ли какой-либо переход, хотя он или она не одобрен для такого перехода.Проверка этого аналогична предыдущему пункту, мне нужно будет охранять маршрут и проверять исходящие документы.
3) Держать бизнес-логику отделенной от клиента
Записывая логику дважды, один раз дляпредставление потока документов и один раз для проверки, если желаемые действия доступны для пользователя, могут вызвать ошибки.Клиент должен получить информацию о возможных следующих шагах с сервера (или возможность обнаружения HATEOAS API)
4) Повторно использовать код, сохранять код обслуживаемым другими
Для решения проблем 1-3,Я искал в интернете (и особенно в StackOverflow) взад и вперед, во время своих попыток я в основном пошел наполовину, написав свою собственную платформу, но другие после меня не поддержали бы ее, если бы я не предоставил подробную документацию и многолетнюю поддержку.
Я до сих пор не верю, что это не проблема, с которой сталкиваются другие разработчики, и проблема, которая не имеет простого решения.Надеюсь, что кто-то здесь есть один:)