Перекрестные ссылки на документы CouchDB ACL - PullRequest
3 голосов
/ 18 июля 2011

Допустим, у меня есть два типа документов, один из которых ссылается на другой, например, «orders» и «order_replies», последний из которых имеет поле «ref», которое содержит идентификатор документа заказа.

Для моей функции validate_doc_update я хочу, чтобы пользователь мог изменять документ order_reply только в том случае, если он является автором исходного заказа.

Как я могу получить поле "автор" из заказа с идентификатором newDoc.ref внутри функции?

Вот часть моей функции проверки:

if(userCtx.roles.indexOf('employee') >= 0) {
  // [...] other doc types
  if (newDoc.type == 'order_reply') {
    //newDoc.ref.author is not the proper approach
    require((userCtx.name == newDoc.ref.author), "this is not your order reply!");
  }
}

1 Ответ

2 голосов
/ 22 июля 2011

Поместите идентификатор автора в идентификатор заказа.Например:

  • Заказ: { "_id": "order/jack/1", ... }
  • Ответ заказа: { "ref": "order/jack/1", ... }

Так что вы можете проверить с помощью:

if (userCtx.roles.indexOf('employee') !== -1) {
  if (newDoc.type === 'order_reply') {
    require(userCtx.name === newDoc.ref.split('/', 3)[1], "this is not your order reply!");
  }
}

Если у вас несколько авторов, используйте "order/author1/author2/.../authorN/ordernum" как _id заказа и проверьте с помощью:

var parts = newDoc.ref.split('/'),
    authors = parts.slice(1, -1);
require(authors.indexOf(userCtx.name) !== -1, "this is not your order reply!");

ОБНОВЛЕНИЕ: Из-за ошибки COUCHDB-1229 , использование "/" в doc._id может вызвать проблемы.В зависимости от вашего варианта использования может быть лучше использовать другой разделитель, например, ":".

...