У нас есть RESTful API с кнопками / devices и /, тогда как у одного устройства может быть от 0 до ca. 1000 кнопок. Поэтому запрос GET / devices / {deviceId} / buttons реализует разбиение на страницы (с startIndex и limit). Каждая кнопка имеет свойство sortSequence, которое является числом. Кнопки должны быть отсортированы на основе этого свойства (нет никакого отношения к буквенному имени или чему-либо еще, кнопки упорядочены на основе пожеланий конечного пользователя с помощью перетаскивания в списке).
Вопрос в том,как вы справляетесь с модификацией sortSequence? Теперь у нас это есть в PUT / devices / {deviceId} / buttons / {buttonId} Payload: [... и новая последовательность]. Но как насчет других кнопок? Например, если у нас есть четыре кнопки с последовательностями 1, 2, 3, 4 и пользователь перетаскивает последнюю кнопку на первую позицию, происходит не одно изменение, а несколько: 4-> 1, 1-> 2, 2-> 3, 3-> 4.
Кто несет ответственность за последующие изменения, клиент или сервер?
Если клиент, то:
- Через одно перетаскивание, клиент должен отправить, возможно, сотни REST-вызовов, чтобы изменить последовательность всех кнопок между
- Поскольку существует пейджинг, клиент не может создать новую кнопку без запроса всехиз них, поскольку ему необходимо знать наивысшую последовательность
Если сервер, то:
- PUT для одного ресурса (кнопки) обновляет группу других кнопок, которыеЯ считаю нарушением принципов REST. Кроме того, он запускает несколько событий обновления веб-сокетов для каждой кнопки, что замедляет работу пользовательского интерфейса.
- Если запросы кнопок создания / изменения / удаления приходят быстро, а последовательности где-то посередине изменяются, сервер долженвстречаются исключения параллелизма, когда несколько потоков параллельных запросов будут пытаться обновить одни и те же объекты, возможно, до разных значений
И, конечно, кто бы это ни делал, если кнопка создается почти одновременно из двухклиенты, последовательность может дублировать себя.
Оба подхода кажутся довольно плохими и проблемными. Итак, есть ли общепринятая лучшая практика обработки таких изменений?
Инфраструктура: главный сервер .net, signalR, клиенты web / iOS / Android, ms sql db