Мне было интересно, как построить систему, в которой пользователи могут отправлять сообщения другим пользователям. Конечно, каждый должен иметь доступ только к своему почтовому ящику, поэтому для этого нам нужна индивидуальная инфраструктура базы данных. Следуя примеру из http://guide.couchdb.org/draft/notifications.html , мы видим, что пользователи могут просто помещать сообщения в базу данных получателя. Просто и эффективно.
Но что, если мы не хотим, чтобы пользователи знали имя базы данных получателей? Что, если нам нужна система, которая будет разрешать базу данных получателя, просматривая поле от до в документе сообщения (которое может быть именем пользователя, совершенно не связанным с его именем в базе данных):
{
"to": "john.kowalski",
"from": "jake.podolski",
"subject": "hi",
"message": "..."
}
Похоже как идеальная задача для дополнительного уровня, но тогда это будет неинтересно и не стоит вопросов, поэтому мы попробуем решить ее с помощью репликации:
Однако это создает проблему, потому что основная база данных должна быть видна всем пользователям! Итак ... что, если бы мы могли добавить также пользовательскую-> основную задачу репликации, чтобы сообщения брались из пользовательской базы данных, передаваемой в основную базу данных, а затем помещались в базу данных получателей (о боже, это становится сложным, мы можем уже зря тратить время, пытаясь решить эту проблему таким образом, но давайте попробуем).
Здесь есть проблема на третьем шаге (без этого шага пользователи могли бы отправлять сообщения, выдавая себя за других пользователей, заполнив ложную информацию в из поля ) - как мы можем передать дополнительные данные в функции проверки, единственными параметрами, насколько я знаю, являются:
Обнаружив функциональные возможности базы данных репликатора, представленные в 1.1.0, мы могли передать контекст user_ctx задаче репликации. Возможно ли, чтобы этот объект содержал пользовательские данные, а не настоящую информацию о пользователе? Как это повлияет на стандартный способ, которым CouchDB обрабатывает доступ к базе данных?
Если бы это было возможно, в задаче репликации имя получателя было бы просто заполнено как параметр в user_ctx, тогда функция проверки будет использовать это значение для сравнения с из поле. У пользователя не будет возможности «отправить» сообщение от имени кого-то другого, кроме него.