as opções de segurança das coleções do wix conseguem restringir o acesso a algumas coleções dependendo do tipo de usuário logado. porém como restringir a leitura de dados a uma coleção dependendo do usuário logado?
Exemplo: o administrador do hospital registrou o prontuário médico do paciente A na coleção "prontuários". O paciente A quando se logar no site tem que ter acesso à coleção "prontuários", mas não pode ter acesso ao prontuário médico do paciente B, que também está na coleção "prontuários.
Isso poderia ser resolvido colocando o _id do membro (que vem do wix_users) na coleção "prontuários" e executar "query" na consulta "prontuários" tendo como parâmetro o _id. Porém além de deixar o id do usuário exposto ainda é necessário lidar com a natureza assincrona da web. quando vai fazer a "qurery" em "prontuários", a query em wix_users ainda não retornou e o registro do usuário B aparece na consulta do usuário A.
Como solucionar isso?
Tentei usar consultas assincronas mas mesmo assim o prolema persiste.
No código abaixo, userEmail é um argumento de consulta na coleção "cadastroCliente", porém a consulta retorna vazia porque a função f_getEmail demora para retornar o email do usuário cadastrado.
anexo código demonstrando o problema
import wixData from 'wix-data';
import wixUsers from 'wix-users';
//console.log("start");
let user = wixUsers.currentUser;
let isLoggedIn = user.loggedIn; // true
let userEmail = "";
async function f_wait() {
return new Promise(resolve => {
setTimeout(() => {
resolve('resolved');
}, 2000);
})
}
async function asyncCall() {
console.log('calling');
const result = await f_wait();
console.log(result);
// expected output: 'resolved'
}
function f_getEmail() {
console.log("f_getEmail: entrou na funcao");
user.getEmail()
.then((email) => {
console.log("f_getEmail: vai retornar");
return email;
});
}
$w.onReady(function () {
//$w('#button2').disable();
if (isLoggedIn) {
userEmail = f_getEmail();
$w('#emailCad').text = userEmail;
asyncCall()
console.log("Body: vai executar a query")
wixData.query("cadastroCliente")
.eq("title", userEmail)
.descending("dataAutoriz")
.limit(1)
.find()
.then((results) => {
console.log(results.items);
let items = results.items;
if (results.totalCount === 0) {
console.log("no data found");
$w('#txtStatAtu').text = "PENDENTE";
if ($w('#datePicker1').isVisible) {
$w('#datePicker1').hide();
$w('#textEm').hide();
}
$w('#button2').label = "AUTORIZAR";
$w('#stAtu').checked = true;
} else {
$w('#datePicker1').value = items[0].dataAutoriz;
if (items[0].stColeta) {
$w('#txtStatAtu').text = "AUTORIZADO";
$w('#button2').label = "DESAUTORIZAR";
$w('#stAtu').checked = false;
} else {
$w('#txtStatAtu').text = "NÃO AUTORIZADO";
$w('#button2').label = "AUTORIZAR";
$w('#stAtu').checked = true;
}
}
});
}
});
eu consegui fazer o que queria, na coleção exibir a coluna"owner". no data set filtrar o campo owner por "user logged in"