Base de datos m77: colecciones, filtros y datos por usuario
Cada app de builder77 incluye una base de datos integrada. Así funcionan las colecciones, los filtros, la ordenación y los registros por usuario, y así se mantienen privados los datos privados.
La mayoría de las veces nunca tocarás la base de datos directamente: describes tu app y builder77 escribe el código que guarda y lee los datos. Pero saber cómo funciona te ayuda a escribir mejores prompts, depurar más rápido y tomar buenas decisiones sobre privacidad. Aquí tienes un recorrido por m77.db.
Colecciones y registros
Los datos viven en colecciones: grupos de registros con nombre, como tasks, bookings o posts. No hay que definir ningún esquema: una colección se crea la primera vez que escribes en ella, y cada registro es un objeto simple con los campos que le des.
const task = await m77.db.create('tasks', { title: 'Write launch post', done: false });
// -> { id, title, done, createdAt, updatedAt, ownerId }builder77 añade id, createdAt, updatedAt y ownerId automáticamente. ownerId toma el valor del usuario de la app que ha iniciado sesión, si lo hay, algo que será importante para los permisos más abajo.
Leer datos: list, get y 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 busca coincidencias exactas en los campos, lo que cubre la mayoría de necesidades de una app: filtros de estado, categorías, un ID padre para registros relacionados. Para buscar mientras se escribe en una lista no muy grande, lo habitual es cargar los registros y filtrar en el navegador.
Actualizar y eliminar
await m77.db.update('tasks', id, { done: true }); // shallow merge
await m77.db.remove('tasks', id);update fusiona los campos que pasas con el registro existente, así que solo tienes que enviar lo que ha cambiado.
Datos por usuario con mine: true
Para apps en las que cada persona tiene sus propios datos (diarios, presupuestos, seguimiento de hábitos), combina m77.auth con la opción mine. Cuando un usuario ha iniciado sesión, mine: true devuelve solo los registros que ha creado él.
await m77.auth.signIn({ email, password });
const myEntries = await m77.db.list('entries', { mine: true, sort: '-createdAt' });Hay una segunda capa de protección integrada: un registro creado por un usuario con sesión iniciada solo puede actualizarlo o eliminarlo ese mismo usuario. Aunque alguien prepare una petición a mano, la API rechaza los cambios en registros que no son suyos.
Datos públicos y privados: guía rápida
- Contenido público (cartas de restaurante, entradas de blog, catálogos de productos): no hace falta iniciar sesión para leerlo. Pide a builder77 que cree datos de ejemplo o que añada una pantalla de administración para gestionarlos, y edítalos cuando quieras en la pestaña Datos.
- Envíos (formularios de contacto, listas de espera, reservas): cualquiera puede crearlos; tú los lees en la pestaña Datos.
- Datos personales (notas, registros de salud, finanzas): exige inicio de sesión y consulta siempre con
mine: true.
Una regla práctica: todo lo que está en el código front-end de tu app es visible para los visitantes, y las listas sin mine: true las puede leer cualquiera que tenga el enlace de la app. Si los datos son personales, ponlos tras el inicio de sesión y mine. Si toda la app es solo para ti o tu equipo, activa App privada en Ajustes.
La pestaña Datos
En el editor, la pestaña Datos te permite explorar todas las colecciones, editar o eliminar registros, ver a los usuarios de tu app y revisar los archivos subidos. Es la forma más rápida de corregir una errata en el contenido, limpiar entradas de prueba o comprobar que un formulario guarda lo que esperas.
Los mismos datos desde Flutter y otros clientes
El SDK web es una capa fina sobre una API REST, que es también la que usan las exportaciones a Flutter. Eso significa que cualquier cliente puede leer y escribir en las mismas colecciones:
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)Los tokens de los usuarios de una app están limitados a un solo proyecto, así que un token de una app no sirve para otra. Las lecturas y escrituras en la base de datos no consumen créditos: crea una app con todos los datos que quieras.
Cómo pedir datos en tus prompts
Puedes dirigir todo esto con lenguaje normal: «guarda gastos con importe, categoría y fecha; cada usuario solo ve los suyos», o «añade un campo de estado a las reservas y un filtro para las pendientes». La IA conoce el SDK, así que describir el modelo de datos suele ser suficiente.