Estoy tratando de proteger mis Documentos con un estado de availability , que puede ser public o private . Todo el mundo puede leer Documentos public y los Documentos private pueden ser leídos por los Usuarios que han creado el Documento (lo que significa que creatorUid se establece en el UID del usuario).
Estas son mis reglas:
match /Routines/{document} { allow read: if resource.data.availability == "public" || (resource.data.availability == "private" && resource.data.creatorUid == request.auth.uid); allow write: if true; }He creado algunas pruebas para ver si mis reglas funcionan:
describe.only("Routine Routine Rules", () => { const userAuthA = { uid: "user123", email: "userA@test.com" }; const demoRoutinePrivate = { id: "DemoRoutine", title: "Demo Routine", availability: "private", creatorUid: userAuthA.uid, exercises: [] } it("Authors can read private routines", async () => { const admin = getAdminFirestore(); await admin.collection("Routines").doc(demoRoutinePrivate.id).set(demoRoutinePrivate); const db1 = getAuthedFirestore(userAuthA); const routines1 = db1.collection("Routines").where("creatorUid", "==", userAuthA.uid); const routine1 = db1.collection("Routines").doc(demoRoutinePrivate.id); await firebase.assertSucceeds(routines1.get()); await firebase.assertSucceeds(routine1.get()); }); });Sin embargo, me sale este error:
FirebaseError: Property availability is undefined on object. for 'list' @ L33 Estoy bastante seguro de que mi documento tiene establecida la propiedad de availabilty , por lo que no entiendo el error.
Me lo imaginé. Tuve un error en mi consulta.
const routines1 = db1.collection("Routines").where("creatorUid", "==", userAuthA.uid);la consulta correcta es:
const routines1 = db1.collection("Routines").where("availability", "==", "private").where("creatorUid", "==", userAuthA.uid);aunque el mensaje de error original no es muy útil...