Base de dados m77: coleções, filtros e dados por utilizador
Todas as apps do builder77 incluem uma base de dados integrada. Veja como funcionam as coleções, os filtros, a ordenação e os registos por utilizador — e como manter privados os dados privados.
Na maior parte das vezes nunca vai mexer diretamente na base de dados — descreve a sua app e o builder77 escreve o código que guarda e lê os dados. Mas saber como funciona ajuda a escrever melhores prompts, a depurar mais depressa e a tomar boas decisões sobre privacidade. Eis uma visita guiada a m77.db.
Coleções e registos
Os dados vivem em coleções — grupos de registos com nome, como tasks, bookings ou posts. Não há esquema para definir: uma coleção é criada na primeira vez que escreve nela, e cada registo é um objeto simples com os campos que lhe der.
const task = await m77.db.create('tasks', { title: 'Write launch post', done: false });
// -> { id, title, done, createdAt, updatedAt, ownerId }O builder77 adiciona id, createdAt, updatedAt e ownerId automaticamente. ownerId fica com o utilizador da app que tem sessão iniciada, quando existe, o que se torna importante para as permissões mais abaixo.
Ler dados: list, get e count
const open = await m77.db.list('tasks', {
where: { done: false }, // exact-match filter
sort: '-createdAt', // '-' = descending
limit: 50 // up to 500
});
const one = await m77.db.get('tasks', id); // record or null
const doneCount = await m77.db.count('tasks', { where: { done: true } });where compara os campos de forma exata, o que cobre a maioria das necessidades de uma app: filtros de estado, categorias, um ID pai para registos relacionados. Para pesquisar enquanto se escreve numa lista de tamanho moderado, o habitual é carregar os registos e filtrar no browser.
Atualizar e eliminar
await m77.db.update('tasks', id, { done: true }); // shallow merge
await m77.db.remove('tasks', id);update junta os campos que passar ao registo existente, por isso só precisa de enviar o que mudou.
Dados por utilizador com mine: true
Para apps em que cada pessoa tem os seus próprios dados — diários, orçamentos, registos de hábitos — combine m77.auth com a opção mine. Quando um utilizador tem sessão iniciada, mine: true devolve apenas os registos que ele criou.
await m77.auth.signIn({ email, password });
const myEntries = await m77.db.list('entries', { mine: true, sort: '-createdAt' });Há uma segunda camada de proteção incorporada: um registo criado por um utilizador com sessão iniciada só pode ser atualizado ou eliminado por esse mesmo utilizador. Mesmo que alguém construa um pedido à mão, a API rejeita alterações a registos que não lhe pertencem.
Dados públicos vs. privados: guia rápido
- Conteúdo público (ementas, artigos de blog, listas de produtos): não é preciso login para ler. Peça ao builder77 que crie dados de exemplo ou adicione um ecrã de administração para os gerir, e edite-os quando quiser no separador Dados.
- Submissões (formulários de contacto, listas de espera, marcações): qualquer pessoa as pode criar; o utilizador lê-as no separador Dados.
- Dados pessoais (notas, registos de saúde, finanças): exija login e consulte sempre com
mine: true.
Uma regra prática: tudo o que está no código front-end da sua app é visível para os visitantes, e as listas sem mine: true podem ser lidas por qualquer pessoa que tenha o link da app. Se os dados forem pessoais, coloque-os atrás do login e de mine. Se a app inteira for só para si ou para a sua equipa, ative App privada nas Definições.
O separador Dados
No editor, o separador Dados permite percorrer todas as coleções, editar ou eliminar registos, ver os utilizadores da sua app e rever os ficheiros carregados. É a forma mais rápida de corrigir uma gralha num conteúdo, limpar registos de teste ou confirmar que um formulário está a guardar o que espera.
Os mesmos dados a partir do Flutter e de outros clientes
O SDK web é uma camada fina sobre uma API REST, que é também a usada pelas exportações Flutter. Isso significa que qualquer cliente pode ler e escrever nas mesmas coleções:
GET /api/runtime/<projectId>/db/tasks?where={"done":false}&sort=-createdAt&limit=100
POST /api/runtime/<projectId>/db/tasks { "data": { "title": "Hi" } }
Authorization: Bearer <appUserToken> (optional, from /auth/signin)Os tokens dos utilizadores da app estão limitados a um único projeto, por isso um token de uma app não pode ser usado noutra. As leituras e escritas na base de dados não gastam créditos — crie uma app tão rica em dados quanto quiser.
Pedir dados nos seus prompts
Pode orientar tudo isto em linguagem simples: «guarda despesas com valor, categoria e data; cada utilizador só vê as suas», ou «adiciona um campo de estado às marcações e um filtro para as pendentes». A IA conhece o SDK, por isso descrever o modelo de dados costuma bastar.