У меня есть два триггера функции firebase:
- пользователь onUpdate
- владелец onUpdate
Когда запускается владелец onUpdate, он выполняет операцию и обновляет документ пользователя.
Пользователь onUpdate вызывается последней операцией, а не клиентом.
Есть ли способ запретить администратору или серверу вызывать функцию?
Я ищу в Документацию Firebase и обнаруживаю, что если я использую:
console.log(context.auth.uid);
будет отображаться идентификатор пользователя, который вносит изменения, но я получил эту ошибку:
Cannot read property 'uid' of undefined
Итак, я попытался напечатать контекстный объект, и вот результат:
context : { eventId: '7eac4df1-85bd-47dd-b83a-827b63597e10-0',
eventType: 'google.firestore.document.update',
notSupported: {},
params:
{ serviceId: 'bY0RjOSgygnXuojmDyng',
userId: 'Poz0UKIShnSUJNPCrug3zvfiyKn1' },
resource:
{ service: 'firestore.googleapis.com',
name: 'projects/*Project name*/databases/(default)/documents/users/Poz0UKIShnSUJNPCrug3zvfiyKn1/services/bY0RjOSgygnXuojmDyng' },
timestamp: '2019-06-14T06:33:48.525983Z' }
Итак, мой ответ: есть ли функция, которая возвращает true / false, если сделан вызов с сервера или клиентского приложения?
Я использую Google Auth, и когда я вызываю функцию, я аутентифицируюсь
EDIT
UserCode Android
Пользователь удаляет заказ. (Для политики GDPR я не могу удалить его, но мне нужно сделать его невидимым с отмененным атрибутом)
FirebaseFirestore db = FirebaseFirestore.getInstance();
db.collection("users").document(User.getUserId())
.collection("orders").document(orderId)
.update("canceled", true);
Функция UserCode Firebase
exports.updateLocalOrder = functions.firestore
.document('users/{userId}/orders/{orderId}')
.onUpdate((change, context) => {
const order = change.after.data();
const orderId = ontext.params.orderId;
const ownerId = order.ownerId;
if (order.canceled){
admin.firestore().collection("owners")
.doc(ownerId).collection("orders")
.doc(orderId).update("canceled", true);
}
...
});
OwnerCode Android
Владелец удалил заказ. (Для политики GDPR я не могу удалить его, но мне нужно сделать его невидимым с отмененным атрибутом)
FirebaseFirestore db = FirebaseFirestore.getInstance();
db.collection("owners").document(Owner.getOwnerId())
.collection("orders").document(orderId)
.update("canceled", true);
Функция OwnerCode Firebase
exports.updateUserOrder = functions.firestore
.document('owners/{ownerId}/orders/{orderId}')
.onUpdate((change, context) => {
const order = change.after.data();
const orderId = ontext.params.orderId;
const userId = order.userId;
if (order.canceled){
admin.firestore().collection("users")
.doc(userId).collection("orders")
.doc(orderId).update("canceled", true);
}
...
});
Так что каждый раз, когда я удаляю заказ, будет происходить вызов функций из клиента (приложение для Android), а после этого будет бесконечный вызов с сервера.
ВАЖНО !!!
Я не хочу делать еще одну коллекцию под названием "заказы". Таким образом, проблема не в том, как я могу управлять своими приложениями или как я могу управлять заказами между пользователем и владельцем, потому что мне нужно только знать, как я могу различать звонки.