2016-08-31 2 views
0

Привет Я использую CouchDB и предполагаю, что у меня есть документ articles с полем users, содержащий массив идентификаторов пользователей, которым разрешено просматривать эту статью.Pagination с правами доступа на строку

Пример сценария, будет отображаться в виде таблицы с разбивкой по страницам, показывающим 10 статей на странице, мой контроллер будет извлекать первые 10 статей из CouchDB, а затем проверять права доступа по одному в возвращаемых статьях. Но у текущего пользователя могут быть только права доступа на просмотр, скажем, 8 из них, поэтому в таблице будут показаны только 8 статей вместо 10.

Какова наилучшая практика обработки такой ситуации, помимо реализации логики прав доступа на слой CouchDB?

ответ

0

Для достижения этой цели, я бы просто использовать представление заклиненного на users поля:

function (doc) { 
    doc.users.forEach(function (user) { 
    emit([ user ]); 
    }); 
} 

Я излучаемый массив только один пункт в этом случае. Я предполагаю, что вы также выпустили бы что-то вроде doc.created, чтобы отсортировать ваши статьи, просто добавьте их после user в этом массиве.

Результаты вид будет выглядеть примерно так:

{ 
    "rows": [ 
    { "id": "<article-1>", "key": [ "<user-1>", "<created>" ] }, 
    { "id": "<article-2>", "key": [ "<user-1>", "<created>" ] }, 
    { "id": "<article-3>", "key": [ "<user-1>", "<created>" ] }, 
    { "id": "<article-1>", "key": [ "<user-2>", "<created>" ] }, 
    { "id": "<article-1>", "key": [ "<user-3>", "<created>" ] } 
    ] 
} 

Вы можете просто постраничной, как вы это обычно с CouchDB. Вы просто используете start_key=["<user-1>"]&end_key=["<user-1>","\ufff0"] в дополнение к обычным подкачкам limit=10&skip=0 для стр. 1, limit=10&skip=10 на стр. 2 и т. Д.

Смежные вопросы