Измените репликацию CouchDB, чтобы автоматически помечать документы как удаленные

#proxy #permissions #couchdb #replication #pouchdb

Вопрос:

Мы используем базу данных CouchDB, которая реплицируется с помощью базы данных PouchDB на клиентской/локальной стороне с использованием протокола репликации.

Теперь мы добавили третью (прокси-)службу между этими двумя базами данных, которая также реализует протокол репликации. Локальная база данных PouchDB синхронизируется с этой прокси-службой, и служба пересылает запросы в базу данных CouchDB и фильтрует результаты. Это используется для обеспечения соблюдения разрешений, поэтому, если у пользователя нет разрешений для документа X, база данных PouchDB этого пользователя никогда не получит документ X, поскольку он отфильтрован в прокси-службе. Результат можно найти здесь, и он отлично работает до тех пор, пока разрешения пользователя не изменятся.

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

Чего мы достигли до сих пор? используя (и злоупотребляя) протоколом репликации, мы добились следующего: После изменения разрешений мы удаляем все записи _local базы данных, в которых хранится информация о каждом состоянии синхронизации клиентов. Это приводит к тому, что каждый клиент перезапускает синхронизацию. Во время синхронизации для всех документов, для которых у пользователя нет разрешений, мы вручную добавляем новый специальный номер редакции ( <x>-deleted ) в ленту изменений. Это заставляет клиента запросить этот документ, а затем мы можем ответить _deleted свойством, которое заставляет клиента удалить этот документ локально. Это работает нормально, и как только пользователь теряет разрешения для некоторых документов, они автоматически удаляются. Проблема в том, что как только пользователь восстанавливает разрешения, этот документ остается удаленным, потому что клиенты считают, что у него более поздняя версия (удаленная), чем та, которая находится в удаленной базе данных CouchDB (неизмененная/существующая).

Некоторые требования к нашему решению:

  1. Это не должно требовать какого-либо кода на стороне клиента (только в прокси-сервисе). Мы хотим, чтобы эта прокси-служба заботилась обо всем, что касается синхронизации и разрешений пользователей.
  2. Это не должно требовать передачи всех документов при изменении разрешений. Это было бы неэффективно для баз данных с большим количеством документов.

Как вы думаете, можно ли добиться такого автоматического удаления и повторной синхронизации документов, изменив только запросы, используемые протоколом репликации, и если да, то как этого можно достичь?